aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
blob: 19dca43946d5174be6f3da29b804bd47e81c4e90 (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
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;
    }

}