2023-10-28 18:33:26 +02:00
|
|
|
package net.anvilcraft.anvillib.cosmetics;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
|
|
|
import java.util.UUID;
|
2023-11-19 15:44:13 +01:00
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
|
|
import net.minecraft.util.Identifier;
|
|
|
|
import software.bernie.geckolib3.file.AnimationFile;
|
|
|
|
import software.bernie.geckolib3.geo.render.built.GeoModel;
|
2023-10-28 18:33:26 +02:00
|
|
|
|
|
|
|
public class CosmeticsManager {
|
|
|
|
private static List<ICosmeticProvider> providers = new ArrayList<>();
|
|
|
|
private static Map<UUID, List<ICosmetic>> cosmeticCache = new HashMap<>();
|
2023-11-20 20:48:07 +01:00
|
|
|
private static Map<UUID, Identifier> capeCache = new HashMap<>();
|
2023-10-28 18:33:26 +02:00
|
|
|
private static Set<UUID> activePlayers = new HashSet<>();
|
2023-11-19 15:44:13 +01:00
|
|
|
private static Map<Identifier, GeoModel> cachedModels = new ConcurrentHashMap<>();
|
2023-11-24 18:52:05 +01:00
|
|
|
private static Map<Identifier, AnimationFile> cachedAnimations
|
|
|
|
= new ConcurrentHashMap<>();
|
2023-10-28 18:33:26 +02:00
|
|
|
|
|
|
|
private static void refresh() {
|
|
|
|
boolean doRefresh = false;
|
|
|
|
for (ICosmeticProvider provider : providers) {
|
|
|
|
doRefresh = doRefresh || provider.requestsRefresh();
|
|
|
|
}
|
|
|
|
if (!doRefresh)
|
|
|
|
return;
|
|
|
|
cosmeticCache.clear();
|
|
|
|
for (UUID uuid : activePlayers) {
|
|
|
|
loadPlayer(uuid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void loadPlayer(UUID player) {
|
|
|
|
if (cosmeticCache.containsKey(player))
|
|
|
|
return;
|
|
|
|
cosmeticCache.put(player, new ArrayList<>());
|
|
|
|
List<ICosmetic> cosmetics = cosmeticCache.get(player);
|
|
|
|
for (ICosmeticProvider provider : providers) {
|
|
|
|
provider.addCosmetics(player, (cosmetic) -> cosmetics.add(cosmetic));
|
2023-11-20 20:48:07 +01:00
|
|
|
if (!capeCache.containsKey(player)) {
|
|
|
|
Identifier cape = provider.getCape(player);
|
2023-11-24 18:52:05 +01:00
|
|
|
if (cape != null)
|
|
|
|
capeCache.put(player, cape);
|
2023-11-20 20:48:07 +01:00
|
|
|
}
|
2023-10-28 18:33:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void registerProvider(ICosmeticProvider provider) {
|
|
|
|
providers.add(provider);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected static List<ICosmetic> getCosmeticsForPlayer(UUID uuid) {
|
|
|
|
if (!activePlayers.contains(uuid)) {
|
|
|
|
activePlayers.add(uuid);
|
|
|
|
loadPlayer(uuid);
|
|
|
|
}
|
|
|
|
refresh();
|
|
|
|
return cosmeticCache.get(uuid);
|
|
|
|
}
|
2023-11-19 15:44:13 +01:00
|
|
|
|
2023-11-20 20:48:07 +01:00
|
|
|
public static Identifier getCape(UUID player) {
|
|
|
|
loadPlayer(player);
|
|
|
|
return capeCache.getOrDefault(player, null);
|
|
|
|
}
|
|
|
|
|
2023-11-19 15:44:13 +01:00
|
|
|
protected static GeoModel getModel(Identifier id) {
|
|
|
|
return cachedModels.get(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected static AnimationFile getAnimations(Identifier id) {
|
|
|
|
return cachedAnimations.get(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void loadModel(Identifier id, GeoModel model) {
|
|
|
|
cachedModels.put(id, model);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void loadAnimations(Identifier id, AnimationFile animations) {
|
|
|
|
cachedAnimations.put(id, animations);
|
|
|
|
}
|
2023-10-28 18:33:26 +02:00
|
|
|
}
|