2025-02-13 18:11:58 -06:00
|
|
|
package noppes.npcs.controllers;
|
|
|
|
|
|
2025-02-15 19:37:25 -05:00
|
|
|
import net.minecraft.nbt.CompressedStreamTools;
|
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
|
import net.minecraft.nbt.NBTTagList;
|
2025-02-14 12:28:17 -06:00
|
|
|
import noppes.npcs.CustomNpcs;
|
2025-02-15 19:37:25 -05:00
|
|
|
import noppes.npcs.LogWriter;
|
|
|
|
|
import noppes.npcs.api.handler.data.ILinkedItem;
|
2025-02-17 17:26:40 -06:00
|
|
|
import noppes.npcs.api.item.IItemStack;
|
2025-02-15 19:37:25 -05:00
|
|
|
import noppes.npcs.controllers.data.*;
|
|
|
|
|
import noppes.npcs.util.NBTJsonUtil;
|
2025-02-13 18:11:58 -06:00
|
|
|
|
2025-02-15 19:37:25 -05:00
|
|
|
import java.io.*;
|
2025-02-13 18:11:58 -06:00
|
|
|
import java.util.HashMap;
|
2025-02-15 19:37:25 -05:00
|
|
|
import java.util.zip.GZIPInputStream;
|
2025-02-13 18:11:58 -06:00
|
|
|
|
|
|
|
|
public class LinkedItemController {
|
|
|
|
|
private static LinkedItemController Instance;
|
2025-02-14 12:28:17 -06:00
|
|
|
private int lastUsedID = 0;
|
|
|
|
|
|
2025-02-15 22:59:51 -05:00
|
|
|
public HashMap<Integer, LinkedItem> linkedItems = new HashMap<>();
|
|
|
|
|
public HashMap<Integer, LinkedItemScript> linkedItemsScripts = new HashMap<>();
|
2025-02-13 18:11:58 -06:00
|
|
|
|
2025-02-15 19:37:25 -05:00
|
|
|
private HashMap<Integer, String> bootOrder;
|
|
|
|
|
|
|
|
|
|
private LinkedItemController() {}
|
2025-02-13 18:11:58 -06:00
|
|
|
|
2025-02-16 04:54:21 -05:00
|
|
|
public static LinkedItemController getInstance() {
|
2025-02-13 18:11:58 -06:00
|
|
|
if (Instance == null) {
|
|
|
|
|
Instance = new LinkedItemController();
|
|
|
|
|
}
|
|
|
|
|
return Instance;
|
|
|
|
|
}
|
2025-02-14 12:28:17 -06:00
|
|
|
public LinkedItem createItem(String name) {
|
|
|
|
|
return new LinkedItem(name);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-17 17:26:40 -06:00
|
|
|
public IItemStack createItemStack(int id) {
|
|
|
|
|
LinkedItem linkedItem = this.get(id);
|
|
|
|
|
if (linkedItem != null) {
|
|
|
|
|
return linkedItem.createStack();
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-13 18:11:58 -06:00
|
|
|
public void add(LinkedItem linkedItem) {
|
|
|
|
|
if (linkedItem != null) {
|
|
|
|
|
String name = linkedItem.getName();
|
|
|
|
|
if (name != null && !name.isEmpty()) {
|
2025-02-14 12:28:17 -06:00
|
|
|
int linkedItemId = linkedItem.getId();
|
|
|
|
|
int id = this.linkedItems.containsKey(linkedItemId) ? linkedItemId : this.getUnusedId();
|
|
|
|
|
this.linkedItems.put(id, linkedItem);
|
|
|
|
|
linkedItem.setId(id);
|
|
|
|
|
this.addScript(id);
|
2025-02-13 18:11:58 -06:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-14 12:28:17 -06:00
|
|
|
private void addScript(int id) {
|
2025-02-15 19:37:25 -05:00
|
|
|
this.linkedItemsScripts.put(id, new LinkedItemScript());
|
2025-02-14 12:28:17 -06:00
|
|
|
}
|
|
|
|
|
|
2025-02-16 04:54:21 -05:00
|
|
|
public LinkedItem remove(int id) {
|
2025-02-14 12:28:17 -06:00
|
|
|
this.removeScript(id);
|
2025-02-16 04:54:21 -05:00
|
|
|
return this.linkedItems.remove(id);
|
2025-02-14 12:28:17 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void removeScript(int id) {
|
|
|
|
|
this.linkedItemsScripts.remove(id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public LinkedItem get(int id) {
|
|
|
|
|
return this.linkedItems.get(id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean contains(int id) {
|
|
|
|
|
return this.linkedItems.containsKey(id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean contains(LinkedItem linkedItem) {
|
|
|
|
|
return this.linkedItems.containsValue(linkedItem);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public INpcScriptHandler getScriptHandler(int id) {
|
|
|
|
|
return this.linkedItemsScripts.get(id);
|
2025-02-13 18:11:58 -06:00
|
|
|
}
|
2025-02-15 19:37:25 -05:00
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
public void load(){
|
|
|
|
|
bootOrder = new HashMap<>();
|
|
|
|
|
linkedItems = new HashMap<>();
|
|
|
|
|
LogWriter.info("Loading linked items...");
|
|
|
|
|
readLinkedMap();
|
|
|
|
|
loadLinkedItems();
|
|
|
|
|
LogWriter.info("Done loading linked items.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void loadLinkedItems(){
|
|
|
|
|
linkedItems.clear();
|
|
|
|
|
|
|
|
|
|
File dir = getDir();
|
|
|
|
|
if (!dir.exists()) {
|
|
|
|
|
dir.mkdir();
|
|
|
|
|
} else {
|
|
|
|
|
for (File file : dir.listFiles()) {
|
|
|
|
|
if (!file.isFile() || !file.getName().endsWith(".json"))
|
|
|
|
|
continue;
|
|
|
|
|
try {
|
|
|
|
|
LinkedItem linkedItem = new LinkedItem();
|
2025-02-17 14:38:42 -05:00
|
|
|
linkedItem.readFromNBT(NBTJsonUtil.LoadFile(file));
|
2025-02-15 19:37:25 -05:00
|
|
|
linkedItem.name = file.getName().substring(0, file.getName().length() - 5);
|
|
|
|
|
|
|
|
|
|
if(linkedItem.id == -1){
|
|
|
|
|
linkedItem.id = getUnusedId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int originalID = linkedItem.id;
|
|
|
|
|
int setID = linkedItem.id;
|
|
|
|
|
while (bootOrder.containsKey(setID) || linkedItems.containsKey(setID)){
|
|
|
|
|
if(bootOrder.containsKey(setID))
|
|
|
|
|
if(bootOrder.get(setID).equals(linkedItem.name))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
setID++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
linkedItem.id = setID;
|
|
|
|
|
if(originalID != setID){
|
|
|
|
|
LogWriter.info("Found Linked Item ID Mismatch: " + linkedItem.name + ", New ID: " + setID);
|
|
|
|
|
linkedItem.save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
linkedItems.put(linkedItem.id, linkedItem);
|
|
|
|
|
} catch(Exception e) {
|
|
|
|
|
LogWriter.error("Error loading: " + file.getAbsolutePath(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
saveLinkedItemsMap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private File getDir() {
|
|
|
|
|
return new File(CustomNpcs.getWorldSaveDirectory(), "linkeditems");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getUnusedId(){
|
|
|
|
|
if(lastUsedID == 0){
|
|
|
|
|
for(int catid : linkedItems.keySet()){
|
|
|
|
|
if(catid > lastUsedID)
|
|
|
|
|
lastUsedID = catid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
lastUsedID++;
|
|
|
|
|
return lastUsedID;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean hasName(String newName) {
|
|
|
|
|
if(newName.trim().isEmpty())
|
|
|
|
|
return true;
|
|
|
|
|
for(LinkedItem linkedItem : linkedItems.values())
|
|
|
|
|
if(linkedItem.name.equals(newName))
|
|
|
|
|
return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ILinkedItem saveLinkedItem(ILinkedItem linkedItem){
|
2025-02-16 04:54:21 -05:00
|
|
|
if (linkedItem.getId() < 0) {
|
2025-02-15 19:37:25 -05:00
|
|
|
linkedItem.setId(getUnusedId());
|
2025-02-16 04:54:21 -05:00
|
|
|
while (hasName(linkedItem.getName()))
|
2025-02-15 19:37:25 -05:00
|
|
|
linkedItem.setName(linkedItem.getName() + "_");
|
|
|
|
|
}
|
2025-02-16 04:54:21 -05:00
|
|
|
|
|
|
|
|
while (hasOther(linkedItem.getName(), linkedItem.getId()))
|
|
|
|
|
linkedItem.setName(linkedItem.getName() + "_");
|
2025-02-15 19:37:25 -05:00
|
|
|
|
|
|
|
|
linkedItems.remove(linkedItem.getId());
|
|
|
|
|
linkedItems.put(linkedItem.getId(), (LinkedItem) linkedItem);
|
|
|
|
|
saveLinkedItemsMap();
|
|
|
|
|
|
|
|
|
|
// Save Linked Item File
|
|
|
|
|
File dir = this.getDir();
|
|
|
|
|
if(!dir.exists())
|
|
|
|
|
dir.mkdirs();
|
|
|
|
|
|
|
|
|
|
File file = new File(dir, linkedItem.getName() + ".json_new");
|
|
|
|
|
File file2 = new File(dir, linkedItem.getName() + ".json");
|
|
|
|
|
|
|
|
|
|
try {
|
2025-02-17 14:38:42 -05:00
|
|
|
NBTJsonUtil.SaveFile(file, ((LinkedItem)linkedItem).writeToNBT(true));
|
2025-02-15 19:37:25 -05:00
|
|
|
if(file2.exists())
|
|
|
|
|
file2.delete();
|
|
|
|
|
file.renameTo(file2);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
LogWriter.except(e);
|
|
|
|
|
}
|
|
|
|
|
return linkedItems.get(linkedItem.getId());
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-16 04:54:21 -05:00
|
|
|
private boolean hasOther(String name, int id) {
|
|
|
|
|
for (LinkedItem linkedItem : linkedItems.values()) {
|
|
|
|
|
if (linkedItem.getId() != id && linkedItem.getName().equalsIgnoreCase(name))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void delete(int id) {
|
|
|
|
|
LinkedItem linkedItem = get(id);
|
|
|
|
|
if (linkedItem != null) {
|
|
|
|
|
LinkedItem foundItem = remove(id);
|
|
|
|
|
if (foundItem != null && foundItem.name != null) {
|
|
|
|
|
File dir = this.getDir();
|
|
|
|
|
for (File file : dir.listFiles()) {
|
|
|
|
|
if (!file.isFile() || !file.getName().endsWith(".json"))
|
|
|
|
|
continue;
|
|
|
|
|
if (file.getName().equalsIgnoreCase(foundItem.name + ".json")) {
|
|
|
|
|
file.delete();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
saveLinkedItemsMap();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void deleteLinkedItemFile(String prevName) {
|
|
|
|
|
File dir = this.getDir();
|
|
|
|
|
if (!dir.exists())
|
|
|
|
|
dir.mkdirs();
|
|
|
|
|
File file2 = new File(dir, prevName + ".json");
|
|
|
|
|
if (file2.exists())
|
|
|
|
|
file2.delete();
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-15 19:37:25 -05:00
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
// LINKED ITEMS MAP
|
|
|
|
|
|
|
|
|
|
public File getMapDir(){
|
|
|
|
|
File dir = CustomNpcs.getWorldSaveDirectory();
|
|
|
|
|
if(!dir.exists())
|
|
|
|
|
dir.mkdir();
|
|
|
|
|
return dir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void readLinkedMap(){
|
|
|
|
|
bootOrder.clear();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
File file = new File(getMapDir(), "linkeditems.dat");
|
|
|
|
|
if(file.exists()){
|
|
|
|
|
loadLinkedMap(file);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
try {
|
|
|
|
|
File file = new File(getMapDir(), "linkeditems.dat_old");
|
|
|
|
|
if(file.exists()){
|
|
|
|
|
loadLinkedMap(file);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception ignored) {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public NBTTagCompound writeMapNBT(){
|
|
|
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
|
|
|
NBTTagList linkedList = new NBTTagList();
|
|
|
|
|
for(Integer key: linkedItems.keySet()){
|
|
|
|
|
LinkedItem linkedItem = linkedItems.get(key);
|
|
|
|
|
if(!linkedItem.getName().isEmpty()){
|
|
|
|
|
NBTTagCompound linkedCompound = new NBTTagCompound();
|
|
|
|
|
linkedCompound.setString("Name", linkedItem.getName());
|
|
|
|
|
linkedCompound.setInteger("ID", key);
|
|
|
|
|
|
|
|
|
|
linkedList.appendTag(linkedCompound);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
nbt.setTag("LinkedItems", linkedList);
|
|
|
|
|
return nbt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void readMapNBT(NBTTagCompound compound){
|
|
|
|
|
NBTTagList list = compound.getTagList("LinkedItems", 10);
|
|
|
|
|
if(list != null){
|
|
|
|
|
for(int i = 0; i < list.tagCount(); i++)
|
|
|
|
|
{
|
|
|
|
|
NBTTagCompound nbttagcompound = list.getCompoundTagAt(i);
|
|
|
|
|
String linkedName = nbttagcompound.getString("Name");
|
|
|
|
|
Integer key = nbttagcompound.getInteger("ID");
|
|
|
|
|
bootOrder.put(key, linkedName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void loadLinkedMap(File file) throws IOException {
|
|
|
|
|
DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));
|
|
|
|
|
readLinkedMap(var1);
|
|
|
|
|
var1.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void readLinkedMap(DataInputStream stream) throws IOException{
|
|
|
|
|
NBTTagCompound nbtCompound = CompressedStreamTools.read(stream);
|
|
|
|
|
this.readMapNBT(nbtCompound);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void saveLinkedItemsMap(){
|
|
|
|
|
try {
|
|
|
|
|
File saveDir = getMapDir();
|
|
|
|
|
File file = new File(saveDir, "linkeditems.dat_new");
|
|
|
|
|
File file1 = new File(saveDir, "linkeditems.dat_old");
|
|
|
|
|
File file2 = new File(saveDir, "linkeditems.dat");
|
|
|
|
|
CompressedStreamTools.writeCompressed(this.writeMapNBT(), new FileOutputStream(file));
|
|
|
|
|
if(file1.exists())
|
|
|
|
|
{
|
|
|
|
|
file1.delete();
|
|
|
|
|
}
|
|
|
|
|
file2.renameTo(file1);
|
|
|
|
|
if(file2.exists())
|
|
|
|
|
{
|
|
|
|
|
file2.delete();
|
|
|
|
|
}
|
|
|
|
|
file.renameTo(file2);
|
|
|
|
|
if(file.exists())
|
|
|
|
|
{
|
|
|
|
|
file.delete();
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
LogWriter.except(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
////////////////////////////////////////////////////////
|
2025-02-13 18:11:58 -06:00
|
|
|
}
|