Annoying stacktraces when a NBT parse fails are finally gone...
... the effect "add "{blah:someValue}" to nbt of {_something}" now properly supports versions below 1.8
This commit is contained in:
parent
8e785c04cb
commit
5665f39cb5
@ -1,6 +1,6 @@
|
|||||||
name: SkStuff
|
name: SkStuff
|
||||||
author: TheBukor
|
author: TheBukor
|
||||||
description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support.
|
description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support.
|
||||||
version: 1.4.1.3
|
version: 1.4.2
|
||||||
main: me.TheBukor.SkStuff.SkStuff
|
main: me.TheBukor.SkStuff.SkStuff
|
||||||
softdepend: [Skript, WorldEdit]
|
softdepend: [Skript, WorldEdit]
|
@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -58,6 +59,7 @@ import me.TheBukor.SkStuff.expressions.ExprToLowerCase;
|
|||||||
import me.TheBukor.SkStuff.expressions.ExprToUpperCase;
|
import me.TheBukor.SkStuff.expressions.ExprToUpperCase;
|
||||||
import me.TheBukor.SkStuff.expressions.ExprVanishState;
|
import me.TheBukor.SkStuff.expressions.ExprVanishState;
|
||||||
import me.TheBukor.SkStuff.expressions.ExprWordsToUpperCase;
|
import me.TheBukor.SkStuff.expressions.ExprWordsToUpperCase;
|
||||||
|
import me.TheBukor.SkStuff.util.NBTUtil;
|
||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||||
|
|
||||||
public class SkStuff extends JavaPlugin {
|
public class SkStuff extends JavaPlugin {
|
||||||
@ -93,8 +95,6 @@ public class SkStuff extends JavaPlugin {
|
|||||||
|
|
||||||
Classes.registerClass(new ClassInfo<Object>((Class<Object>) nbtClass, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<Object>() {
|
Classes.registerClass(new ClassInfo<Object>((Class<Object>) nbtClass, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<Object>() {
|
||||||
|
|
||||||
private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public Class<?>[] acceptChange(ChangeMode mode) {
|
public Class<?>[] acceptChange(ChangeMode mode) {
|
||||||
@ -106,25 +106,16 @@ public class SkStuff extends JavaPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void change(Object[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
public void change(Object[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||||
Boolean using1_7 = false;
|
|
||||||
String bukkitVersion = ReflectionUtils.getVersion();
|
|
||||||
if (bukkitVersion.startsWith("v1_7_R")) {
|
|
||||||
using1_7 = true;
|
|
||||||
}
|
|
||||||
String newTags = (String) delta[0];
|
String newTags = (String) delta[0];
|
||||||
if (mode == ChangeMode.ADD) {
|
if (mode == ChangeMode.ADD) {
|
||||||
Object NBT1 = null;
|
Object NBT1 = null;
|
||||||
try {
|
try {
|
||||||
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
||||||
if (!using1_7) {
|
NBTUtil.addCompound(NBT[0], NBT1);
|
||||||
NBT.getClass().getMethod("a", nbtClass).invoke(NBT, NBT1);
|
|
||||||
} else {
|
|
||||||
NBT.getClass().getMethod("set", String.class, nbtBaseClass).invoke(NBT, "", NBT1);
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -151,7 +142,7 @@ public class SkStuff extends JavaPlugin {
|
|||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public Object parse(String s, ParseContext context) {
|
public Object parse(String s, ParseContext context) {
|
||||||
if (s.startsWith("{")) {
|
if (s.startsWith("{") && s.endsWith("}")) {
|
||||||
Object NBT = null;
|
Object NBT = null;
|
||||||
try {
|
try {
|
||||||
NBT = nbtClass.newInstance();
|
NBT = nbtClass.newInstance();
|
||||||
@ -164,7 +155,7 @@ public class SkStuff extends JavaPlugin {
|
|||||||
nbtClass.getMethod("a", nbtClass).invoke(NBT, NBT1);
|
nbtClass.getMethod("a", nbtClass).invoke(NBT, NBT1);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -235,6 +226,7 @@ public class SkStuff extends JavaPlugin {
|
|||||||
evtWE = true;
|
evtWE = true;
|
||||||
} catch (ClassNotFoundException ex) {
|
} catch (ClassNotFoundException ex) {
|
||||||
Skript.error("Unable to register \"On WorldEdit block change\" event! You will need to upgrade to WorldEdit 6.0");
|
Skript.error("Unable to register \"On WorldEdit block change\" event! You will need to upgrade to WorldEdit 6.0");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
condAmount += 1;
|
condAmount += 1;
|
||||||
effAmount += 12;
|
effAmount += 12;
|
||||||
|
@ -13,24 +13,23 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
|
|
||||||
import ch.njol.skript.Skript;
|
|
||||||
import ch.njol.skript.classes.Changer.ChangeMode;
|
import ch.njol.skript.classes.Changer.ChangeMode;
|
||||||
import ch.njol.skript.lang.Expression;
|
import ch.njol.skript.lang.Expression;
|
||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||||
import ch.njol.skript.lang.util.SimpleExpression;
|
import ch.njol.skript.lang.util.SimpleExpression;
|
||||||
import ch.njol.util.Kleenean;
|
import ch.njol.util.Kleenean;
|
||||||
import ch.njol.util.coll.CollectionUtils;
|
import ch.njol.util.coll.CollectionUtils;
|
||||||
|
import me.TheBukor.SkStuff.util.NBTUtil;
|
||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||||
|
|
||||||
public class ExprFileNBT extends SimpleExpression<Object> {
|
public class ExprFileNBT extends SimpleExpression<Object> {
|
||||||
private Expression<String> input;
|
private Expression<String> input;
|
||||||
private boolean using1_7 = false;
|
|
||||||
|
|
||||||
private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
|
|
||||||
private Class<?> nbtToolsClass = ReflectionUtils.getNMSClass("NBTCompressedStreamTools");
|
|
||||||
private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
|
private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
|
||||||
|
private Class<?> nbtCompressedClass = ReflectionUtils.getNMSClass("NBTCompressedStreamTools");
|
||||||
private Class<?> nbtParserClass = ReflectionUtils.getNMSClass("MojangsonParser");
|
private Class<?> nbtParserClass = ReflectionUtils.getNMSClass("MojangsonParser");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -47,10 +46,6 @@ public class ExprFileNBT extends SimpleExpression<Object> {
|
|||||||
@Override
|
@Override
|
||||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
|
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
|
||||||
input = (Expression<String>) expr[0];
|
input = (Expression<String>) expr[0];
|
||||||
String bukkitVersion = ReflectionUtils.getVersion();
|
|
||||||
if (bukkitVersion.startsWith("v1_7_R")) {
|
|
||||||
using1_7 = true;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,12 +66,12 @@ public class ExprFileNBT extends SimpleExpression<Object> {
|
|||||||
return null; // File doesn't exist
|
return null; // File doesn't exist
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
NBT = nbtToolsClass.getMethod("a", FileInputStream.class).invoke(NBT, fis);
|
NBT = nbtCompressedClass.getMethod("a", FileInputStream.class).invoke(NBT, fis);
|
||||||
fis.close();
|
fis.close();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -107,21 +102,17 @@ public class ExprFileNBT extends SimpleExpression<Object> {
|
|||||||
if (mode == ChangeMode.ADD) {
|
if (mode == ChangeMode.ADD) {
|
||||||
try {
|
try {
|
||||||
Object NBT = null;
|
Object NBT = null;
|
||||||
NBT = nbtToolsClass.getMethod("a", FileInputStream.class).invoke(NBT, fis);
|
NBT = nbtCompressedClass.getMethod("a", FileInputStream.class).invoke(NBT, fis);
|
||||||
Object NBT1 = null;
|
Object NBT1 = null;
|
||||||
NBT1 = nbtParserClass.getMethod("parse", nbtClass).invoke(NBT1, tags);
|
NBT1 = nbtParserClass.getMethod("parse", nbtClass).invoke(NBT1, tags);
|
||||||
if (!using1_7) {
|
NBTUtil.addCompound(NBT, NBT1);
|
||||||
NBT.getClass().getMethod("a", nbtClass).invoke(NBT, NBT1);
|
nbtCompressedClass.getMethod("a", nbtClass, FileOutputStream.class).invoke(nbtCompressedClass.newInstance(), NBT, os);
|
||||||
} else {
|
|
||||||
NBT.getClass().getMethod("set", String.class, nbtBaseClass).invoke(NBT, "", NBT1);
|
|
||||||
}
|
|
||||||
nbtToolsClass.getMethod("a", nbtClass, FileOutputStream.class).invoke(nbtToolsClass.newInstance(), NBT, os);
|
|
||||||
fis.close();
|
fis.close();
|
||||||
os.close();
|
os.close();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -138,18 +129,17 @@ public class ExprFileNBT extends SimpleExpression<Object> {
|
|||||||
} else if (mode == ChangeMode.REMOVE) {
|
} else if (mode == ChangeMode.REMOVE) {
|
||||||
try {
|
try {
|
||||||
Object NBT = null;
|
Object NBT = null;
|
||||||
NBT = nbtToolsClass.getMethod("a", FileInputStream.class).invoke(NBT, fis);
|
NBT = nbtCompressedClass.getMethod("a", FileInputStream.class).invoke(NBT, fis);
|
||||||
for (Object s : delta) {
|
for (Object s : delta) {
|
||||||
nbtClass.getMethod("remove", String.class).invoke(NBT, s);
|
nbtClass.getMethod("remove", String.class).invoke(NBT, s);
|
||||||
}
|
}
|
||||||
nbtToolsClass.getMethod("a", nbtClass, FileOutputStream.class).invoke(nbtToolsClass.newInstance(), NBT, os);
|
nbtCompressedClass.getMethod("a", nbtClass, FileOutputStream.class).invoke(nbtCompressedClass.newInstance(), NBT, os);
|
||||||
Bukkit.broadcastMessage("\n\nSecond: " + NBT.toString());
|
|
||||||
fis.close();
|
fis.close();
|
||||||
os.close();
|
os.close();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
@ -2,12 +2,12 @@ package me.TheBukor.SkStuff.expressions;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import ch.njol.skript.Skript;
|
|
||||||
import ch.njol.skript.lang.Expression;
|
import ch.njol.skript.lang.Expression;
|
||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||||
import ch.njol.skript.lang.util.SimpleExpression;
|
import ch.njol.skript.lang.util.SimpleExpression;
|
||||||
@ -69,8 +69,8 @@ public class ExprItemNBT extends SimpleExpression<ItemStack> {
|
|||||||
}
|
}
|
||||||
nmsItem.getClass().getMethod("setTag", nbtClass).invoke(nmsItem, NBT);
|
nmsItem.getClass().getMethod("setTag", nbtClass).invoke(nmsItem, NBT);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
Skript.warning(ChatColor.RED + "Error when parsing NBT - " + ex.getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,14 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import ch.njol.skript.Skript;
|
|
||||||
import ch.njol.skript.classes.Changer.ChangeMode;
|
import ch.njol.skript.classes.Changer.ChangeMode;
|
||||||
import ch.njol.skript.lang.Expression;
|
import ch.njol.skript.lang.Expression;
|
||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||||
@ -18,13 +19,12 @@ import ch.njol.skript.lang.util.SimpleExpression;
|
|||||||
import ch.njol.skript.util.Slot;
|
import ch.njol.skript.util.Slot;
|
||||||
import ch.njol.util.Kleenean;
|
import ch.njol.util.Kleenean;
|
||||||
import ch.njol.util.coll.CollectionUtils;
|
import ch.njol.util.coll.CollectionUtils;
|
||||||
|
import me.TheBukor.SkStuff.util.NBTUtil;
|
||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||||
|
|
||||||
public class ExprNBTOf extends SimpleExpression<Object> {
|
public class ExprNBTOf extends SimpleExpression<Object> {
|
||||||
private Boolean using1_7 = false;
|
|
||||||
private Expression<?> target;
|
private Expression<?> target;
|
||||||
|
|
||||||
private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
|
|
||||||
private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
|
private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
|
||||||
private Class<?> nbtParserClass = ReflectionUtils.getNMSClass("MojangsonParser");
|
private Class<?> nbtParserClass = ReflectionUtils.getNMSClass("MojangsonParser");
|
||||||
private Class<?> nmsPosClass = ReflectionUtils.getNMSClass("BlockPosition");
|
private Class<?> nmsPosClass = ReflectionUtils.getNMSClass("BlockPosition");
|
||||||
@ -47,10 +47,6 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
@Override
|
@Override
|
||||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
|
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
|
||||||
target = expr[0];
|
target = expr[0];
|
||||||
String bukkitVersion = ReflectionUtils.getVersion();
|
|
||||||
if (bukkitVersion.startsWith("v1_7_R")) {
|
|
||||||
using1_7 = true;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,21 +130,17 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
try {
|
try {
|
||||||
Object NBT1 = null;
|
Object NBT1 = null;
|
||||||
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
||||||
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "UUIDMost");
|
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "UUIDMost"); // Prevent crucial data from being modified
|
||||||
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "UUIDLeast");
|
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "UUIDLeast"); // Prevent crucial data from being modified
|
||||||
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "WorldUUIDMost");
|
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "WorldUUIDMost"); // Prevent crucial data from being modified
|
||||||
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "WorldUUIDLeast");
|
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "WorldUUIDLeast"); // Prevent crucial data from being modified
|
||||||
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "Bukkit.updateLevel");
|
NBT1.getClass().getMethod("remove", String.class).invoke(NBT1, "Bukkit.updateLevel"); // Prevent crucial data from being modified
|
||||||
if (!using1_7) {
|
NBTUtil.addCompound(NBT, NBT1);
|
||||||
NBT.getClass().getMethod("a", nbtClass).invoke(NBT, NBT1);
|
|
||||||
} else {
|
|
||||||
NBT.getClass().getMethod("set", String.class, nbtBaseClass).invoke(NBT, "", NBT1);
|
|
||||||
}
|
|
||||||
nmsEnt.getClass().getMethod("f", nbtClass).invoke(nmsEnt, NBT);
|
nmsEnt.getClass().getMethod("f", nbtClass).invoke(nmsEnt, NBT);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException")) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -157,7 +149,7 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
}
|
}
|
||||||
} else if (mode == ChangeMode.REMOVE) {
|
} else if (mode == ChangeMode.REMOVE) {
|
||||||
for (Object s : delta) {
|
for (Object s : delta) {
|
||||||
if (s != "UUIDMost" || s != "UUIDLeast" || s != "WorldUUIDMost" || s != "WorldUUIDLeast" || s != "Bukkit.updateLevel") {
|
if (s != "UUIDMost" || s != "UUIDLeast" || s != "WorldUUIDMost" || s != "WorldUUIDLeast" || s != "Bukkit.updateLevel") { // Prevent crucial data from being modified
|
||||||
try {
|
try {
|
||||||
NBT.getClass().getMethod("remove", String.class).invoke(NBT, (String) s);
|
NBT.getClass().getMethod("remove", String.class).invoke(NBT, (String) s);
|
||||||
nmsEnt.getClass().getMethod("f", nbtClass).invoke(nmsEnt, NBT);
|
nmsEnt.getClass().getMethod("f", nbtClass).invoke(nmsEnt, NBT);
|
||||||
@ -193,11 +185,7 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
try {
|
try {
|
||||||
Object NBT1 = null;
|
Object NBT1 = null;
|
||||||
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
||||||
if (!using1_7) {
|
NBTUtil.addCompound(NBT, NBT1);
|
||||||
NBT.getClass().getMethod("a", nbtClass).invoke(NBT, NBT1);
|
|
||||||
} else {
|
|
||||||
NBT.getClass().getMethod("set", String.class, nbtBaseClass).invoke(NBT, "", NBT1);
|
|
||||||
}
|
|
||||||
NBT1.getClass().getMethod("setInt", String.class, int.class).invoke(NBT1, "x", block.getX());
|
NBT1.getClass().getMethod("setInt", String.class, int.class).invoke(NBT1, "x", block.getX());
|
||||||
NBT1.getClass().getMethod("setInt", String.class, int.class).invoke(NBT1, "y", block.getY());
|
NBT1.getClass().getMethod("setInt", String.class, int.class).invoke(NBT1, "y", block.getY());
|
||||||
NBT1.getClass().getMethod("setInt", String.class, int.class).invoke(NBT1, "z", block.getZ());
|
NBT1.getClass().getMethod("setInt", String.class, int.class).invoke(NBT1, "z", block.getZ());
|
||||||
@ -206,8 +194,8 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
nmsWorld.getClass().getMethod("notify", nmsPosClass).invoke(nmsWorld, tileEntity.getClass().getMethod("getPosition").invoke(tileEntity));
|
nmsWorld.getClass().getMethod("notify", nmsPosClass).invoke(nmsWorld, tileEntity.getClass().getMethod("getPosition").invoke(tileEntity));
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException")) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -258,11 +246,7 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
try {
|
try {
|
||||||
Object NBT1 = null;
|
Object NBT1 = null;
|
||||||
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
NBT1 = nbtParserClass.getMethod("parse", String.class).invoke(NBT1, newTags);
|
||||||
if (!using1_7) {
|
NBTUtil.addCompound(NBT, NBT1);
|
||||||
NBT.getClass().getMethod("a", nbtClass).invoke(NBT, NBT1);
|
|
||||||
} else {
|
|
||||||
NBT.getClass().getMethod("set", String.class, nbtBaseClass).invoke(NBT, "", NBT1);
|
|
||||||
}
|
|
||||||
nmsItem.getClass().getMethod("setTag", nbtClass).invoke(nmsItem, NBT);
|
nmsItem.getClass().getMethod("setTag", nbtClass).invoke(nmsItem, NBT);
|
||||||
Object newItem = null;
|
Object newItem = null;
|
||||||
newItem = craftItemClass.getMethod("asCraftMirror", nmsItemClass).invoke(newItem, nmsItem);
|
newItem = craftItemClass.getMethod("asCraftMirror", nmsItemClass).invoke(newItem, nmsItem);
|
||||||
@ -273,8 +257,8 @@ public class ExprNBTOf extends SimpleExpression<Object> {
|
|||||||
((Slot) slot[0]).setItem((ItemStack) newItem);
|
((Slot) slot[0]).setItem((ItemStack) newItem);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
if (ex instanceof InvocationTargetException) {
|
if (ex instanceof InvocationTargetException) {
|
||||||
if (ex.getCause().getClass().getName().equals("MojangsonParseException") ) {
|
if (ex.getCause().getClass().getName().contains("MojangsonParseException") ) {
|
||||||
Skript.error("Error when parsing NBT - " + ex.getCause().getMessage());
|
Bukkit.getConsoleSender().sendMessage("[SkStuff] " + ChatColor.RED + "Error when parsing NBT - " + ex.getCause().getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
48
src/me/TheBukor/SkStuff/util/NBTUtil.java
Normal file
48
src/me/TheBukor/SkStuff/util/NBTUtil.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package me.TheBukor.SkStuff.util;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class NBTUtil {
|
||||||
|
private static Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
|
||||||
|
private static Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is actually a copy of the "a(NBTTagCompound)" method in the NBTTagCompound class using reflection
|
||||||
|
* I needed to add this because the 1.7 and before versions of the NBTTagCompound class didn't have this method,
|
||||||
|
* so there wasn't actually a reliable way to multiple tags at once into a compound.
|
||||||
|
* For the original code for the method, check https://github.com/linouxis9/mc-dev-1.8.7/blob/master/net/minecraft/server/NBTTagCompound.java#L348
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static void addCompound(Object source, Object toAdd) {
|
||||||
|
if (source.getClass().getName().contains("NBTTagCompound") && toAdd.getClass().getName().contains("NBTTagCompound")) {
|
||||||
|
try {
|
||||||
|
Field map = nbtClass.getDeclaredField("map");
|
||||||
|
map.setAccessible(true);
|
||||||
|
Set<String> keySet = (Set<String>) nbtClass.getMethod("c").invoke(toAdd);
|
||||||
|
Iterator<String> iterator = keySet.iterator();
|
||||||
|
|
||||||
|
while(iterator.hasNext()) {
|
||||||
|
String string = (String) iterator.next();
|
||||||
|
Object base = nbtBaseClass.cast((((HashMap<String, Object>) map.get(toAdd)).get(string)));
|
||||||
|
if((byte) nbtBaseClass.getMethod("getTypeId").invoke(base) == 10) {
|
||||||
|
if((boolean) nbtClass.getMethod("hasKeyOfType", String.class, int.class).invoke(source, string, 10)) {
|
||||||
|
Object NBT = null;
|
||||||
|
NBT = nbtClass.getMethod("getCompound", String.class).invoke(NBT, string);
|
||||||
|
NBTUtil.addCompound(NBT, base.getClass().cast(nbtClass));
|
||||||
|
} else {
|
||||||
|
nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(source, string, base.getClass().getMethod("clone").invoke(base));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(source, string, base.getClass().getMethod("clone").invoke(base));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map.setAccessible(false);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user