diff --git a/.classpath b/.classpath index 6c9e5e6..3706278 100644 --- a/.classpath +++ b/.classpath @@ -7,9 +7,10 @@ - + + diff --git a/bin/.gitignore b/bin/.gitignore index 4060509..9b0146c 100644 --- a/bin/.gitignore +++ b/bin/.gitignore @@ -1 +1,2 @@ /me/ +/protocollib/ diff --git a/plugin.yml b/plugin.yml index 80ac5e2..0f1d77c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: SkStuff author: TheBukor description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support. -version: 1.6.1 +version: 1.6.3 main: me.TheBukor.SkStuff.SkStuff softdepend: [Skript, WorldEdit, VanishNoPacket] \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/SkStuff.java b/src/me/TheBukor/SkStuff/SkStuff.java index 370db1d..464f5c8 100644 --- a/src/me/TheBukor/SkStuff/SkStuff.java +++ b/src/me/TheBukor/SkStuff/SkStuff.java @@ -32,7 +32,6 @@ import ch.njol.skript.registrations.EventValues; import ch.njol.skript.util.Getter; import me.TheBukor.SkStuff.conditions.CondSelectionContains; import me.TheBukor.SkStuff.effects.EffClearPathGoals; -import me.TheBukor.SkStuff.effects.EffClientChat; import me.TheBukor.SkStuff.effects.EffDrainLiquid; import me.TheBukor.SkStuff.effects.EffDrawLineWE; import me.TheBukor.SkStuff.effects.EffGZipFile; @@ -58,7 +57,6 @@ import me.TheBukor.SkStuff.events.WorldEditChangeHandler; import me.TheBukor.SkStuff.expressions.ExprChangedBlocksSession; import me.TheBukor.SkStuff.expressions.ExprClickedInventory; import me.TheBukor.SkStuff.expressions.ExprEditSessionLimit; -import me.TheBukor.SkStuff.expressions.ExprEndermanBlocks; import me.TheBukor.SkStuff.expressions.ExprFileNBT; import me.TheBukor.SkStuff.expressions.ExprFireProof; import me.TheBukor.SkStuff.expressions.ExprFlagOfWGRegion; @@ -66,6 +64,7 @@ import me.TheBukor.SkStuff.expressions.ExprFlagsOfWGRegion; import me.TheBukor.SkStuff.expressions.ExprGlideState; import me.TheBukor.SkStuff.expressions.ExprInventoryOwner; import me.TheBukor.SkStuff.expressions.ExprItemNBT; +import me.TheBukor.SkStuff.expressions.ExprLastLocation; import me.TheBukor.SkStuff.expressions.ExprMCIdOf; import me.TheBukor.SkStuff.expressions.ExprMCIdToItem; import me.TheBukor.SkStuff.expressions.ExprNBTListContents; @@ -77,6 +76,7 @@ import me.TheBukor.SkStuff.expressions.ExprSchematicArea; import me.TheBukor.SkStuff.expressions.ExprSelectionArea; import me.TheBukor.SkStuff.expressions.ExprSelectionOfPlayer; import me.TheBukor.SkStuff.expressions.ExprSelectionPos; +import me.TheBukor.SkStuff.expressions.ExprStepLength; import me.TheBukor.SkStuff.expressions.ExprTagOf; import me.TheBukor.SkStuff.expressions.ExprTimespanToNumber; import me.TheBukor.SkStuff.expressions.ExprToLowerCase; @@ -115,7 +115,7 @@ public class SkStuff extends JavaPlugin { exprAmount += 6; if (Skript.isRunningMinecraft(1, 9)) { getLogger().info("WOW! You're using Minecraft 1.9! Lemme register some cool stuff and fixes right away!"); - Skript.registerEffect(EffResourceSound.class, "play [raw] [([resource[ ]]pack)] sound %string% for %players% at %location% [[with] (0¦volume|1¦pitch) %-number%[[(,| and)] (0¦pitch|1¦volume) %-number%]]"); + Skript.registerEffect(EffResourceSound.class, "play [raw] [([resource[ ]]pack)] sound %string% (for|to) %players% at %location% [[with] volume %-number%[[(,| and)] pitch %-number%]]", "play [raw] [([resource[ ]]pack)] sound %string% for %players% at %location% [[with] pitch %-number%[[(,| and)] volume %-number%]]"); Skript.registerEvent("Elytra glide toggle", SimpleEvent.class, EntityToggleGlideEvent.class, "[entity] elytra (fl(y|ight)|glid(e|ing)) toggl(e|ing)", "[entity] toggle elytra (fl(y|ight)|glid(e|ing))"); Skript.registerExpression(ExprGlideState.class, Boolean.class, ExpressionType.PROPERTY, "elytra (fl(y|ight)|glid(e|ing)) state of %livingentity%", "%livingentity%'s elytra (fl(y|ight)|glid(e|ing)) state"); EventValues.registerEventValue(EntityToggleGlideEvent.class, Entity.class, new Getter() { @@ -136,7 +136,6 @@ public class SkStuff extends JavaPlugin { Skript.registerEffect(EffSetPathGoal.class, "add pathfind[er] goal [[with] priority %-integer%] (0¦(avoid|run away from) %*entitydatas%[, radius %-number%[, speed %-number%[, speed (if|when) (close|near) %-number%]]]|1¦break door[s]|2¦breed[,[move[ment]] speed %-number%]|3¦eat grass|4¦(flee from the sun|seek shad(e|ow))[, [move[ment]] speed %-number%]|5¦(float (in[side]|on) water|swim)|6¦follow (owner|tamer)[, speed %-number%[, min[imum] distance %-number%[, max[imum] distance %-number%]]]|7¦follow (adult|parent)[s][, [move[ment]] speed %-number%]|8¦(fight back|react to|target) (damager|attacker) [[of] type] %*entitydatas%[, call ([for] help|reinforcement) %-boolean%]|9¦o(c|z)elot jump on blocks[, [move[ment]] speed %-number%]|10¦leap at target[, [leap] height %-number%]|11¦look at %*entitydatas%[, (radius|max[imum] distance) %-number%]|12¦melee attack %*entitydatas%[, [move[ment]] speed %-number%[, (memorize|do('nt| not) forget) target [for [a] long[er] time] %-boolean%]]|13¦move to[wards] target[, [move[ment]] speed %-number%[, (radius|max[imum] distance) %-number%]]|14¦target nearest [entity [of] type] %*entitydatas%[, check sight %-boolean%]|15¦o(c|z)elot attack|16¦open door[s]|17¦(panic|flee)[, [move[ment]] speed %-number%]|18¦look around randomly|19¦(walk around randomly|wander)[, [move[ment]] speed %-number%[, min[imum] [of] %-timespan% between mov(e[ment][s]|ing)]]|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim around|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦((call|summon|wake) [other] [hidden] silverfish[es])|26¦[enderman] pick[[ ]up] block[s]|27¦[enderman] place block[s]|28¦[enderman] attack player (staring|looking) at [their] eye[s]]|29¦ghast move to[wards] target|30¦ghast (idle move[ment]|wander|random fl(ight|y[ing]))|31¦(tempt to|follow players (holding|with)) %-itemstack%[, [move[ment]] speed %number%[, scared of player movement %-boolean%]]|32¦target [random] %*entitydatas% (if|when) (not |un)tamed|33¦guardian attack [entities]|34¦[z[ombie[ ]]pig[man]] attack [player[s]] (if|when) angry|35¦[z[ombie[ ]]pig[man]] (react to|fight back|target) (attacker|damager) (if|when) angry|36¦[rabbit] eat carrot crops|37¦[killer] rabbit [melee] attack|38¦slime [random] jump|39¦slime change (direction|facing) randomly|40¦slime (idle move[ment]|wander)|41¦follow %*entitydatas%[, radius %-number%[, speed %-number%[, [custom[ ]]name[d] %-string%]]]) to %livingentities%"); Skript.registerEffect(EffMakeJump.class, "make %livingentities% jump", "force %livingentities% to jump"); Skript.registerEffect(EffGZipFile.class, "create [a] gzip[ped] file [at] [path] %string%"); - Skript.registerEffect(EffClientChat.class, "make %player% (say|chat) %string% client[( |-)]side", "force %player% to (say|chat) %string% client[( |-)]side"); Skript.registerExpression(ExprNBTOf.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] of %~object%", "%~object%'s nbt[[ ]tag[s]]"); Skript.registerExpression(ExprItemNBT.class, ItemStack.class, ExpressionType.SIMPLE, "%itemstack% with [custom] nbt[[ ]tag[s]] %string%"); Skript.registerExpression(ExprTagOf.class, Object.class, ExpressionType.PROPERTY, "[nbt[ ]]tag %string% of [[nbt] compound] %compound%"); @@ -145,13 +144,16 @@ public class SkStuff extends JavaPlugin { Skript.registerExpression(ExprNBTListContents.class, Object.class, ExpressionType.PROPERTY, "[all] contents (of|from) [nbt[ ]list] %nbtlist%", "[nbt[ ]list] %nbtlist% contents"); Skript.registerExpression(ExprNoClip.class, Boolean.class, ExpressionType.PROPERTY, "no[( |-)]clip (state|mode) of %entities%", "%entities%'s no[( |-)]clip (state|mode)"); Skript.registerExpression(ExprFireProof.class, Boolean.class, ExpressionType.PROPERTY, "fire[ ]proof (state|mode) of %entities%", "%entities%'s fire[ ]proof (state|mode)"); - Skript.registerExpression(ExprEndermanBlocks.class, ItemStack.class, ExpressionType.PROPERTY, "blocks that %entity% can (carry|hold|grab|steal)"); + //Skript.registerExpression(ExprEndermanBlocks.class, ItemStack.class, ExpressionType.PROPERTY, "blocks that %entity% can (carry|hold|grab|steal)"); Skript.registerExpression(ExprMCIdOf.class, String.class, ExpressionType.PROPERTY, "(mc|minecraft) [(string|native)] id of %itemtype%", "%itemtype%'s minecraft [(string|native)] id"); Skript.registerExpression(ExprMCIdToItem.class, ItemStack.class, ExpressionType.SIMPLE, "item[[ ](stack|type)] (of|from) (mc|minecraft) [(string|native)] id %string%"); + Skript.registerExpression(ExprLastLocation.class, Location.class, ExpressionType.SIMPLE, " "); + Skript.registerExpression(ExprStepLength.class, Number.class, ExpressionType.PROPERTY, "[the] step length of %entity%", "%entity%'s step length"); nmsMethods.registerCompoundClassInfo(); nmsMethods.registerNBTListClassInfo(); - effAmount += 6; - exprAmount += 11; + effAmount += 5; + exprAmount += 12; + // 13 with the ender blocks expression typeAmount += 2; } if (Bukkit.getPluginManager().getPlugin("WorldEdit") != null) { @@ -198,7 +200,7 @@ public class SkStuff extends JavaPlugin { }, 0); evtAmount += 1; } 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.x if you want to use it!"); } condAmount += 1; effAmount += 13; diff --git a/src/me/TheBukor/SkStuff/effects/EffResourceSound.java b/src/me/TheBukor/SkStuff/effects/EffResourceSound.java new file mode 100644 index 0000000..b985bca --- /dev/null +++ b/src/me/TheBukor/SkStuff/effects/EffResourceSound.java @@ -0,0 +1,57 @@ +package me.TheBukor.SkStuff.effects; + +import javax.annotation.Nullable; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; + +import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; + +public class EffResourceSound extends Effect { + private Expression sound; + private Expression players; + private Expression location; + private Expression volume; + private Expression pitch; + + private int pattern; + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] expr, int matchedPattern, Kleenean isDelayed, ParseResult result) { + sound = (Expression) expr[0]; + players = (Expression) expr[1]; + location = (Expression) expr[2]; + pattern = matchedPattern; + if (pattern == 0) { + volume = (Expression) expr[3]; + pitch = (Expression) expr[4]; + } else { + pitch = (Expression) expr[3]; + volume = (Expression) expr[4]; + } + return true; + } + + @Override + public String toString(@Nullable Event e, boolean debug) { + return "play raw sound for " + players.toString(e, debug) + " at " + location.toString(e, debug) + " with " + (pattern == 0 ? "volume " + volume.toString(e, debug) : "pitch " + pitch.toString(e, debug)) + " and " + (pattern == 0 ? "pitch " + pitch.toString(e, debug) : "volume " + volume.toString(e, debug)); + } + + @SuppressWarnings("deprecation") + @Override + protected void execute(Event e) { + String s = sound.getSingle(e); + Player[] ps = players.getAll(e); + Location loc = location.getSingle(e); + float vol = (volume == null ? 1.0F : volume.getSingle(e).floatValue()); + float pitch = (this.pitch == null ? 1.0F : this.pitch.getSingle(e).floatValue()); + for (Player p : ps) { + p.playSound(loc, s, vol, pitch ); + } + } +} \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/events/EvtWorldEditChange.java b/src/me/TheBukor/SkStuff/events/EvtWorldEditChange.java index b1fca1e..a677590 100644 --- a/src/me/TheBukor/SkStuff/events/EvtWorldEditChange.java +++ b/src/me/TheBukor/SkStuff/events/EvtWorldEditChange.java @@ -12,7 +12,7 @@ public class EvtWorldEditChange extends Event implements Cancellable { private boolean cancelled; private static final HandlerList handlers = new HandlerList(); - public EvtWorldEditChange(Player player, Block block) { + EvtWorldEditChange(Player player, Block block) { EvtWorldEditChange.player = player; EvtWorldEditChange.block = block; this.cancelled = false; diff --git a/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java b/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java index 2031a3c..eddb731 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java @@ -82,7 +82,6 @@ public class ExprEndermanBlocks extends SimpleExpression { items.add(bukkitItem); } catch (Exception ex) { ex.printStackTrace(); - ; } } return Arrays.copyOf(items.toArray(), items.size(), ItemStack[].class); diff --git a/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java b/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java index 27044f8..0d037ca 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java @@ -1,9 +1,5 @@ package me.TheBukor.SkStuff.expressions; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import javax.annotation.Nullable; import org.bukkit.entity.Entity; @@ -15,12 +11,11 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; -import me.TheBukor.SkStuff.util.ReflectionUtils; +import me.TheBukor.SkStuff.SkStuff; public class ExprFireProof extends SimpleExpression { private Expression entities; - private Class craftEntClass = ReflectionUtils.getOBCClass("entity.CraftEntity"); @Override public Class getReturnType() { return Boolean.class; @@ -47,40 +42,30 @@ public class ExprFireProof extends SimpleExpression { @Nullable protected Boolean[] get(Event e) { Entity[] ents = entities.getAll(e); - if (ents == null) + if (ents.length == 0) return null; - List fireProofStates = new ArrayList(); + Boolean[] fireProofStates = new Boolean[ents.length]; + int i = 0; for (Entity ent : ents) { if (ent == null) continue; - Object nmsEnt = null; - try { - nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); //nmsEnt = ((CraftEntity) ent).getHandle(); - } catch (Exception ex) { - ex.printStackTrace(); - } - fireProofStates.add((Boolean) ReflectionUtils.getField("fireProof", nmsEnt.getClass(), nmsEnt)); + fireProofStates[i] = SkStuff.getNMSMethods().getFireProof(ent); + i++; } - return Arrays.copyOf(fireProofStates.toArray(), fireProofStates.size(), Boolean[].class); + return fireProofStates; } @Override public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { Entity[] ents = entities.getAll(e); - if (ents == null) + if (ents.length == 0) return; if (mode == ChangeMode.SET) { Boolean newValue = (Boolean) delta[0]; for (Entity ent : ents) { if (ent == null) continue; - Object nmsEnt = null; - try { - nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); //nmsEnt = ((CraftEntity) ent).getHandle(); - } catch (Exception ex) { - ex.printStackTrace(); - } - ReflectionUtils.setField("fireProof", nmsEnt.getClass(), nmsEnt, newValue); + SkStuff.getNMSMethods().setFireProof(ent, newValue); } } } diff --git a/src/me/TheBukor/SkStuff/expressions/ExprInventoryOwner.java b/src/me/TheBukor/SkStuff/expressions/ExprInventoryOwner.java new file mode 100644 index 0000000..b88153c --- /dev/null +++ b/src/me/TheBukor/SkStuff/expressions/ExprInventoryOwner.java @@ -0,0 +1,62 @@ +package me.TheBukor.SkStuff.expressions; + +import javax.annotation.Nullable; + +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; + +import ch.njol.skript.Skript; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; + +public class ExprInventoryOwner extends SimpleExpression { + private Expression inventory; + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return Object.class; + } + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + inventory = (Expression) expr[0]; + return true; + } + + @Override + public String toString(@Nullable Event e, boolean debug) { + return "owner of " + inventory.toString(e, debug); + } + + @Override + @Nullable + protected Object[] get(Event e) { + if (inventory.getSingle(e) == null) + return null; + InventoryHolder holder = inventory.getSingle(e).getHolder(); + if (holder instanceof Entity) { + return new Entity[] { (Entity) holder }; + } else if (holder instanceof BlockState) { + return new Block[] { ((BlockState) holder).getBlock() }; + } else if (holder instanceof Block) { //Only happens for double chests, I believe + return new Block[] { (Block) holder }; + } else { + Skript.error("Something went wrong when trying to get the owner of the specified inventory!"); + Skript.error("Post the below info on the SkStuff thread in SkUnity:"); + Skript.error("Class -> " + holder.getClass().getCanonicalName()); + } + return null; + } +} \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/expressions/ExprLastLocation.java b/src/me/TheBukor/SkStuff/expressions/ExprLastLocation.java new file mode 100644 index 0000000..155389e --- /dev/null +++ b/src/me/TheBukor/SkStuff/expressions/ExprLastLocation.java @@ -0,0 +1,46 @@ +package me.TheBukor.SkStuff.expressions; + +import javax.annotation.Nullable; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; + +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; +import me.TheBukor.SkStuff.SkStuff; + +public class ExprLastLocation extends SimpleExpression { + private Expression entity; + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return Location.class; + } + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + entity = (Expression) expr[0]; + return true; + } + + @Override + public String toString(@Nullable Event e, boolean debug) { + return "last location of " + entity.toString(e, debug); + } + + @Override + @Nullable + protected Location[] get(Event e) { + Entity ent = entity.getSingle(e); + return new Location[] { SkStuff.getNMSMethods().getLastLocation(ent) }; + } +} \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/expressions/ExprNBTListIndex.java b/src/me/TheBukor/SkStuff/expressions/ExprNBTListIndex.java index aa675d1..e0b3116 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprNBTListIndex.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprNBTListIndex.java @@ -51,6 +51,7 @@ public class ExprNBTListIndex extends SimpleExpression { @Nullable protected Object[] get(Event e) { int i = index.getSingle(e).intValue(); + i--; Object list = nbtList.getSingle(e); return new Object[] { SkStuff.getNMSMethods().getIndex(list, i) }; } diff --git a/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java b/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java index a19f786..10e0063 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java @@ -1,9 +1,5 @@ package me.TheBukor.SkStuff.expressions; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import javax.annotation.Nullable; import org.bukkit.entity.Entity; @@ -15,13 +11,11 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; -import me.TheBukor.SkStuff.util.ReflectionUtils; +import me.TheBukor.SkStuff.SkStuff; public class ExprNoClip extends SimpleExpression { private Expression entities; - private Class craftEntClass = ReflectionUtils.getOBCClass("entity.CraftEntity"); - @Override public Class getReturnType() { return Boolean.class; @@ -48,40 +42,30 @@ public class ExprNoClip extends SimpleExpression { @Nullable protected Boolean[] get(Event e) { Entity[] ents = entities.getAll(e); - if (ents == null) + if (ents.length == 0) return null; - List noClipStates = new ArrayList(); + Boolean[] noClipStates = new Boolean[ents.length]; + int i = 0; for (Entity ent : ents) { if (ent == null) continue; - Object nmsEnt = null; - try { - nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); //nmsEnt = ((CraftEntity) ent).getHandle(); - } catch (Exception ex) { - ex.printStackTrace(); - } - noClipStates.add((Boolean) ReflectionUtils.getField("noclip", nmsEnt.getClass(), nmsEnt)); + noClipStates[i] = SkStuff.getNMSMethods().getNoClip(ent); + i++; } - return Arrays.copyOf(noClipStates.toArray(), noClipStates.size(), Boolean[].class); + return noClipStates; } @Override public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { Entity[] ents = entities.getAll(e); - if (ents == null) + if (ents.length == 0) return; if (mode == ChangeMode.SET) { Boolean newValue = (Boolean) delta[0]; for (Entity ent : ents) { if (ent == null) continue; - Object nmsEnt = null; - try { - nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); //nmsEnt = ((CraftEntity) ent).getHandle(); - } catch (Exception ex) { - ex.printStackTrace(); - } - ReflectionUtils.setField("noclip", nmsEnt.getClass(), nmsEnt, newValue); + SkStuff.getNMSMethods().setNoClip(ent, newValue); } } } diff --git a/src/me/TheBukor/SkStuff/expressions/ExprStepLength.java b/src/me/TheBukor/SkStuff/expressions/ExprStepLength.java new file mode 100644 index 0000000..6f63035 --- /dev/null +++ b/src/me/TheBukor/SkStuff/expressions/ExprStepLength.java @@ -0,0 +1,78 @@ +package me.TheBukor.SkStuff.expressions; + +import javax.annotation.Nullable; + +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; +import me.TheBukor.SkStuff.SkStuff; + +public class ExprStepLength extends SimpleExpression { + private Expression entity; + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return Number.class; + } + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + entity = (Expression) expr[0]; + return true; + } + + @Override + public String toString(@Nullable Event e, boolean debug) { + return "step length of " + entity.toString(e, debug); + } + + @Override + @Nullable + protected Number[] get(Event e) { + Entity ent = entity.getSingle(e); + if (ent == null) + return null; + return new Number[] { SkStuff.getNMSMethods().getEntityStepLength(ent) }; + } + + @Override + public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { + Entity ent = entity.getSingle(e); + if (ent == null) + return; + if (mode == ChangeMode.ADD) { + float toAdd = ((Number) delta[0]).floatValue(); + float currentLength = SkStuff.getNMSMethods().getEntityStepLength(ent); + SkStuff.getNMSMethods().setEntityStepLength(ent, (currentLength + toAdd)); + } else if (mode == ChangeMode.REMOVE) { + float toRemove = ((Number) delta[0]).floatValue(); + float currentLength = SkStuff.getNMSMethods().getEntityStepLength(ent); + SkStuff.getNMSMethods().setEntityStepLength(ent, (currentLength - toRemove)); + } else if (mode == ChangeMode.SET) { + float toSet = ((Number) delta[0]).floatValue(); + SkStuff.getNMSMethods().setEntityStepLength(ent, toSet); + } + } + + @SuppressWarnings("unchecked") + @Override + @Nullable + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) { + return CollectionUtils.array(Number.class); + } + return null; + } +} diff --git a/src/me/TheBukor/SkStuff/expressions/ExprTagOf.java b/src/me/TheBukor/SkStuff/expressions/ExprTagOf.java index ff4a985..21aa492 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprTagOf.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprTagOf.java @@ -10,13 +10,13 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import me.TheBukor.SkStuff.SkStuff; import me.TheBukor.SkStuff.util.ReflectionUtils; public class ExprTagOf extends SimpleExpression { private Expression string; private Expression compound; - private Class nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound"); private Class nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase"); @Override @@ -36,149 +36,37 @@ public class ExprTagOf extends SimpleExpression { } @Override public String toString(@Nullable Event e, boolean debug) { - return "the tag " + string.toString(e, debug) + " of compound"; + return "the tag " + string.toString(e, debug) + " of " + compound.toString(e, debug); } @Override @Nullable protected Object[] get(Event e) { Object NBT = compound.getSingle(e); - if (NBT == null || NBT.toString().equals("{}")) return null; //The NBT can be empty/inexistant for items ("{}" is an empty compound). + if (NBT == null || NBT.toString().equals("{}")) { // "{}" is an empty compound. + return null; //The NBT can be empty/inexistant for items + } String stringTag = string.getSingle(e); - Object tag = null; - try { - tag = nbtClass.getMethod("get", String.class).invoke(NBT, stringTag); - } catch (Exception ex) { - ex.printStackTrace(); - } - if (tag == null) + Object tag = SkStuff.getNMSMethods().getNBTTag(NBT, stringTag); + if (tag == null) { return null; //The tag doesn't exist? Return . - Byte id = null; - try { - id = (Byte) tag.getClass().getMethod("getTypeId").invoke(tag); - } catch (Exception ex) { - ex.printStackTrace(); } - try { - switch (id) { - case 1: - return new Byte[] { Byte.valueOf(nbtClass.getMethod("getByte", String.class).invoke(NBT, stringTag).toString()) }; - case 2: - return new Short[] { Short.valueOf(nbtClass.getMethod("getShort", String.class).invoke(NBT, stringTag).toString()) }; - case 3: - return new Integer[] { Integer.valueOf(nbtClass.getMethod("getInt", String.class).invoke(NBT, stringTag).toString()) }; - case 4: - return new Long[] { Long.valueOf(nbtClass.getMethod("getLong", String.class).invoke(NBT, stringTag).toString()) }; - case 5: - return new Float[] { Float.valueOf(nbtClass.getMethod("getFloat", String.class).invoke(NBT, stringTag).toString()) }; - case 6: - return new Double[] { Double.valueOf(nbtClass.getMethod("getDouble", String.class).invoke(NBT, stringTag).toString()) }; - case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser. - break; - case 8: - return new String[] { nbtClass.getMethod("getString", String.class).invoke(NBT, stringTag).toString() }; - case 9: - int i; - Object[] list = new Object[] { new Object() }; - for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside, - //since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list. - list[0] = nbtClass.getMethod("getList", String.class, int.class).invoke(NBT, stringTag, i); //Try to get the list with the ID "loop-number". - if (!list[0].toString().equals("[]")) { //If list is not empty. - break; //Stop loop. - } - } - return list; - /* - REMOVED TEMPORARILY, HOPEFULLY THE NEW IMPLEMENTATION SHOULD WORK BETTER - int i; - Object list = null; - for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside, - //since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list. - list = nbtClass.getMethod("getList", String.class, int.class).invoke(NBT, stringTag, i); //Try to get the list with the ID "loop-number". - if (!list.toString().equals("[]")) { //If list is not empty. - break; //Stop loop. - } - } - String methodName = null; - switch (NBTUtil.getContentsId(list)) { - case 5: //Float - methodName = "e"; //list.e(int) = get float from the specified index. - break; - case 6: //Double - methodName = "d"; //list.d(int) = get double from the specified index. - break; - case 8: //String - methodName = "getString"; //Self-explanatory, I guess. - break; - case 10: //Compound - methodName = "get"; //list.get(int) = get compound at the specified index. - break; - case 11: //Integer array - methodName = "c"; //Not sure if ever used, but meh. - break; - default: - break; - } - int listSize = (int) list.getClass().getMethod("size").invoke(list); - Object[] tags = new Object[listSize]; - for (i = 0; i < listSize; i++) { - Object gottenTag = list.getClass().getMethod(methodName, int.class).invoke(list, i); - tags[i] = gottenTag; - } - return tags; - */ - case 10: - return new Object[] { nbtClass.getMethod("getCompound", String.class).invoke(NBT, stringTag) }; - case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?). - return new Object[] { nbtClass.getMethod("getIntArray", String.class).invoke(NBT, stringTag).toString() }; - default: //This shouldn't happen, but it's better to have this just in case it spills errors everywhere. - break; - } - } catch (Exception ex) { - ex.printStackTrace(); - } - return null; + byte id = SkStuff.getNMSMethods().getTypeId(tag); + return new Object[] { SkStuff.getNMSMethods().getNBTTagValue(NBT, stringTag, id) }; } @Override public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { Object NBT = compound.getSingle(e); - if (NBT == null) - try { - NBT = nbtClass.newInstance(); //If the NBT isn't set, create an empty one - } catch (Exception ex) { - ex.printStackTrace(); - } + if (NBT == null) { + return; + } String stringTag = string.getSingle(e); if (mode == ChangeMode.SET) { Object newValue = delta[0]; - try { - if (newValue instanceof Byte) { - nbtClass.getMethod("setByte", String.class, byte.class).invoke(NBT, stringTag, ((Byte) newValue).byteValue()); - } else if (newValue instanceof Short) { - nbtClass.getMethod("setShort", String.class, short.class).invoke(NBT, stringTag, ((Short) newValue).shortValue()); - } else if (newValue instanceof Integer) { - nbtClass.getMethod("setInt", String.class, int.class).invoke(NBT, stringTag, ((Integer) newValue).intValue()); - } else if (newValue instanceof Long) { - nbtClass.getMethod("setLong", String.class, long.class).invoke(NBT, stringTag, ((Long) newValue).longValue()); - } else if (newValue instanceof Float) { - nbtClass.getMethod("setFloat", String.class, float.class).invoke(NBT, stringTag, ((Float) newValue).floatValue()); - } else if (newValue instanceof Double) { - nbtClass.getMethod("setDouble", String.class, double.class).invoke(NBT, stringTag, ((Double) newValue).doubleValue()); - } else if (newValue instanceof String) { - nbtClass.getMethod("setString", String.class, String.class).invoke(NBT, stringTag, String.valueOf(newValue)); - } else { - return; //Something else like a list or entire compound. - } - } catch (Exception ex) { - ex.printStackTrace(); - } + SkStuff.getNMSMethods().setNBTTag(NBT, stringTag, newValue); } else if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) { - try { - nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(NBT, stringTag, nbtBaseClass.newInstance()); - } catch (Exception ex) { - ex.printStackTrace(); - } + SkStuff.getNMSMethods().removeNBTTag(NBT, stringTag); } } @@ -187,7 +75,7 @@ public class ExprTagOf extends SimpleExpression { @Nullable public Class[] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) { - return CollectionUtils.array(Object.class); + return CollectionUtils.array(Number.class, String.class, nbtBaseClass); } return null; } diff --git a/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_8_R3.java b/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_8_R3.java index 92b9837..236cbe7 100644 --- a/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_8_R3.java +++ b/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_8_R3.java @@ -64,7 +64,7 @@ public class PathfinderGoalFollow_v1_8_R3 extends PathfinderGoal { return false; } } - return !follower.getNavigation().m(); // m() means hasNoPath() + return follower.getNavigation().m(); // m() means hasNoPath() } // c() is execute() diff --git a/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_9_R1.java b/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_9_R1.java index 8348660..1b85fb6 100644 --- a/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_9_R1.java +++ b/src/me/TheBukor/SkStuff/pathfinders/PathfinderGoalFollow_v1_9_R1.java @@ -64,7 +64,7 @@ public class PathfinderGoalFollow_v1_9_R1 extends PathfinderGoal { return false; } } - return !follower.getNavigation().n(); // n() means hasNoPath() + return follower.getNavigation().n(); // n() means hasNoPath() } // c() is execute() @@ -72,4 +72,6 @@ public class PathfinderGoalFollow_v1_9_R1 extends PathfinderGoal { public void c() { follower.getNavigation().a(followed, speed); // a() means moveTo() } + + } \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/util/NMSInterface.java b/src/me/TheBukor/SkStuff/util/NMSInterface.java index b0c9158..7f3bd7d 100644 --- a/src/me/TheBukor/SkStuff/util/NMSInterface.java +++ b/src/me/TheBukor/SkStuff/util/NMSInterface.java @@ -1,63 +1,92 @@ -package me.TheBukor.SkStuff.util; - -import java.io.File; - -import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public interface NMSInterface { - - public void addToCompound(Object compound, Object toAdd); - - public void removeFromCompound(Object compound, String ... toRemove); - - public Object parseRawNBT(String rawNBT); - - public Object[] getContents(Object nbtList); - - public void addToList(Object nbtList, Object toAdd); - - public void removeFromList(Object nbtList, int index); - - public void setIndex(Object nbtList, int index, Object toSet); - - public Object getIndex(Object nbtList, int index); - - public void clearPathfinderGoals(Entity entity); - - public void removePathfinderGoal(Object entity, Class goalClass, boolean isTargetSelector); - - public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector); - - public void registerCompoundClassInfo(); - - public void registerNBTListClassInfo(); - - public Object getEntityNBT(Entity entity); - - public Object getTileNBT(Block block); - - public Object getItemNBT(ItemStack itemStack); - - public void setEntityNBT(Entity entity, Object newCompound); - - public void setTileNBT(Block block, Object newCompound); - - public ItemStack getItemWithNBT(ItemStack itemStack, Object compound); - - public Object getFileNBT(File file); - - public void setFileNBT(File file, Object newCompound); - - public Object convertToNBT(Number number); - - public Object convertToNBT(String string); - - public String getMCId(ItemStack itemStack); - - public ItemStack getItemFromMcId(String mcId); - - void makeClientSay(String msg, Player p); -} +package me.TheBukor.SkStuff.util; + +import java.io.File; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.ItemStack; + +public interface NMSInterface { + + public Object getNBTTag(Object compound, String tag); + + public void setNBTTag(Object compound, String tag, Object toSet); + + public void removeNBTTag(Object compound, String tag); + + public byte getTypeId(Object nbtBase); + + public Object getNBTTagValue(Object compound, String tag, byte typeId); + + public void addToCompound(Object compound, Object toAdd); + + public void removeFromCompound(Object compound, String ... toRemove); + + public Object parseRawNBT(String rawNBT); + + public Object[] getContents(Object nbtList); + + public void addToList(Object nbtList, Object toAdd); + + public void removeFromList(Object nbtList, int index); + + public void setIndex(Object nbtList, int index, Object toSet); + + public Object getIndex(Object nbtList, int index); + + public void clearPathfinderGoals(Entity entity); + + public void removePathfinderGoal(Object entity, Class goalClass, boolean isTargetSelector); + + public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector); + + public void registerCompoundClassInfo(); + + public void registerNBTListClassInfo(); + + public Object getEntityNBT(Entity entity); + + public Object getTileNBT(Block block); + + public Object getItemNBT(ItemStack itemStack); + + public void setEntityNBT(Entity entity, Object newCompound); + + public void setTileNBT(Block block, Object newCompound); + + public ItemStack getItemWithNBT(ItemStack itemStack, Object compound); + + public Object getFileNBT(File file); + + public void setFileNBT(File file, Object newCompound); + + public Object convertToNBT(Number number); + + public Object convertToNBT(String string); + + public String getMCId(ItemStack itemStack); + + public ItemStack getItemFromMcId(String mcId); + + public boolean getNoClip(Entity entity); + + public void setNoClip(Entity entity, boolean noclip); + + public boolean getFireProof(Entity entity); + + public void setFireProof(Entity entity, boolean fireProof); + + /* + public ItemStack[] getEndermanBlocks(Entity enderman); + + public void setEndermanBlocks(Entity enderman, ItemStack... blocks); + */ + + public Location getLastLocation(Entity entity); + + public float getEntityStepLength(Entity entity); + + public void setEntityStepLength(Entity entity, float length); + +} \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/util/NMS_v1_7_R4.java b/src/me/TheBukor/SkStuff/util/NMS_v1_7_R4.java index 216a4ae..8dc2bac 100644 --- a/src/me/TheBukor/SkStuff/util/NMS_v1_7_R4.java +++ b/src/me/TheBukor/SkStuff/util/NMS_v1_7_R4.java @@ -17,14 +17,13 @@ import java.util.Set; import javax.annotation.Nullable; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; @@ -51,10 +50,89 @@ import net.minecraft.server.v1_7_R4.NBTTagShort; import net.minecraft.server.v1_7_R4.NBTTagString; import net.minecraft.server.v1_7_R4.TileEntity; import net.minecraft.server.v1_7_R4.World; -import net.minecraft.server.v1_7_R4.PacketPlayInChat; public class NMS_v1_7_R4 implements NMSInterface { + @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 && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) { + NBTBase converted = null; + if (toSet instanceof Number) { + converted = convertToNBT((Number) toSet); + } else if (toSet instanceof String) { + converted = convertToNBT((String) toSet); + } else { //Already an NBTBase + converted = (NBTBase) toSet; //No need to convert anything + } + ((NBTTagCompound) compound).set(tag, converted); + } + } + + @Override + public void removeNBTTag(Object compound, String tag) { + if (compound instanceof NBTTagCompound) { + ((NBTTagCompound) compound).remove(tag); + } + } + + @Override + public byte getTypeId(Object nbtBase) { + if (nbtBase instanceof NBTBase) { + return ((NBTBase) nbtBase).getTypeId(); + } + return 0; + } + + @Override + public Object getNBTTagValue(Object compound, String tag, byte typeId) { + if (compound instanceof NBTTagCompound) { + switch (typeId) { + case 1: + return ((NBTTagCompound) compound).getByte(tag); + case 2: + return ((NBTTagCompound) compound).getShort(tag); + case 3: + return ((NBTTagCompound) compound).getInt(tag); + case 4: + return ((NBTTagCompound) compound).getLong(tag); + case 5: + return ((NBTTagCompound) compound).getFloat(tag); + case 6: + return ((NBTTagCompound) compound).getDouble(tag); + case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser. + break; + case 8: + return ((NBTTagCompound) compound).getString(tag); + case 9: + int i; + NBTTagList list = null; + for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside, + //since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list. + list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number". + if (!list.toString().equals("[]")) { //If list is not empty. + break; //Stop loop. + } + } + return list; //May be null + case 10: + return ((NBTTagCompound) compound).getCompound(tag); + case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?). + return ((NBTTagCompound) compound).getIntArray(tag); + default: //This should never happen, but it's better to have this just in case it spills errors everywhere. + break; + } + } + return null; + } + @SuppressWarnings("unchecked") @Override public void addToCompound(Object compound, Object toAdd) { @@ -496,8 +574,44 @@ public class NMS_v1_7_R4 implements NMSInterface { } @Override - public void makeClientSay(String msg, Player p) { - PacketPlayInChat chatPacket = new PacketPlayInChat(msg); - ((CraftPlayer) p).getHandle().playerConnection.a(chatPacket); + public boolean getNoClip(Entity entity) { + return false; //Not supported in 1.7 + } + + @Override + public void setNoClip(Entity entity, boolean noclip) { + return; //Not supported in 1.7 + } + + @Override + public boolean getFireProof(Entity entity) { + net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return (boolean) ReflectionUtils.getField("fireProof", nmsEntity.getClass(), nmsEntity); + } + + @Override + public void setFireProof(Entity entity, boolean fireProof) { + net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof); + } + + @Override + public Location getLastLocation(Entity entity) { + net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + org.bukkit.World world = nmsEntity.world.getWorld(); + Location lastEntLoc = new Location(world, nmsEntity.S, nmsEntity.T, nmsEntity.U); + return lastEntLoc; + } + + @Override + public float getEntityStepLength(Entity entity) { + net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.V; + } + + @Override + public void setEntityStepLength(Entity entity, float length) { + net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.V = length; } } \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/util/NMS_v1_8_R3.java b/src/me/TheBukor/SkStuff/util/NMS_v1_8_R3.java index ddd6f24..4fbc5da 100644 --- a/src/me/TheBukor/SkStuff/util/NMS_v1_8_R3.java +++ b/src/me/TheBukor/SkStuff/util/NMS_v1_8_R3.java @@ -14,14 +14,13 @@ import java.util.List; import javax.annotation.Nullable; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; @@ -54,10 +53,89 @@ import net.minecraft.server.v1_8_R3.PathfinderGoal; import net.minecraft.server.v1_8_R3.PathfinderGoalSelector; import net.minecraft.server.v1_8_R3.TileEntity; import net.minecraft.server.v1_8_R3.World; -import net.minecraft.server.v1_8_R3.PacketPlayInChat; public class NMS_v1_8_R3 implements NMSInterface { + @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 && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) { + NBTBase converted = null; + if (toSet instanceof Number) { + converted = convertToNBT((Number) toSet); + } else if (toSet instanceof String) { + converted = convertToNBT((String) toSet); + } else { //Already an NBTBase + converted = (NBTBase) toSet; //No need to convert anything + } + ((NBTTagCompound) compound).set(tag, converted); + } + } + + @Override + public void removeNBTTag(Object compound, String tag) { + if (compound instanceof NBTTagCompound) { + ((NBTTagCompound) compound).remove(tag); + } + } + + @Override + public byte getTypeId(Object nbtBase) { + if (nbtBase instanceof NBTBase) { + return ((NBTBase) nbtBase).getTypeId(); + } + return 0; + } + + @Override + public Object getNBTTagValue(Object compound, String tag, byte typeId) { + if (compound instanceof NBTTagCompound) { + switch (typeId) { + case 1: + return ((NBTTagCompound) compound).getByte(tag); + case 2: + return ((NBTTagCompound) compound).getShort(tag); + case 3: + return ((NBTTagCompound) compound).getInt(tag); + case 4: + return ((NBTTagCompound) compound).getLong(tag); + case 5: + return ((NBTTagCompound) compound).getFloat(tag); + case 6: + return ((NBTTagCompound) compound).getDouble(tag); + case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser. + break; + case 8: + return ((NBTTagCompound) compound).getString(tag); + case 9: + int i; + NBTTagList list = null; + for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside, + //since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list. + list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number". + if (!list.isEmpty()) { //If list is not empty. + break; //Stop loop. + } + } + return list; //May be null + case 10: + return ((NBTTagCompound) compound).getCompound(tag); + case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?). + return ((NBTTagCompound) compound).getIntArray(tag); + default: //This should never happen, but it's better to have this just in case it spills errors everywhere. + break; + } + } + return null; + } + @Override public void addToCompound(Object compound, Object toAdd) { if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) { @@ -538,8 +616,46 @@ public class NMS_v1_8_R3 implements NMSInterface { } @Override - public void makeClientSay(String msg, Player p) { - PacketPlayInChat chatPacket = new PacketPlayInChat(msg); - ((CraftPlayer) p).getHandle().playerConnection.a(chatPacket); + public boolean getNoClip(Entity entity) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.noclip; + } + + @Override + public void setNoClip(Entity entity, boolean noclip) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.noclip = noclip; + } + + @Override + public boolean getFireProof(Entity entity) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.isFireProof(); + } + + @Override + public void setFireProof(Entity entity, boolean fireProof) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof); + } + + @Override + public Location getLastLocation(Entity entity) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + org.bukkit.World world = nmsEntity.world.getWorld(); + Location lastEntLoc = new Location(world, nmsEntity.P, nmsEntity.Q, nmsEntity.R); + return lastEntLoc; + } + + @Override + public float getEntityStepLength(Entity entity) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.S; + } + + @Override + public void setEntityStepLength(Entity entity, float length) { + net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.S = length; } } \ No newline at end of file diff --git a/src/me/TheBukor/SkStuff/util/NMS_v1_9_R1.java b/src/me/TheBukor/SkStuff/util/NMS_v1_9_R1.java index 2a9589f..5f5ef5a 100644 --- a/src/me/TheBukor/SkStuff/util/NMS_v1_9_R1.java +++ b/src/me/TheBukor/SkStuff/util/NMS_v1_9_R1.java @@ -14,14 +14,13 @@ import java.util.LinkedHashSet; import javax.annotation.Nullable; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; import org.bukkit.craftbukkit.v1_9_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftItemStack; import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import ch.njol.skript.Skript; @@ -51,7 +50,6 @@ 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; -import net.minecraft.server.v1_9_R1.PacketPlayInChat; import net.minecraft.server.v1_9_R1.PathfinderGoal; import net.minecraft.server.v1_9_R1.PathfinderGoalSelector; import net.minecraft.server.v1_9_R1.TileEntity; @@ -59,6 +57,86 @@ import net.minecraft.server.v1_9_R1.World; public class NMS_v1_9_R1 implements NMSInterface { + @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 && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) { + NBTBase converted = null; + if (toSet instanceof Number) { + converted = convertToNBT((Number) toSet); + } else if (toSet instanceof String) { + converted = convertToNBT((String) toSet); + } else { //Already an NBTBase + converted = (NBTBase) toSet; //No need to convert anything + } + ((NBTTagCompound) compound).set(tag, converted); + } + } + + @Override + public void removeNBTTag(Object compound, String tag) { + if (compound instanceof NBTTagCompound) { + ((NBTTagCompound) compound).remove(tag); + } + } + + @Override + public byte getTypeId(Object nbtBase) { + if (nbtBase instanceof NBTBase) { + return ((NBTBase) nbtBase).getTypeId(); + } + return 0; + } + + @Override + public Object getNBTTagValue(Object compound, String tag, byte typeId) { + if (compound instanceof NBTTagCompound) { + switch (typeId) { + case 1: + return ((NBTTagCompound) compound).getByte(tag); + case 2: + return ((NBTTagCompound) compound).getShort(tag); + case 3: + return ((NBTTagCompound) compound).getInt(tag); + case 4: + return ((NBTTagCompound) compound).getLong(tag); + case 5: + return ((NBTTagCompound) compound).getFloat(tag); + case 6: + return ((NBTTagCompound) compound).getDouble(tag); + case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser. + break; + case 8: + return ((NBTTagCompound) compound).getString(tag); + case 9: + int i; + NBTTagList list = null; + for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside, + //since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list. + list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number". + if (!list.isEmpty()) { //If list is not empty. + break; //Stop loop. + } + } + return list; //May be null + case 10: + return ((NBTTagCompound) compound).getCompound(tag); + case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?). + return ((NBTTagCompound) compound).getIntArray(tag); + default: //This should never happen, but it's better to have this just in case it spills errors everywhere. + break; + } + } + return null; + } + @Override public void addToCompound(Object compound, Object toAdd) { if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) { @@ -541,8 +619,79 @@ public class NMS_v1_9_R1 implements NMSInterface { } @Override - public void makeClientSay(String msg, Player p) { - PacketPlayInChat chatPacket = new PacketPlayInChat(msg); - ((CraftPlayer) p).getHandle().playerConnection.a(chatPacket); + public boolean getNoClip(Entity entity) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.noclip; + } + + @Override + public void setNoClip(Entity entity, boolean noclip) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.noclip = noclip; + } + + @Override + public boolean getFireProof(Entity entity) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.isFireProof(); + } + + @Override + public void setFireProof(Entity entity, boolean fireProof) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof); + } + + /* + @SuppressWarnings("unchecked") + @Override + public ItemStack[] getEndermanBlocks(Entity enderman) { + EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle(); + Set nmsBlocks = (Set) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder); + ItemStack[] items = new ItemStack[nmsBlocks.size()]; + int i = 0; + for (net.minecraft.server.v1_9_R1.Block nmsBlock : nmsBlocks) { + IBlockData nmsBlockData = nmsBlock.getBlockData(); + int dataValue = nmsBlock.toLegacyData(nmsBlockData); + net.minecraft.server.v1_9_R1.ItemStack nmsItem = new net.minecraft.server.v1_9_R1.ItemStack(nmsBlock, 1, dataValue); + ItemStack bukkitItem = CraftItemStack.asCraftMirror(nmsItem); + items[i] = bukkitItem; + i++; + } + return items; + } + + @SuppressWarnings("unchecked") + @Override + public void setEndermanBlocks(Entity enderman, ItemStack... blocks) { + EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle(); + Set nmsBlocks = (Set) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder); + for (ItemStack block : blocks) { + if (!block.getType().isBlock()) + return; + // TODO Figure out how to get a Blocks from a Bukkit ItemStack + // Blocks.class has a PRIVATE method to get from a MC id. + } + } + */ + + @Override + public Location getLastLocation(Entity entity) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + org.bukkit.World world = nmsEntity.world.getWorld(); + Location lastEntLoc = new Location(world, nmsEntity.M, nmsEntity.N, nmsEntity.O); + return lastEntLoc; + } + + @Override + public float getEntityStepLength(Entity entity) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + return nmsEntity.P; + } + + @Override + public void setEntityStepLength(Entity entity, float length) { + net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.P = length; } } \ No newline at end of file