Files
CustomNPC-Plus/src/main/java/noppes/npcs/controllers/AnimationController.java
T

329 lines
11 KiB
Java
Raw Normal View History

2023-01-25 23:18:27 -06:00
package noppes.npcs.controllers;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
2023-01-25 23:18:27 -06:00
import noppes.npcs.CustomNpcs;
import noppes.npcs.LogWriter;
import noppes.npcs.api.handler.IAnimationHandler;
2023-01-25 23:18:27 -06:00
import noppes.npcs.api.handler.data.IAnimation;
import noppes.npcs.controllers.data.Animation;
import noppes.npcs.util.NBTJsonUtil;
2025-07-23 14:22:52 -04:00
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
2024-02-15 17:54:28 -05:00
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;
2023-01-25 23:18:27 -06:00
public class AnimationController implements IAnimationHandler {
public HashMap<Integer, Animation> animations;
private HashMap<Integer, String> bootOrder;
2023-06-05 22:12:48 -04:00
public static AnimationController Instance;
private int lastUsedID = 0;
2023-01-25 23:18:27 -06:00
public AnimationController() {
2023-06-05 22:12:48 -04:00
Instance = this;
bootOrder = new HashMap<>();
animations = new HashMap<>();
2023-01-25 23:18:27 -06:00
load();
}
2025-03-12 20:12:01 -04:00
public static AnimationController getInstance() {
2023-06-05 22:12:48 -04:00
return Instance;
2023-03-21 19:34:24 -04:00
}
2025-03-12 20:12:01 -04:00
public void load() {
2024-04-20 22:06:06 -04:00
bootOrder = new HashMap<>();
animations = new HashMap<>();
2023-01-25 23:18:27 -06:00
LogWriter.info("Loading animations...");
readAnimationMap();
2023-01-25 23:18:27 -06:00
loadAnimations();
LogWriter.info("Done loading animations.");
}
2025-03-12 20:12:01 -04:00
private void loadAnimations() {
2023-01-25 23:18:27 -06:00
animations.clear();
File dir = getDir();
if (!dir.exists()) {
dir.mkdir();
} else {
for (File file : dir.listFiles()) {
if (!file.isFile() || !file.getName().endsWith(".json"))
continue;
try {
Animation animation = new Animation();
animation.readFromNBT(NBTJsonUtil.LoadFile(file));
animation.name = file.getName().substring(0, file.getName().length() - 5);
2025-03-12 20:12:01 -04:00
if (animation.id == -1) {
animation.id = getUnusedId();
}
int originalID = animation.id;
int setID = animation.id;
2025-03-12 20:12:01 -04:00
while (bootOrder.containsKey(setID) || animations.containsKey(setID)) {
if (bootOrder.containsKey(setID))
if (bootOrder.get(setID).equals(animation.name))
break;
setID++;
}
animation.id = setID;
2025-03-12 20:12:01 -04:00
if (originalID != setID) {
LogWriter.info("Found Animation ID Mismatch: " + animation.name + ", New ID: " + setID);
animation.save();
}
animations.put(animation.id, animation);
2025-03-12 20:12:01 -04:00
} catch (Exception e) {
2023-01-25 23:18:27 -06:00
LogWriter.error("Error loading: " + file.getAbsolutePath(), e);
}
}
}
saveAnimationMap();
2023-01-25 23:18:27 -06:00
}
private File getDir() {
return new File(CustomNpcs.getWorldSaveDirectory(), "animations");
2023-01-25 23:18:27 -06:00
}
2025-03-12 20:12:01 -04:00
public int getUnusedId() {
if (lastUsedID == 0) {
for (int catid : animations.keySet()) {
if (catid > lastUsedID)
lastUsedID = catid;
}
}
lastUsedID++;
return lastUsedID;
}
2025-03-12 20:12:01 -04:00
public IAnimation saveAnimation(IAnimation animation) {
if (animation.getID() < 0) {
animation.setID(getUnusedId());
2025-03-12 20:12:01 -04:00
while (hasName(animation.getName()))
animation.setName(animation.getName() + "_");
2025-03-12 20:12:01 -04:00
} else {
Animation existing = animations.get(animation.getID());
2025-03-12 20:12:01 -04:00
if (existing != null && !existing.name.equals(animation.getName()))
while (hasName(animation.getName()))
animation.setName(animation.getName() + "_");
}
animations.remove(animation.getID());
animations.put(animation.getID(), (Animation) animation);
2023-01-25 23:18:27 -06:00
saveAnimationMap();
// Save Animation File
2023-01-25 23:18:27 -06:00
File dir = this.getDir();
2025-03-12 20:12:01 -04:00
if (!dir.exists())
2023-01-25 23:18:27 -06:00
dir.mkdirs();
File file = new File(dir, animation.getName() + ".json_new");
2025-03-12 20:12:01 -04:00
File file2 = new File(dir, animation.getName() + ".json");
2023-01-25 23:18:27 -06:00
try {
2025-03-12 20:12:01 -04:00
NBTJsonUtil.SaveFile(file, ((Animation) animation).writeToNBT());
if (file2.exists())
2023-01-25 23:18:27 -06:00
file2.delete();
file.renameTo(file2);
} catch (Exception e) {
LogWriter.except(e);
}
return animations.get(animation.getID());
}
public boolean hasName(String newName) {
2025-03-12 20:12:01 -04:00
if (newName.trim().isEmpty())
return true;
2025-03-12 20:12:01 -04:00
for (Animation animation : animations.values())
if (animation.name.equals(newName))
return true;
return false;
2023-01-25 23:18:27 -06:00
}
public void delete(String name) {
2025-03-12 20:12:01 -04:00
Animation delete = getAnimationFromName(name);
if (delete != null) {
Animation foundAnimation = this.animations.remove(delete.getID());
2025-03-12 20:12:01 -04:00
if (foundAnimation != null && foundAnimation.name != null) {
File dir = this.getDir();
for (File file : dir.listFiles()) {
if (!file.isFile() || !file.getName().endsWith(".json"))
continue;
2025-03-12 20:12:01 -04:00
if (file.getName().equals(foundAnimation.name + ".json")) {
file.delete();
break;
}
}
saveAnimationMap();
}
}
}
public void delete(int id) {
2025-03-12 20:12:01 -04:00
if (!this.animations.containsKey(id))
2023-01-25 23:18:27 -06:00
return;
Animation foundAnimation = this.animations.remove(id);
2025-03-12 20:12:01 -04:00
if (foundAnimation != null && foundAnimation.name != null) {
File dir = this.getDir();
for (File file : dir.listFiles()) {
if (!file.isFile() || !file.getName().endsWith(".json"))
continue;
2025-03-12 20:12:01 -04:00
if (file.getName().equals(foundAnimation.name + ".json")) {
file.delete();
break;
}
2023-01-25 23:18:27 -06:00
}
saveAnimationMap();
2023-01-25 23:18:27 -06:00
}
}
2023-01-28 01:19:57 -06:00
public boolean has(String name) {
return getAnimationFromName(name) != null;
2023-01-28 01:19:57 -06:00
}
public IAnimation get(String name) {
return getAnimationFromName(name);
}
public IAnimation get(int id) {
return this.animations.get(id);
2023-01-25 23:18:27 -06:00
}
public IAnimation[] getAnimations() {
ArrayList<IAnimation> animations = new ArrayList<>(this.animations.values());
return animations.toArray(new IAnimation[0]);
2023-01-25 23:18:27 -06:00
}
2023-03-21 19:34:24 -04:00
2025-03-12 20:12:01 -04:00
public Animation getAnimationFromName(String animation) {
for (Map.Entry<Integer, Animation> entryAnimation : AnimationController.getInstance().animations.entrySet()) {
if (entryAnimation.getValue().name.equalsIgnoreCase(animation)) {
2023-03-21 19:34:24 -04:00
return entryAnimation.getValue();
}
}
return null;
}
public String[] getNames() {
String[] names = new String[animations.size()];
int i = 0;
2025-03-12 20:12:01 -04:00
for (Animation animation : animations.values()) {
2023-03-21 19:34:24 -04:00
names[i] = animation.name.toLowerCase();
i++;
}
return names;
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// ANIMATION MAP
2025-03-12 20:12:01 -04:00
public File getMapDir() {
File dir = CustomNpcs.getWorldSaveDirectory();
2025-03-12 20:12:01 -04:00
if (!dir.exists())
dir.mkdir();
return dir;
}
2025-03-12 20:12:01 -04:00
public void readAnimationMap() {
bootOrder.clear();
try {
File file = new File(getMapDir(), "animations.dat");
2025-03-12 20:12:01 -04:00
if (file.exists()) {
loadAnimationMapFile(file);
}
} catch (Exception e) {
try {
File file = new File(getMapDir(), "animations.dat_old");
2025-03-12 20:12:01 -04:00
if (file.exists()) {
loadAnimationMapFile(file);
}
2025-03-12 20:12:01 -04:00
} catch (Exception ignored) {
}
}
}
2025-03-12 20:12:01 -04:00
public NBTTagCompound writeMapNBT() {
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList animationList = new NBTTagList();
2025-03-12 20:12:01 -04:00
for (Integer key : animations.keySet()) {
Animation animation = animations.get(key);
2025-03-12 20:12:01 -04:00
if (!animation.getName().isEmpty()) {
NBTTagCompound animationCompound = new NBTTagCompound();
animationCompound.setString("Name", animation.getName());
animationCompound.setInteger("ID", key);
animationList.appendTag(animationCompound);
}
}
nbt.setTag("Animations", animationList);
return nbt;
}
2025-03-12 20:12:01 -04:00
public void readMapNBT(NBTTagCompound compound) {
NBTTagList list = compound.getTagList("Animations", 10);
2025-03-12 20:12:01 -04:00
if (list != null) {
for (int i = 0; i < list.tagCount(); i++) {
NBTTagCompound nbttagcompound = list.getCompoundTagAt(i);
String animationName = nbttagcompound.getString("Name");
Integer key = nbttagcompound.getInteger("ID");
bootOrder.put(key, animationName);
}
}
}
private void loadAnimationMapFile(File file) throws IOException {
DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));
readAnimationMap(var1);
var1.close();
}
2025-03-12 20:12:01 -04:00
public void readAnimationMap(DataInputStream stream) throws IOException {
NBTTagCompound nbtCompound = CompressedStreamTools.read(stream);
this.readMapNBT(nbtCompound);
}
2025-03-12 20:12:01 -04:00
public void saveAnimationMap() {
try {
File saveDir = getMapDir();
File file = new File(saveDir, "animations.dat_new");
File file1 = new File(saveDir, "animations.dat_old");
File file2 = new File(saveDir, "animations.dat");
CompressedStreamTools.writeCompressed(this.writeMapNBT(), new FileOutputStream(file));
2025-03-12 20:12:01 -04:00
if (file1.exists()) {
file1.delete();
}
file2.renameTo(file1);
2025-03-12 20:12:01 -04:00
if (file2.exists()) {
file2.delete();
}
file.renameTo(file2);
2025-03-12 20:12:01 -04:00
if (file.exists()) {
file.delete();
}
} catch (Exception e) {
LogWriter.except(e);
}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
2023-01-25 23:18:27 -06:00
}