aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
blob: ad0dd66daa44a15e5deb569c38f6c86a4bb4fa96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
 * Copyright (C) 2022 NotEnoughUpdates contributors
 *
 * This file is part of NotEnoughUpdates.
 *
 * NotEnoughUpdates is free software: you can redistribute it
 * and/or modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation, either
 * version 3 of the License, or (at your option) any later version.
 *
 * NotEnoughUpdates is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
 */

package io.github.moulberry.notenoughupdates.miscfeatures;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.util.ResourceLocation;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class NPCRetexturing implements IResourceManagerReloadListener {
	private static final NPCRetexturing INSTANCE = new NPCRetexturing();

	private static final ResourceLocation npcRetexturingJson = new ResourceLocation(
		"notenoughupdates:npccustomtextures/config.json");

	private final Gson gson = new GsonBuilder().create();

	public static class Skin {
		public ResourceLocation skinLocation;
		public boolean skinny;

		public Skin(ResourceLocation skinLocation, boolean skinny) {
			this.skinLocation = skinLocation;
			this.skinny = skinny;
		}
	}

	private final HashMap<AbstractClientPlayer, Skin> skinOverrideCache = new HashMap<>();
	private final HashMap<String, Skin> skinMap = new HashMap<>();

	private boolean gettingSkin = false;

	public Skin getSkin(AbstractClientPlayer player) {
		if (gettingSkin) return null;

		if (player.getUniqueID().version() == 4 && !NotEnoughUpdates.INSTANCE.config.hidden.npcRetextureOnSelf) return null;

		if (skinOverrideCache.containsKey(player)) {
			return skinOverrideCache.get(player);
		}

		gettingSkin = true;
		ResourceLocation loc = player.getLocationSkin();
		gettingSkin = false;

		if (skinMap.containsKey(loc.getResourcePath()) && !NotEnoughUpdates.INSTANCE.config.misc.disableNPCRetexturing) {
			Skin skin = skinMap.get(loc.getResourcePath());
			skinOverrideCache.put(player, skin);
			return skin;
		}

		skinOverrideCache.put(player, null);
		return null;
	}

	public void tick() {
		skinOverrideCache.clear();
	}

	@Override
	public void onResourceManagerReload(IResourceManager resourceManager) {
		skinMap.clear();

		try (
			BufferedReader reader = new BufferedReader(new InputStreamReader(
				Minecraft.getMinecraft().getResourceManager().getResource(npcRetexturingJson).getInputStream(),
				StandardCharsets.UTF_8
			))
		) {
			JsonObject json = gson.fromJson(reader, JsonObject.class);

			if (json == null) return;

			for (Map.Entry<String, JsonElement> entry : json.entrySet()) {
				if (entry.getValue().isJsonObject()) {
					JsonObject val = entry.getValue().getAsJsonObject();

					Skin skin = new Skin(new ResourceLocation(val.get("skin").getAsString()), val.get("skinny").getAsBoolean());
					skinMap.put("skins/" + entry.getKey(), skin);
				}
			}
		} catch (Exception ignored) {
		}
	}

	public static NPCRetexturing getInstance() {
		return INSTANCE;
	}
}