package tk.captainsplexx.Resource.EBX.Modify; import java.nio.ByteOrder; import java.util.ArrayList; import tk.captainsplexx.Game.Core; import tk.captainsplexx.JavaFX.Windows.MainWindow.EntryType; import tk.captainsplexx.Mod.ModTools; import tk.captainsplexx.Mod.Package; import tk.captainsplexx.Resource.FileHandler; import tk.captainsplexx.Resource.ResourceHandler.LinkBundleType; import tk.captainsplexx.Resource.ResourceHandler.ResourceType; import tk.captainsplexx.Resource.TOC.ResourceLink; public class ChangeFile { private ArrayList<ChangeEntry> entries = new ArrayList<>(); private String ebxFileGUID; private boolean isOriginal; private ByteOrder order; public boolean addChange(Object obj, EntryType type, int offset){ for (ChangeEntry ce : entries){ if (ce.getOffset()==offset){ ce.setValue(obj); return true; } } entries.add(new ChangeEntry(obj, type, offset)); return true; } public boolean applyChanges(boolean delteAfter){ byte[] temp = null; byte[] tempValue = null; String tempValueAsString = null; boolean success = true; temp = Core.getGame().getResourceHandler().getEBXHandler().getEBXFileBytesByGUID(ebxFileGUID, isOriginal); System.out.println("Trying to Apply Changes to EBX ("+ebxFileGUID+") with ByteOrder "+order); if (temp!=null){ for (ChangeEntry ce : entries){ switch (ce.getType()){ case INTEGER: tempValue = FileHandler.toBytes((int) ce.getValue(), order); tempValueAsString=""+(Integer) (ce.getValue()); break; case LONG: tempValue = FileHandler.toBytes((long) ce.getValue(), order); tempValueAsString=""+(long) (ce.getValue()); break; case FLOAT: tempValue = FileHandler.toBytes((float) ce.getValue(), order); tempValueAsString=""+(float) (ce.getValue()); break; case UINTEGER: tempValue = FileHandler.toBytes((int) ce.getValue(), order); tempValueAsString=""+(int) (ce.getValue()); break; case SHORT: tempValue = FileHandler.toBytes((short) ce.getValue(), order); tempValueAsString=""+(short) (ce.getValue()); break; case BOOL: tempValue = new byte[] {(byte) ce.getValue()}; tempValueAsString=""+(byte) (ce.getValue()); break; case BYTE: tempValue = new byte[] {(byte) ce.getValue()}; tempValueAsString=""+(byte) (ce.getValue()); break; default: tempValueAsString = null; tempValue = null; System.err.println("Type "+ce.getType()+" is currently not supported to be overriden!"); success = false; } if (tempValue!=null&&tempValueAsString!=null){ System.out.println("Going for "+ce.getType()+"("+tempValueAsString+") at 0x"+FileHandler.toHexInteger(ce.getOffset(), ByteOrder.BIG_ENDIAN)+"!"); if (!FileHandler.overrideBytes(tempValue, temp, ce.getOffset())){ success = false; } } } ResourceLink resLink = Core.getGame().getResourceHandler().getResourceLinkByEBXGUID(ebxFileGUID); if (resLink==null){ System.err.println("Not able to apply changes for EBXFile with guid "+ebxFileGUID+", no ResourceLink found!"); success = false; }else{ Core.getModTools().extendCurrentPackage(LinkBundleType.BUNDLES, Core.getGame().getCurrentSB().getPath(), ResourceType.EBX, resLink.getName()+".ebx"); FileHandler.writeFile(Core.getGame().getCurrentMod().getPath()+ModTools.RESOURCEFOLDER+resLink.getName()+".ebx", temp); } //This will be moved over into main save. Core.getModTools().writePackages(); }else{ System.err.println("Not able to apply changes for file with guid "+ebxFileGUID+", file not found."); return false; } if (delteAfter){ Core.getGame().getResourceHandler().getEBXHandler().getModifyHandler().getFiles().remove(this); } return success; } public ChangeFile(String ebxFileGUID, ByteOrder order, boolean isOriginal) { this.ebxFileGUID = ebxFileGUID; this.order = order; this.isOriginal = isOriginal; } public ArrayList<ChangeEntry> getEntries() { return entries; } public String getEbxFileGUID() { return ebxFileGUID; } public boolean isOriginalFile() { return isOriginal; } public ByteOrder getByteOrder() { return order; } }