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;
}
}
|