From cc2ae8ece8f6b90a0590a0c9e1b408648b0d838c Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 4 Jun 2019 16:31:46 +0300 Subject: [PATCH] Performance fixes --- plugin.yml | 2 +- src/com/furkannm/skriptnms/SkriptNMS.java | 14 +- .../skriptnms/effects/EffLoadDATFile.java | 1 - .../skriptnms/expressions/ExprItemNBT.java | 30 +- .../expressions/ExprLoadedDATFileNBT.java | 2 +- .../skriptnms/expressions/ExprNBTOf.java | 12 +- .../skriptnms/expressions/ExprNBTTagOf.java | 4 +- src/com/furkannm/skriptnms/nms/NMS.java | 40 +- .../nms/versions/reflection/NBTClassInfo.java | 65 +++ .../versions/reflection/NMSReflection.java | 133 ++++- .../versions/reflection/types/NBTTagList.java | 25 + .../skriptnms/nms/versions/v1_10_R1.java | 173 ++++++- .../skriptnms/nms/versions/v1_11_R1.java | 145 ++++++ .../skriptnms/nms/versions/v1_12_R1.java | 144 ++++++ .../skriptnms/nms/versions/v1_13_R1.java | 145 ++++++ .../skriptnms/nms/versions/v1_13_R2.java | 457 ++++++++++++++++++ .../skriptnms/nms/versions/v1_8_R3.java | 145 ++++++ .../skriptnms/nms/versions/v1_9_R1.java | 145 ++++++ 18 files changed, 1629 insertions(+), 53 deletions(-) create mode 100644 src/com/furkannm/skriptnms/nms/versions/reflection/NBTClassInfo.java create mode 100644 src/com/furkannm/skriptnms/nms/versions/reflection/types/NBTTagList.java create mode 100644 src/com/furkannm/skriptnms/nms/versions/v1_13_R2.java diff --git a/plugin.yml b/plugin.yml index 9d09133..8ca04be 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: skript-nms author: FurkannM description: A Skript addon for NMS stuff -version: 0.1.2 +version: 0.1.4 main: com.furkannm.skriptnms.SkriptNMS depend: [Skript] \ No newline at end of file diff --git a/src/com/furkannm/skriptnms/SkriptNMS.java b/src/com/furkannm/skriptnms/SkriptNMS.java index 8ea8ff5..e8a346b 100644 --- a/src/com/furkannm/skriptnms/SkriptNMS.java +++ b/src/com/furkannm/skriptnms/SkriptNMS.java @@ -15,8 +15,8 @@ public class SkriptNMS extends JavaPlugin{ private static String ver; - private static SkriptNMS instance; - private static SkriptAddon addonInstance; + private SkriptNMS instance; + private SkriptAddon addonInstance; private static NMS nmsclass; public SkriptNMS() { @@ -29,11 +29,16 @@ public SkriptNMS() { @Override public void onEnable() { - getLogger().info("Skript-NMS is started!"); ver = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; NMS.setDefaultNMS(new NMSReflection()); nmsclass = NMS.getNMS(getVer()); - if(nmsclass instanceof NMSReflection) loadNMSClasses(); + nmsclass.registerNbtCompound(); + String type = "default classes"; + if (nmsclass instanceof NMSReflection) { + loadNMSClasses(); + type = "reflection classes"; + } + getLogger().info("Skript-NMS is started for "+ver+" with "+type+"!"); try { getAddonInstance().loadClasses("com.furkannm.skriptnms", "effects", "expressions"); } catch (IOException e) { @@ -76,6 +81,7 @@ private void loadNMSClasses() { NMSClasses.registerNMS(new NBTCompressedStreamTools()); NMSClasses.registerNMS(new NBTTagByte()); NMSClasses.registerNMS(new NBTTagCompound()); + NMSClasses.registerNMS(new NBTTagList()); NMSClasses.registerNMS(new NBTTagDouble()); NMSClasses.registerNMS(new NBTTagFloat()); NMSClasses.registerNMS(new NBTTagInt()); diff --git a/src/com/furkannm/skriptnms/effects/EffLoadDATFile.java b/src/com/furkannm/skriptnms/effects/EffLoadDATFile.java index b64f71d..0e0827b 100644 --- a/src/com/furkannm/skriptnms/effects/EffLoadDATFile.java +++ b/src/com/furkannm/skriptnms/effects/EffLoadDATFile.java @@ -25,7 +25,6 @@ public class EffLoadDATFile extends AsyncEffect { Skript.registerEffect(EffLoadDATFile.class, "load [the] dat [file] %string%"); } - //load dat %string% private File lastLoadedFile = null; private Expression fileName; diff --git a/src/com/furkannm/skriptnms/expressions/ExprItemNBT.java b/src/com/furkannm/skriptnms/expressions/ExprItemNBT.java index f6a1ec3..f6f3b45 100644 --- a/src/com/furkannm/skriptnms/expressions/ExprItemNBT.java +++ b/src/com/furkannm/skriptnms/expressions/ExprItemNBT.java @@ -4,11 +4,11 @@ import org.bukkit.Material; import org.bukkit.event.Event; -import org.bukkit.inventory.ItemStack; import com.furkannm.skriptnms.SkriptNMS; import ch.njol.skript.Skript; +import ch.njol.skript.aliases.ItemType; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.lang.Expression; @@ -18,35 +18,39 @@ import ch.njol.util.Kleenean; @Name("Item NBT") -@Examples({"give diamond with nbt \"{display:{Name:\"SkriptNMS\",Lore:[\"Hello\",\"World\"]},Unbreakable:1}\" to player"}) +@Examples({"give diamond with nbt \"{display:{Name:\"\"SkriptNMS\"\",Lore:[\"\"Hello\"\",\"\"World\"\"]},Unbreakable:1}\" to player"}) -public class ExprItemNBT extends SimpleExpression{ +public class ExprItemNBT extends SimpleExpression{ static { - Skript.registerExpression(ExprItemNBT.class, ItemStack.class, ExpressionType.PROPERTY, "%itemstack% with [custom] nbt[[ ]tag[s]] %string%"); + Skript.registerExpression(ExprItemNBT.class, ItemType.class, ExpressionType.COMBINED, "%itemtype% with [custom] nbt[[ ]tag[s]] %string%"); } - private Expression itemStack; + private Expression itemStack; private Expression string; @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expr, int matchedPattern, Kleenean arg2, ParseResult result) { - itemStack = (Expression) expr[0]; + itemStack = (Expression) expr[0]; string = (Expression) expr[1]; return true; } @Override @Nullable - protected ItemStack[] get(Event e) { - ItemStack item = itemStack.getSingle(e); + protected ItemType[] get(Event e) { + ItemType item = itemStack.getSingle(e); String newTags = string.getSingle(e); - if(item.getType()==Material.AIR || item==null) return null; + if(item.getItem().getRandom().getType()==Material.AIR || item==null) { + Skript.error("Item is air or none! itemtype="+item.getItem()+",itemstack="+item.getItem().getRandom()+",type=" +(item!=null ? item.getItem().getRandom().getType() : "")); + + return null; + } Object parsedNBT = null; parsedNBT = SkriptNMS.getNMS().parseRawNBT(newTags); - ItemStack newItem = SkriptNMS.getNMS().getItemWithNBT(item, parsedNBT); - return new ItemStack[] { newItem }; + ItemType newItem = new ItemType(SkriptNMS.getNMS().getItemWithNBT(item.getItem().getRandom(), parsedNBT)); + return new ItemType[] { newItem }; } @Override @@ -55,8 +59,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return ItemStack.class; + public Class getReturnType() { + return ItemType.class; } @Override diff --git a/src/com/furkannm/skriptnms/expressions/ExprLoadedDATFileNBT.java b/src/com/furkannm/skriptnms/expressions/ExprLoadedDATFileNBT.java index d12583b..17ed2e3 100644 --- a/src/com/furkannm/skriptnms/expressions/ExprLoadedDATFileNBT.java +++ b/src/com/furkannm/skriptnms/expressions/ExprLoadedDATFileNBT.java @@ -30,7 +30,7 @@ public class ExprLoadedDATFileNBT extends SimpleExpression{ Skript.registerExpression(ExprLoadedDATFileNBT.class, Object.class, ExpressionType.SIMPLE, "nbt [tag[s]] (of|from) [the] [last[ly]] [loaded] dat file"); } - private Class returnType = NMS.getMCClass("NBTTagCompound"); + private Class returnType = SkriptNMS.getNMS().getCompoundClass(); @Override public boolean init(Expression[] expr, int matchedPattern, Kleenean arg2, ParseResult result) { diff --git a/src/com/furkannm/skriptnms/expressions/ExprNBTOf.java b/src/com/furkannm/skriptnms/expressions/ExprNBTOf.java index 1f8fe8d..fbc8ea5 100644 --- a/src/com/furkannm/skriptnms/expressions/ExprNBTOf.java +++ b/src/com/furkannm/skriptnms/expressions/ExprNBTOf.java @@ -6,6 +6,7 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.aliases.ItemType; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; @@ -25,9 +26,10 @@ public class ExprNBTOf extends PropertyExpression { - private Class returnType = NMS.getMCClass("NBTTagCompound"); + private Class returnType = SkriptNMS.getNMS().getCompoundClass(); static { register(ExprNBTOf.class, Object.class, "nbt [tag[s]]", "objects"); + //register(ExprNBTOf.class, Object.class, "nbt [tag[s]]", "compounds"); } @SuppressWarnings("unchecked") @@ -35,7 +37,7 @@ public class ExprNBTOf extends PropertyExpression { public boolean init(Expression[] expr, int matchedPattern, Kleenean arg2, ParseResult result) { setExpr((Expression) expr[0]); Class type = getExpr().getReturnType(); - if (type != Entity.class || type != Block.class || type != ItemStack.class || type != Slot.class) + if (type != Entity.class && type != Block.class && type != ItemStack.class && type != Slot.class && type != ItemType.class) Skript.error(getExpr().toString() + " is not entity, block or itemstack.", ErrorQuality.SEMANTIC_ERROR); return true; } @@ -50,6 +52,9 @@ public Class[] acceptChange(final ChangeMode mode) { @Override public void change(Event e, Object[] args, ChangeMode mode) { Object tar = getExpr().getSingle(e); + if(tar instanceof ItemType) { + tar = ((ItemType)tar).getItem().getRandom(); + } Object parsedNBT = null; if (args != null) parsedNBT = returnType.cast(SkriptNMS.getNMS().parseRawNBT(((String) args[0]))); @@ -71,6 +76,9 @@ public String toString(Event e, boolean debug) { @Override protected Object[] get(Event e, Object[] source) { Object tar = getExpr().getSingle(e); + if(tar instanceof ItemType) { + tar = ((ItemType)tar).getItem().getRandom(); + } return SkriptNMS.getNMS().getNBT(tar); } } diff --git a/src/com/furkannm/skriptnms/expressions/ExprNBTTagOf.java b/src/com/furkannm/skriptnms/expressions/ExprNBTTagOf.java index 1c7342c..a44e6dd 100644 --- a/src/com/furkannm/skriptnms/expressions/ExprNBTTagOf.java +++ b/src/com/furkannm/skriptnms/expressions/ExprNBTTagOf.java @@ -21,9 +21,9 @@ public class ExprNBTTagOf extends SimpleExpression { - private Class nbtBase = NMS.getMCClass("NBTBase"); + private Class nbtBase = SkriptNMS.getNMS().getBaseClass(); static { - Skript.registerExpression(ExprNBTTagOf.class, Object.class, ExpressionType.PROPERTY, "[nbt] tag %string% of %object%"); + Skript.registerExpression(ExprNBTTagOf.class, Object.class, ExpressionType.PROPERTY, "[nbt] tag %string% of %compound%"); } private Expression tag; diff --git a/src/com/furkannm/skriptnms/nms/NMS.java b/src/com/furkannm/skriptnms/nms/NMS.java index b6da4af..846358f 100644 --- a/src/com/furkannm/skriptnms/nms/NMS.java +++ b/src/com/furkannm/skriptnms/nms/NMS.java @@ -12,6 +12,7 @@ import com.furkannm.skriptnms.nms.versions.v1_11_R1; import com.furkannm.skriptnms.nms.versions.v1_12_R1; import com.furkannm.skriptnms.nms.versions.v1_13_R1; +import com.furkannm.skriptnms.nms.versions.v1_13_R2; import com.furkannm.skriptnms.nms.versions.v1_8_R3; import com.furkannm.skriptnms.nms.versions.v1_9_R1; import com.furkannm.skriptnms.nms.versions.reflection.NMSReflection; @@ -20,31 +21,33 @@ public abstract class NMS { public static NMS defaultNMS; public static NMS getNMS(String version) { - if(version.equalsIgnoreCase("v1_8_R3")) return new v1_8_R3(); - if(version.equalsIgnoreCase("v1_9_R1")) return new v1_9_R1(); - if(version.equalsIgnoreCase("v1_10_R1")) return new v1_10_R1(); - if(version.equalsIgnoreCase("v1_11_R1")) return new v1_11_R1(); - if(version.equalsIgnoreCase("v1_12_R1")) return new v1_12_R1(); - if(version.equalsIgnoreCase("v1_13_R1")) return new v1_13_R1(); + if (version.equalsIgnoreCase("v1_8_R3")) return new v1_8_R3(); + if (version.equalsIgnoreCase("v1_9_R1")) return new v1_9_R1(); + if (version.equalsIgnoreCase("v1_10_R1")) return new v1_10_R1(); + if (version.equalsIgnoreCase("v1_11_R1")) return new v1_11_R1(); + if (version.equalsIgnoreCase("v1_12_R1")) return new v1_12_R1(); + if (version.equalsIgnoreCase("v1_13_R1")) return new v1_13_R1(); + if (version.equalsIgnoreCase("v1_13_R2")) return new v1_13_R2(); return defaultNMS; } - public static Class getMCClass(String classStr) { + /*public static Class getMCClass(String classStr) { String ver = SkriptNMS.getVer(); Class nmsClass; - try{ - if(!(getNMS(ver) instanceof NMSReflection)) { + try { + if (!(getNMS(ver) instanceof NMSReflection)) { nmsClass = Class.forName("net.minecraft.server."+ver+"."+classStr); - }else{ + } else { nmsClass = Class.forName("com.furkannm.skriptnms.nms.versions.reflection.types."+classStr); return nmsClass.getMethod("get", Class.class).invoke(nmsClass).getClass(); } - }catch(ClassNotFoundException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { - Bukkit.getLogger().warning("Unknown nms class!"); + } catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + if(getNMS(ver) instanceof NMSReflection) Bukkit.getLogger().warning("Unknown " + classStr +" nms class for "+ver+"!"); + else Bukkit.getLogger().warning("Unknown " + classStr +" bukkit class for "+ver+"!"); return null; } return nmsClass; - } + }*/ public static void setDefaultNMS(NMS defaultClass) { defaultNMS = defaultClass; @@ -70,4 +73,15 @@ public static void setDefaultNMS(NMS defaultClass) { public abstract Object convertToNBT(String string); public abstract void loadFileNbt(File file); public abstract void setFileNBT(File file, Object newCompound); + + public abstract Object[] getContents(Object nbtList); + public abstract void addToList(Object nbtList, Object toAdd); + public abstract void removeFromList(Object nbtList, int index); + public abstract void setIndex(Object nbtList, int index, Object toSet); + public abstract Object getIndex(Object nbtList, int index); + + public abstract Class getCompoundClass(); + public abstract Class getBaseClass(); + + public abstract void registerNbtCompound(); } diff --git a/src/com/furkannm/skriptnms/nms/versions/reflection/NBTClassInfo.java b/src/com/furkannm/skriptnms/nms/versions/reflection/NBTClassInfo.java new file mode 100644 index 0000000..cd90b1a --- /dev/null +++ b/src/com/furkannm/skriptnms/nms/versions/reflection/NBTClassInfo.java @@ -0,0 +1,65 @@ +package com.furkannm.skriptnms.nms.versions.reflection; + +import javax.annotation.Nullable; + +import com.furkannm.skriptnms.SkriptNMS; +import com.furkannm.skriptnms.nms.NMSClasses; + +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; + +public class NBTClassInfo { + + private Class c; + private String codeName; + private String[] users; + + public NBTClassInfo(Class c, String codeName, String... users) { + this.c = c; + this.codeName = codeName; + this.users = users; + } + + public ClassInfo getClassInfo() { + return new ClassInfo<>(c, codeName) + .user(users) + .name("NBT Compound") + .since("0.1.3") + .parser(getParser()); + } + + public Parser getParser() { + return new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @SuppressWarnings("unchecked") + @Override + @Nullable + public N parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + N nbt = (N) SkriptNMS.getNMS().parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(N n, int arg1) { + return n.toString(); + } + + @Override + public String toVariableNameString(N n) { + return n.toString(); + } + + }; + } + + +} diff --git a/src/com/furkannm/skriptnms/nms/versions/reflection/NMSReflection.java b/src/com/furkannm/skriptnms/nms/versions/reflection/NMSReflection.java index 2d9cf8f..e79fd82 100644 --- a/src/com/furkannm/skriptnms/nms/versions/reflection/NMSReflection.java +++ b/src/com/furkannm/skriptnms/nms/versions/reflection/NMSReflection.java @@ -19,6 +19,7 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.slot.Slot; import com.furkannm.skriptnms.SkriptNMS; @@ -71,7 +72,7 @@ public void removeTargetsNBT(Object tar,Object[] nbt) { if (tar instanceof Entity) { Object entNBT = NBTTagCompound.get().cast(getEntityNBT((Entity) tar)); for (Object s : nbt) { - if (s != "UUIDMost" || s != "UUIDLeast" || s != "WorldUUIDMost" || s != "WorldUUIDLeast" || s != "Bukkit.updateLevel") { + if (s != "UUIDMost" && s != "UUIDLeast" && s != "WorldUUIDMost" && s != "WorldUUIDLeast" && s != "Bukkit.updateLevel") { removeFromCompound(NBTTagCompound.get().cast(entNBT), (String) s); } } @@ -79,7 +80,7 @@ public void removeTargetsNBT(Object tar,Object[] nbt) { }else if (tar instanceof Block) { Object blockNBT = NBTTagCompound.get().cast(getTileNBT((Block) tar)); for (Object s : nbt) { - if (s != "x" || s != "y" || s != "z" || s != "id") { + if (s != "x" && s != "y" && s != "z" && s != "id") { removeFromCompound(NBTTagCompound.get().cast(blockNBT), (String) s); } } @@ -448,4 +449,132 @@ public void setFileNBT(File file, Object newCompound) { } } + @Override + public Object[] getContents(Object nbtList) { + if (NBTTagList.get().isInstance(nbtList)) { + try { + Class TagList = NBTTagList.get(); + int size = (int) TagList.cast(nbtList).getClass().getMethod("size").invoke(TagList.cast(nbtList)); + Object[] contents = new Object[size]; + for (int i = 0; i < size; i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + Skript.warning("Error when converting NBT - " + e.getMessage()); + return null; + } + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (NBTTagList.get().isInstance(nbtList) && NBTBase.get().isInstance(toAdd) ) { + try { + Object TagList = NBTTagList.get().cast(nbtList); + Object Base = NBTBase.get().cast(toAdd); + TagList.getClass().getMethod("add", Base.getClass()).invoke(TagList, toAdd); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + Skript.warning("Error when adding to list - " + e.getMessage()); + } + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + try { + int size = (int) NBTTagList.get().cast(nbtList).getClass().getMethod("size").invoke(NBTTagList.get().cast(nbtList)); + if (NBTTagList.get().isInstance(nbtList) && index >= 0 && index < size) { + Object TagList = NBTTagList.get().cast(nbtList); + TagList.getClass().getMethod("remove", int.class).invoke(TagList, index);; + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException + | SecurityException e) { + Skript.warning("Error when removing to list - " + e.getMessage()); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + try { + int size = (int) NBTTagList.get().cast(nbtList).getClass().getMethod("size").invoke(NBTTagList.get().cast(nbtList)); + if (NBTTagList.get().isInstance(nbtList) && index >= 0 && index < size) { + if (NBTBase.get().isInstance(toSet)) { + Object TagList = NBTTagList.get().cast(nbtList); + TagList.getClass().getMethod("a", int.class, NBTBase.get().getClass()).invoke(TagList, index, NBTBase.get().cast(toSet)); + } else if (toSet instanceof Number) { + Object TagList = NBTTagList.get().cast(nbtList); + TagList.getClass().getMethod("a", int.class, NBTBase.get().getClass()).invoke(TagList, index, NBTBase.get().cast(convertToNBT((Number) toSet))); + } else if (toSet instanceof String) { + Object TagList = NBTTagList.get().cast(nbtList); + TagList.getClass().getMethod("a", int.class, NBTBase.get().getClass()).invoke(TagList, index, NBTBase.get().cast(convertToNBT((String) toSet))); + } + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException + | SecurityException e) { + Skript.warning("Error when setting index - " + e.getMessage()); + } + + } + + @Override + public Object getIndex(Object nbtList, int index) { + try { + int size = (int) NBTTagList.get().cast(nbtList).getClass().getMethod("size").invoke(NBTTagList.get().cast(nbtList)); + if (NBTTagList.get().isInstance(nbtList) && index >= 0 && index < size) { + Object value = NBTTagList.get().cast(nbtList).getClass().getMethod("c", int.class).invoke(NBTTagList.get().cast(nbtList), index); + if (NBTTagByte.get().isInstance(value)) { + byte val = (byte) NBTTagByte.get().cast(value).getClass().getMethod("asByte").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTTagShort.get().isInstance(value)) { + short val = (short) NBTTagByte.get().cast(value).getClass().getMethod("asShort").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTTagInt.get().isInstance(value)) { + int val = (int) NBTTagByte.get().cast(value).getClass().getMethod("asInt").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTTagLong.get().isInstance(value)) { + long val = (long) NBTTagByte.get().cast(value).getClass().getMethod("asLong").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTTagFloat.get().isInstance(value)) { + float val = (float) NBTTagByte.get().cast(value).getClass().getMethod("asFloat").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTTagDouble.get().isInstance(value)) { + double val = (double) NBTTagByte.get().cast(value).getClass().getMethod("asDouble").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTTagString.get().isInstance(value)) { + String val = (String) NBTTagByte.get().cast(value).getClass().getMethod("asString").invoke(NBTTagByte.get().cast(value)); + return val; + } else if (NBTBase.get().isInstance(value)) { + return value; + } + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException + | SecurityException e) { + Skript.warning("Error when getting index - " + e.getMessage()); + return null; + } + + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.get(); + } + + @Override + public Class getBaseClass() { + return NBTBase.get(); + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new NBTClassInfo(NBTTagCompound.get().getClass(), "compound").getClassInfo()); + } + } diff --git a/src/com/furkannm/skriptnms/nms/versions/reflection/types/NBTTagList.java b/src/com/furkannm/skriptnms/nms/versions/reflection/types/NBTTagList.java new file mode 100644 index 0000000..90b9019 --- /dev/null +++ b/src/com/furkannm/skriptnms/nms/versions/reflection/types/NBTTagList.java @@ -0,0 +1,25 @@ +package com.furkannm.skriptnms.nms.versions.reflection.types; + +import com.furkannm.skriptnms.SkriptNMS; +import com.furkannm.skriptnms.nms.NMSClasses; + +@SuppressWarnings("rawtypes") +public class NBTTagList extends NMSClasses{ + + private static Class nmsClass; + + @Override + public void set() { + Class NbtCompound = null; + try { + NbtCompound = Class.forName("net.minecraft.server."+SkriptNMS.getVer()+".NBTTagList"); + } catch (SecurityException | ClassNotFoundException e) { + e.printStackTrace(); + } + nmsClass = NbtCompound; + } + + public static Class get() { + return nmsClass; + } +} diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_10_R1.java b/src/com/furkannm/skriptnms/nms/versions/v1_10_R1.java index 39969c7..af6c537 100644 --- a/src/com/furkannm/skriptnms/nms/versions/v1_10_R1.java +++ b/src/com/furkannm/skriptnms/nms/versions/v1_10_R1.java @@ -9,6 +9,25 @@ import java.io.OutputStream; import java.util.Arrays; +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.ItemStack; + +import com.furkannm.skriptnms.nms.DatFile; +import com.furkannm.skriptnms.nms.NMS; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; +import ch.njol.skript.util.slot.Slot; import net.minecraft.server.v1_10_R1.BlockPosition; import net.minecraft.server.v1_10_R1.IBlockData; import net.minecraft.server.v1_10_R1.MojangsonParser; @@ -19,26 +38,13 @@ import net.minecraft.server.v1_10_R1.NBTTagDouble; import net.minecraft.server.v1_10_R1.NBTTagFloat; import net.minecraft.server.v1_10_R1.NBTTagInt; +import net.minecraft.server.v1_10_R1.NBTTagList; import net.minecraft.server.v1_10_R1.NBTTagLong; import net.minecraft.server.v1_10_R1.NBTTagShort; import net.minecraft.server.v1_10_R1.NBTTagString; import net.minecraft.server.v1_10_R1.TileEntity; import net.minecraft.server.v1_10_R1.World; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; -import org.bukkit.entity.Entity; -import org.bukkit.inventory.ItemStack; - -import ch.njol.skript.Skript; -import ch.njol.skript.util.slot.Slot; - -import com.furkannm.skriptnms.nms.DatFile; -import com.furkannm.skriptnms.nms.NMS; - public class v1_10_R1 extends NMS{ @Override @@ -308,5 +314,144 @@ public void setFileNBT(File file, Object newCompound) { } } } + + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).remove(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).h(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).g(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).f(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).e(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).d(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).i(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).h(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).c_(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } + } diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_11_R1.java b/src/com/furkannm/skriptnms/nms/versions/v1_11_R1.java index 51a0e61..45c2d7e 100644 --- a/src/com/furkannm/skriptnms/nms/versions/v1_11_R1.java +++ b/src/com/furkannm/skriptnms/nms/versions/v1_11_R1.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import java.util.Arrays; +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; import net.minecraft.server.v1_11_R1.IBlockData; import net.minecraft.server.v1_11_R1.BlockPosition; import net.minecraft.server.v1_11_R1.MojangsonParser; @@ -19,6 +21,7 @@ import net.minecraft.server.v1_11_R1.NBTTagDouble; import net.minecraft.server.v1_11_R1.NBTTagFloat; import net.minecraft.server.v1_11_R1.NBTTagInt; +import net.minecraft.server.v1_11_R1.NBTTagList; import net.minecraft.server.v1_11_R1.NBTTagLong; import net.minecraft.server.v1_11_R1.NBTTagShort; import net.minecraft.server.v1_11_R1.NBTTagString; @@ -34,6 +37,10 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.slot.Slot; import com.furkannm.skriptnms.nms.DatFile; @@ -308,5 +315,143 @@ public void setFileNBT(File file, Object newCompound) { } } } + + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).remove(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).h(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).g(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).f(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).e(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).d(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).i(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).asDouble(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).c_(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } } diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_12_R1.java b/src/com/furkannm/skriptnms/nms/versions/v1_12_R1.java index 25ac763..01ecd40 100644 --- a/src/com/furkannm/skriptnms/nms/versions/v1_12_R1.java +++ b/src/com/furkannm/skriptnms/nms/versions/v1_12_R1.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import java.util.Arrays; +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; import net.minecraft.server.v1_12_R1.IBlockData; import net.minecraft.server.v1_12_R1.BlockPosition; import net.minecraft.server.v1_12_R1.MojangsonParser; @@ -19,6 +21,7 @@ import net.minecraft.server.v1_12_R1.NBTTagDouble; import net.minecraft.server.v1_12_R1.NBTTagFloat; import net.minecraft.server.v1_12_R1.NBTTagInt; +import net.minecraft.server.v1_12_R1.NBTTagList; import net.minecraft.server.v1_12_R1.NBTTagLong; import net.minecraft.server.v1_12_R1.NBTTagShort; import net.minecraft.server.v1_12_R1.NBTTagString; @@ -34,6 +37,10 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.slot.Slot; import com.furkannm.skriptnms.nms.DatFile; @@ -309,4 +316,141 @@ public void setFileNBT(File file, Object newCompound) { } } + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).remove(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).i(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).g(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).f(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).e(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).d(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).i(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).asDouble(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).c_(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } } diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_13_R1.java b/src/com/furkannm/skriptnms/nms/versions/v1_13_R1.java index 7ecaa1c..223ed44 100644 --- a/src/com/furkannm/skriptnms/nms/versions/v1_13_R1.java +++ b/src/com/furkannm/skriptnms/nms/versions/v1_13_R1.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import java.util.Arrays; +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; import net.minecraft.server.v1_13_R1.IBlockData; import net.minecraft.server.v1_13_R1.BlockPosition; import net.minecraft.server.v1_13_R1.MojangsonParser; @@ -19,6 +21,7 @@ import net.minecraft.server.v1_13_R1.NBTTagDouble; import net.minecraft.server.v1_13_R1.NBTTagFloat; import net.minecraft.server.v1_13_R1.NBTTagInt; +import net.minecraft.server.v1_13_R1.NBTTagList; import net.minecraft.server.v1_13_R1.NBTTagLong; import net.minecraft.server.v1_13_R1.NBTTagShort; import net.minecraft.server.v1_13_R1.NBTTagString; @@ -34,6 +37,10 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.slot.Slot; import com.furkannm.skriptnms.nms.DatFile; @@ -308,5 +315,143 @@ public void setFileNBT(File file, Object newCompound) { } } } + + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).remove(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).c(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).g(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).f(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).e(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).d(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).i(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).asDouble(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).b_(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } } diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_13_R2.java b/src/com/furkannm/skriptnms/nms/versions/v1_13_R2.java new file mode 100644 index 0000000..f773d7b --- /dev/null +++ b/src/com/furkannm/skriptnms/nms/versions/v1_13_R2.java @@ -0,0 +1,457 @@ +package com.furkannm.skriptnms.nms.versions; + +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; +import net.minecraft.server.v1_13_R2.IBlockData; +import net.minecraft.server.v1_13_R2.NBTTagList; +import net.minecraft.server.v1_13_R2.BlockPosition; +import net.minecraft.server.v1_13_R2.MojangsonParser; +import net.minecraft.server.v1_13_R2.NBTBase; +import net.minecraft.server.v1_13_R2.NBTCompressedStreamTools; +import net.minecraft.server.v1_13_R2.NBTTagByte; +import net.minecraft.server.v1_13_R2.NBTTagCompound; +import net.minecraft.server.v1_13_R2.NBTTagDouble; +import net.minecraft.server.v1_13_R2.NBTTagFloat; +import net.minecraft.server.v1_13_R2.NBTTagInt; +import net.minecraft.server.v1_13_R2.NBTTagLong; +import net.minecraft.server.v1_13_R2.NBTTagShort; +import net.minecraft.server.v1_13_R2.NBTTagString; +import net.minecraft.server.v1_13_R2.TileEntity; +import net.minecraft.server.v1_13_R2.World; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.ItemStack; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; +import ch.njol.skript.util.slot.Slot; + +import com.furkannm.skriptnms.nms.DatFile; +import com.furkannm.skriptnms.nms.NMS; + +public class v1_13_R2 extends NMS{ + + @Override + public Object[] getNBT(Object tar) { + if (tar instanceof Entity) { + return new Object[] { (NBTTagCompound) getEntityNBT((Entity) tar) }; + }else if (tar instanceof Block) { + return new Object[] { (NBTTagCompound) getTileNBT((Block) tar) }; + }else if (tar instanceof ItemStack) { + return new Object[] { (NBTTagCompound) getItemNBT((ItemStack) tar) }; + }else if (tar instanceof Slot) { + return new Object[] { (NBTTagCompound) getItemNBT(((Slot) tar).getItem()) }; + } + return null; + } + + @Override + public void addTargetsNBT(Object tar, Object nbt) { + if (tar instanceof Entity) { + Object entNBT = (NBTTagCompound) getEntityNBT((Entity) tar); + removeFromCompound((NBTTagCompound) nbt, "UUIDMost", "UUIDLeast", "WorldUUDMost", "WorldUUIDLeast", "Bukkit.updateLevel"); + addToCompound(entNBT, (NBTTagCompound) nbt); + setEntityNBT((Entity) tar, entNBT); + }else if (tar instanceof Block) { + Object blockNBT = (NBTTagCompound) getTileNBT((Block) tar); + removeFromCompound((NBTTagCompound) nbt, "x", "y", "z", "id"); + addToCompound(blockNBT, (NBTTagCompound) nbt); + setTileNBT((Block) tar, blockNBT); + }else if (tar instanceof ItemStack) { + Skript.warning("Failed to change the NBT of an item: Itemstack didn't have any slot attached to it."); + }else if (tar instanceof Slot) { + ItemStack slotItem = ((Slot) tar).getItem(); + Object itemNBT = (NBTTagCompound) getItemNBT(slotItem); + addToCompound(itemNBT, (NBTTagCompound) nbt); + ItemStack newItem = getItemWithNBT(slotItem, itemNBT); + ((Slot) tar).setItem(newItem); + } + } + + @Override + public void removeTargetsNBT(Object tar, Object[] nbt) { + if (tar instanceof Entity) { + Object entNBT = (NBTTagCompound) (getEntityNBT((Entity) tar)); + for (Object s : nbt) { + if (s != "UUIDMost" || s != "UUIDLeast" || s != "WorldUUIDMost" || s != "WorldUUIDLeast" || s != "Bukkit.updateLevel") { + removeFromCompound((NBTTagCompound) (entNBT), (String) s); + } + } + setEntityNBT((Entity) tar, (NBTTagCompound) (entNBT)); + }else if (tar instanceof Block) { + Object blockNBT = (NBTTagCompound) (getTileNBT((Block) tar)); + for (Object s : nbt) { + if (s != "x" || s != "y" || s != "z" || s != "id") { + removeFromCompound((NBTTagCompound) (blockNBT), (String) s); + } + } + setTileNBT((Block) tar, (NBTTagCompound) (blockNBT)); + }else if (tar instanceof ItemStack) { + Skript.warning("Failed to change the NBT of an item: Itemstack didn't have any slot attached to it."); + }else if (tar instanceof Slot) { + ItemStack slotItem = ((Slot) tar).getItem(); + Object itemNBT = (NBTTagCompound) (getItemNBT(slotItem)); + String[] toRemove = Arrays.copyOf(nbt, nbt.length, String[].class); + removeFromCompound(itemNBT, toRemove); + ItemStack newItem = getItemWithNBT(slotItem, (NBTTagCompound) (itemNBT)); + ((Slot) tar).setItem(newItem); + } + } + + @Override + public void deleteTargetsNBT(Object tar) { + if (!(tar instanceof Slot)) return; + ItemStack slotItem = ((Slot) tar).getItem(); + ItemStack newItem = getItemWithNBT(slotItem, (NBTTagCompound) (null)); + ((Slot) tar).setItem(newItem); + } + + @Override + public Object getNBTTag(Object compound, String tag) { + if(compound instanceof NBTTagCompound) { + return ((NBTTagCompound) compound).get(tag); + } + return null; + } + + @Override + public void setNBTTag(Object compound, String tag, Object toSet) { + if(compound instanceof NBTTagCompound) { + NBTBase base = null; + if(toSet instanceof Number) { + base = (NBTBase) convertToNBT((Number) toSet); + }else if(toSet instanceof String) { + base = (NBTBase) convertToNBT((String) toSet); + }else{ + base = (NBTBase) toSet; + } + ((NBTTagCompound) compound).set(tag, base); + } + } + + @Override + public void removeNBTTag(Object compound, String tag) { + if (compound instanceof NBTTagCompound) { + ((NBTTagCompound) compound).remove(tag); + } + } + + @Override + public void addToCompound(Object compound, Object toAdd) { + if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) { + ((NBTTagCompound) (compound)).a((NBTTagCompound) toAdd); + } + } + + @Override + public void removeFromCompound(Object compound, String... toRemove) { + if (compound instanceof NBTTagCompound) { + for (String s : toRemove) { + ((NBTTagCompound) (compound)).remove(s); + } + } + } + + @Override + public Object getTileNBT(Block block) { + NBTTagCompound NBT = new NBTTagCompound(); + World nmsWorld = ((CraftWorld) block.getWorld()).getHandle(); + TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ())); + if (tileEntity == null) + return null; + tileEntity.save(NBT); + return NBT; + } + + @Override + public Object getEntityNBT(Entity entity) { + net.minecraft.server.v1_13_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + NBTTagCompound NBT = new NBTTagCompound(); + nmsEntity.c(NBT); + return NBT; + } + + @Override + public Object getItemNBT(ItemStack itemStack) { + if (itemStack == null || itemStack.getType() == Material.AIR) + return null; + NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag(); + if (itemNBT == null) + itemNBT = new NBTTagCompound(); + return itemNBT; + } + + @Override + public Object parseRawNBT(String rawNBT) { + NBTTagCompound parsedNBT = null; + try { + parsedNBT = MojangsonParser.parse(rawNBT); + } catch (Exception e) { + Skript.warning("Error when parsing NBT - " + e.getMessage()); + return null; + } + return parsedNBT; + } + + @Override + public void setTileNBT(Block block, Object newCompound) { + if (newCompound instanceof NBTTagCompound) { + World nmsWorld = ((CraftWorld) block.getWorld()).getHandle(); + TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ())); + if (tileEntity == null) + return; + tileEntity.load((NBTTagCompound) newCompound); + tileEntity.update(); + IBlockData tileEntType = nmsWorld.getType(new BlockPosition(block.getX(),block.getY(),block.getZ())); + nmsWorld.notify(tileEntity.getPosition(), tileEntType, tileEntType, 3); + } + } + + @Override + public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) { + net.minecraft.server.v1_13_R2.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack); + if (compound instanceof NBTTagCompound && itemStack != null) { + if (itemStack.getType() == Material.AIR) + return null; + if (((NBTTagCompound) compound).isEmpty()) + return itemStack; + nmsItem.setTag((NBTTagCompound) compound); + ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem); + return newItem; + } else if (compound == null) { + nmsItem.setTag(null); + ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem); + return newItem; + } + return itemStack; + } + + @Override + public void setEntityNBT(Entity entity, Object newCompound) { + if (newCompound instanceof NBTTagCompound) { + net.minecraft.server.v1_13_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.f((NBTTagCompound) newCompound); + } + } + + @Override + public Object convertToNBT(Number number) { + if (number instanceof Byte) { + return new NBTTagByte((Byte) number); + } else if (number instanceof Short) { + return new NBTTagShort((Short) number); + } else if (number instanceof Integer) { + return new NBTTagInt((Integer) number); + } else if (number instanceof Long) { + return new NBTTagLong((Long) number); + } else if (number instanceof Float) { + return new NBTTagFloat((Float) number); + } else if (number instanceof Double) { + return new NBTTagDouble((Double) number); + } + return null; + } + + @Override + public Object convertToNBT(String string) { + return new NBTTagString(string); + } + + @Override + public void loadFileNbt(File file) { + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + } catch (FileNotFoundException e) { + Skript.warning("Error when loading file NBT - " + e.getMessage()); + } + Object fileNBT = null; + try { + fileNBT = NBTCompressedStreamTools.a(fis); + fis.close(); + } catch (IOException ex) { + if (ex instanceof EOFException) { + ; + } else { + ex.printStackTrace(); + } + } + DatFile.loadDatFile(file, fileNBT); + } + + @Override + public void setFileNBT(File file, Object newCompound) { + if (newCompound instanceof NBTTagCompound) { + OutputStream os = null; + try { + os = new FileOutputStream(file); + } catch (FileNotFoundException ex) { + ex.printStackTrace(); + } + try { + NBTCompressedStreamTools.a((NBTTagCompound) newCompound,os); + os.close(); + } catch (IOException | IllegalArgumentException | SecurityException e) { + if (!(e instanceof EOFException)) { + e.printStackTrace(); + } + } + } + } + + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).remove(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).c(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).asByte(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).asShort(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).asInt(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).asLong(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).asFloat(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).asDouble(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).asString(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } + +} diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_8_R3.java b/src/com/furkannm/skriptnms/nms/versions/v1_8_R3.java index 478b463..f554717 100644 --- a/src/com/furkannm/skriptnms/nms/versions/v1_8_R3.java +++ b/src/com/furkannm/skriptnms/nms/versions/v1_8_R3.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import java.util.Arrays; +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; import net.minecraft.server.v1_8_R3.BlockPosition; import net.minecraft.server.v1_8_R3.MojangsonParser; import net.minecraft.server.v1_8_R3.NBTBase; @@ -18,6 +20,7 @@ import net.minecraft.server.v1_8_R3.NBTTagDouble; import net.minecraft.server.v1_8_R3.NBTTagFloat; import net.minecraft.server.v1_8_R3.NBTTagInt; +import net.minecraft.server.v1_8_R3.NBTTagList; import net.minecraft.server.v1_8_R3.NBTTagLong; import net.minecraft.server.v1_8_R3.NBTTagShort; import net.minecraft.server.v1_8_R3.NBTTagString; @@ -33,6 +36,10 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.slot.Slot; import com.furkannm.skriptnms.nms.DatFile; @@ -306,5 +313,143 @@ public void setFileNBT(File file, Object newCompound) { } } } + + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).a(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).g(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).f(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).e(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).d(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).c(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).h(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).g(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).a_(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } } diff --git a/src/com/furkannm/skriptnms/nms/versions/v1_9_R1.java b/src/com/furkannm/skriptnms/nms/versions/v1_9_R1.java index c917050..518957a 100644 --- a/src/com/furkannm/skriptnms/nms/versions/v1_9_R1.java +++ b/src/com/furkannm/skriptnms/nms/versions/v1_9_R1.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import java.util.Arrays; +import ch.njol.skript.classes.Changer; +import ch.njol.util.coll.CollectionUtils; import net.minecraft.server.v1_9_R1.IBlockData; import net.minecraft.server.v1_9_R1.BlockPosition; import net.minecraft.server.v1_9_R1.MojangsonParser; @@ -19,6 +21,7 @@ import net.minecraft.server.v1_9_R1.NBTTagDouble; import net.minecraft.server.v1_9_R1.NBTTagFloat; import net.minecraft.server.v1_9_R1.NBTTagInt; +import net.minecraft.server.v1_9_R1.NBTTagList; import net.minecraft.server.v1_9_R1.NBTTagLong; import net.minecraft.server.v1_9_R1.NBTTagShort; import net.minecraft.server.v1_9_R1.NBTTagString; @@ -34,6 +37,10 @@ import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.util.slot.Slot; import com.furkannm.skriptnms.nms.DatFile; @@ -308,5 +315,143 @@ public void setFileNBT(File file, Object newCompound) { } } } + + @Override + public Object[] getContents(Object nbtList) { + if (nbtList instanceof NBTTagList) { + Object[] contents = new Object[((NBTTagList) nbtList).size()]; + for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) { + if (getIndex(nbtList, i) != null) { + contents[i] = getIndex(nbtList, i); + } + } + return contents; + } + return null; + } + + @Override + public void addToList(Object nbtList, Object toAdd) { + if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) { + ((NBTTagList) nbtList).add((NBTBase) toAdd); + } + } + + @Override + public void removeFromList(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + ((NBTTagList) nbtList).remove(index); + } + } + + @Override + public void setIndex(Object nbtList, int index, Object toSet) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + if (toSet instanceof NBTBase) { + ((NBTTagList) nbtList).a(index, (NBTBase) toSet); + } else if (toSet instanceof Number) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((Number) toSet)); + } else if (toSet instanceof String) { + ((NBTTagList) nbtList).a(index, (NBTBase) convertToNBT((String) toSet)); + } + } + } + + @Override + public Object getIndex(Object nbtList, int index) { + if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) { + NBTBase value = ((NBTTagList) nbtList).h(index); + if (value instanceof NBTTagByte) { + return ((NBTTagByte) value).f(); + } else if (value instanceof NBTTagShort) { + return ((NBTTagShort) value).e(); + } else if (value instanceof NBTTagInt) { + return ((NBTTagInt) value).d(); + } else if (value instanceof NBTTagLong) { + return ((NBTTagLong) value).c(); + } else if (value instanceof NBTTagFloat) { + return ((NBTTagFloat) value).h(); + } else if (value instanceof NBTTagDouble) { + return ((NBTTagDouble) value).g(); + } else if (value instanceof NBTTagString) { + return ((NBTTagString) value).a_(); + } else if (value instanceof NBTBase) { + return value; + } + } + return null; + } + + @Override + public Class getCompoundClass() { + return NBTTagCompound.class; + } + + @Override + public Class getBaseClass() { + return NBTBase.class; + } + + @Override + public void registerNbtCompound() { + Classes.registerClass(new ClassInfo(NBTTagCompound.class, "compound") + .user("nbt ?(compound)?") + .name("NBT Compound") + .since("0.1.3") + .parser(new Parser() { + + @Override + public String getVariableNamePattern() { + return ".+"; + } + + @Override + @javax.annotation.Nullable + public NBTTagCompound parse(String s, ParseContext context) { + if (s.startsWith("nbt:{") && s.endsWith("}")) { + NBTTagCompound nbt = (NBTTagCompound) parseRawNBT(s.substring(4)); + return nbt; + } + return null; + } + + @Override + public String toString(NBTTagCompound nbt, int arg1) { + return nbt.toString(); + } + + @Override + public String toVariableNameString(NBTTagCompound nbt) { + return nbt.toString(); + } + }).changer(new Changer() { + @Override + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { + return CollectionUtils.array(String.class, NBTTagCompound.class); + } + return null; + } + + @Override + public void change(NBTTagCompound[] compounds, Object[] values, ChangeMode mode) { + if (mode == ChangeMode.ADD) { + if (values[0] instanceof String) { + Object parsedNBT = parseRawNBT((String) values[0]); + addToCompound(compounds[0], parsedNBT); + } else { + addToCompound(compounds[0], values[0]); + } + } else if (mode == ChangeMode.REMOVE) { + if (values[0] instanceof NBTTagCompound) + return; + for (Object s : values) { + compounds[0].remove((String) s); + } + } + } + }) + ); + } }