aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java')
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
new file mode 100644
index 00000000..465d3ea9
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
@@ -0,0 +1,99 @@
+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 net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.AbstractClientPlayer;
+import net.minecraft.client.renderer.block.model.ModelBlock;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.client.resources.IResourceManagerReloadListener;
+import net.minecraft.client.resources.model.ModelRotation;
+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 HashMap<AbstractClientPlayer, Skin> skinOverrideCache = new HashMap<>();
+ private HashMap<String, Skin> skinMap = new HashMap<>();
+
+ private boolean gettingSkin = false;
+
+ public Skin getSkin(AbstractClientPlayer player) {
+ if(gettingSkin) return null;
+
+ if(player.getUniqueID().version() == 4) return null;
+
+ if(skinOverrideCache.containsKey(player)) {
+ return skinOverrideCache.get(player);
+ }
+
+ gettingSkin = true;
+ ResourceLocation loc = player.getLocationSkin();
+ gettingSkin = false;
+
+ if(skinMap.containsKey(loc.getResourcePath())) {
+ 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 e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ public static NPCRetexturing getInstance() {
+ return INSTANCE;
+ }
+
+}