/*
* 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 .
*/
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 skinOverrideCache = new HashMap<>();
private final HashMap 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 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;
}
}