From 042aaa6cebf2a451fd00e35c861740f6a1ef4b3f Mon Sep 17 00:00:00 2001 From: Richard Date: Sat, 20 Feb 2016 03:50:47 -0200 Subject: [PATCH] Hopefully the last 1.5 commit. Just needs testing. --- src/me/TheBukor/SkStuff/SkStuff.java | 4 +- .../SkStuff/effects/EffRemovePathGoal.java | 21 +- .../SkStuff/effects/EffSetPathGoal.java | 202 ++++++++++++------ .../expressions/ExprEndermanBlocks.java | 91 ++++++-- .../SkStuff/expressions/ExprFireProof.java | 13 +- .../SkStuff/expressions/ExprNBTOf.java | 5 +- .../SkStuff/expressions/ExprNoClip.java | 11 +- .../SkStuff/util/ReflectionUtils.java | 2 +- 8 files changed, 255 insertions(+), 94 deletions(-) diff --git a/src/me/TheBukor/SkStuff/SkStuff.java b/src/me/TheBukor/SkStuff/SkStuff.java index 534ac80..c3f9846 100644 --- a/src/me/TheBukor/SkStuff/SkStuff.java +++ b/src/me/TheBukor/SkStuff/SkStuff.java @@ -100,10 +100,10 @@ public class SkStuff extends JavaPlugin { getLogger().info("Trying to register version specific stuff..."); Skript.registerEffect(EffClearPathGoals.class, "(clear|delete) [all] pathfind[er] goals (of|from) %livingentity%"); Skript.registerEffect(EffRemovePathGoal.class, "remove pathfind[er] goal (0¦(avoid|run away from) entit(y|ies)|1¦break door[s]|2¦breed|3¦eat grass|4¦(flee from the sun|seek shad(e|ow))|5¦float (in[side]|on) water|6¦follow (owner|tamer)|7¦follow (adult|parent)[s]|8¦(fight back|react to|target) (damager|attacker)|9¦o(c|z)elot jump on blocks|10¦leap at target|11¦look at entit(y|ies)|12¦melee attack entit(y|ies)|13¦move to[wards] target|14¦target nearest entity|15¦o(c|z)elot attack [chicken[s]]|16¦open door[s]|17¦(panic|flee)|18¦look around randomly|19¦(walk around randomly|wander)|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦(wake other silverfish[es]|[silverfish] call (help|reinforcement|other [hidden] silverfish[es]))|26¦[enderm(a|e)n] pick[[ ]up] block[s]|27¦[enderm(a|e)n] place block[s]|28¦[enderman] attack player (staring|looking) [at 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)) [a[n]] item|32¦target [random] entity (if|when) (not tamed|untamed)|33¦guardian attack [entity]|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)) from %livingentity%"); - Skript.registerEffect(EffSetPathGoal.class, "add pathfind[er] goal [[with] priority %-integer%] (0¦(avoid|run away from) %entitydata%,[ ]radius %number%,[ ][at] speed %number%|1¦break door[s]|2¦breed,[ ][move to[wards] lover at] speed %number%|3¦eat grass|4¦(flee from the sun|seek shad(e|ow)),[ ][at] speed %number%|5¦float (in[side]|on) water|6¦follow (owner|tamer),[ ][at] speed %number%|7¦follow (adult|parent)[s],[ ][at] speed %number%|8¦(fight back|react to|target) (damager|attacker) [[of] type] %entitydata%|9¦o(c|z)elot jump on blocks,[ ][at] speed %number%|10¦leap at target [with [leap]] height %number%|11¦look at %entitydata%,[ ]radius %number%|12¦melee attack %entitydata%,[ ][at] speed %number%|13¦move to[wards] target,[ ][at] speed %number%,[ ]radius %number%|14¦target nearest [entity [of] type] %entitydata%|15¦o(c|z)elot attack [chicken]|16¦open door[s]|17¦(panic|flee),[ ][at] speed %number%|18¦look around randomly|19¦(walk around randomly|wander),[ ][at] speed %number%,[ ][with] min[imum] [of] %-timespan% between mov(e[ment][s]|ing)|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦(wake other silverfish[es]|[silverfish] call (help|reinforcement|other [hidden] silverfish[es]))|26¦[enderm(a|e)n] pick[[ ]up] block[s]|27¦[enderm(a|e)n] place block[s]|28¦[enderman] attack player (staring|looking) [at 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%, [at] speed %number%|32¦target [random] %entitydata% (if|when) (not tamed|untamed)|33¦guardian attack [entity]|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)) to %livingentity%"); + Skript.registerEffect(EffSetPathGoal.class, "add pathfind[er] goal [[with] priority %-integer%] (0¦(avoid|run away from) %entitydata%[, 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] %entitydata%[, 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 %entitydata%[, (radius|max[imum] distance) %-number%]|12¦melee attack %entitydata%[, [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] %entitydata%[, 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] %entitydata% (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)) to %livingentity%"); Skript.registerEffect(EffMakeJump.class, "make %livingentities% jump", "force %livingentities% to jump"); Skript.registerEffect(EffShowEntityEffect.class, "(display|play|show) entity effect (0¦firework[s] explo(de|sion)|1¦hurt|2¦[[iron] golem] (give|offer) (rose|poppy)|3¦[sheep] eat grass|4¦wolf shake) at %entity%"); - Skript.registerExpression(ExprNBTOf.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] of %entity/block/itemstack%", "%entity/block/itemstack%'s nbt[[ ]tag[s]]"); + 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%"); Skript.registerExpression(ExprFileNBT.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] from [file] %string%"); diff --git a/src/me/TheBukor/SkStuff/effects/EffRemovePathGoal.java b/src/me/TheBukor/SkStuff/effects/EffRemovePathGoal.java index c0c1f5d..6281532 100644 --- a/src/me/TheBukor/SkStuff/effects/EffRemovePathGoal.java +++ b/src/me/TheBukor/SkStuff/effects/EffRemovePathGoal.java @@ -6,6 +6,7 @@ import java.util.List; import javax.annotation.Nullable; import org.bukkit.entity.Blaze; +import org.bukkit.entity.Creature; import org.bukkit.entity.Ghast; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -52,6 +53,7 @@ public class EffRemovePathGoal extends Effect { Object targetSelector = ReflectionUtils.getField("targetSelector", entInsent, nmsEnt); Object toRemove = null; boolean target = false; + boolean resetGoalTarget = false; if (mark == 0) { if (ent instanceof Rabbit) { Class goalRabbitAvoid = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitAvoidTarget", false); @@ -149,6 +151,7 @@ public class EffRemovePathGoal extends Effect { Class goalSquid = ReflectionUtils.getNMSClass("EntitySquid$PathfinderGoalSquid", false); toRemove = goalSquid; } else if (mark == 23) { + resetGoalTarget = true; if (ent instanceof Blaze) { Class goalBlazeFireball = ReflectionUtils.getNMSClass("EntityBlaze$PathfinderGoalBlazeFireball", false); toRemove = goalBlazeFireball; @@ -186,6 +189,7 @@ public class EffRemovePathGoal extends Effect { Class goalTargetNonTamed = ReflectionUtils.getNMSClass("PathfinderGoalRandomTargetNonTamed", false); toRemove = goalTargetNonTamed; } else if (mark == 33) { + resetGoalTarget = true; Class goalGuardianAttack = ReflectionUtils.getNMSClass("EntityGuardian$PathfinderGoalGuardianAttack", false); toRemove = goalGuardianAttack; } else if (mark == 34) { @@ -214,8 +218,21 @@ public class EffRemovePathGoal extends Effect { } if (toRemove == null) return; + + /* "Hey, why are you setting the entity's target to null?!" + * + * For some goals (Blaze/Ghast fireball and Guardian attack), if you remove the goal while the entity is attacking, it will not stop attacking imediatelly, it will keep attacking its target. + * So there's a "bug" with this behavior, as soon as the entity's target resets (null, A.K.A ) the server crashes. Because we messed with the entity's "attack target" goal, the game + * still thinks it needs to get the target's location for some reason, and since the target is null... It throws an unhandled NPE (it never happens in Vanilla behavior), crashing the server. + * So I'm just setting the target to null before removing the goal, so it stops attacking properly, and also prevents the said crash. + */ + + if (resetGoalTarget) { + ((Creature) entity.getSingle(e)).setTarget(null); + } + Class goalSelectorClass = ReflectionUtils.getNMSClass("PathfinderGoalSelector", false); - if (target) { + if (target) { //Target Selector Iterator targets = ((List) ReflectionUtils.getField("b", goalSelectorClass, targetSelector)).iterator(); while (targets.hasNext()) { Object o = targets.next(); @@ -223,7 +240,7 @@ public class EffRemovePathGoal extends Effect { targets.remove(); } } - } else { + } else { //Goal Selector Iterator goals = ((List) ReflectionUtils.getField("b", goalSelectorClass, goalSelector)).iterator(); while (goals.hasNext()) { Object o = goals.next(); diff --git a/src/me/TheBukor/SkStuff/effects/EffSetPathGoal.java b/src/me/TheBukor/SkStuff/effects/EffSetPathGoal.java index 20e9040..a4b2a4e 100644 --- a/src/me/TheBukor/SkStuff/effects/EffSetPathGoal.java +++ b/src/me/TheBukor/SkStuff/effects/EffSetPathGoal.java @@ -4,7 +4,6 @@ import java.lang.reflect.Constructor; import javax.annotation.Nullable; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Animals; import org.bukkit.entity.Blaze; @@ -41,25 +40,32 @@ public class EffSetPathGoal extends Effect { private Expression> typeToAvoid; private Expression avoidRadius; private Expression avoidSpeed; + private Expression avoidSpeedNear; private Expression breedSpeed; private Expression fleeSunSpeed; private Expression followOwnerSpeed; + private Expression followMinDist; + private Expression followMaxDist; private Expression followAdultsSpeed; private Expression> typesToFightBack; + private Expression callForHelp; private Expression jumpOnBlockSpeed; private Expression leapHeight; private Expression> lookType; private Expression lookRadius; private Expression> meleeTarget; private Expression meleeSpeed; + private Expression meleeMemorize; private Expression moveTargetSpeed; private Expression moveTargetRadius; private Expression> nearTarget; + private Expression checkSight; private Expression panicSpeed; private Expression randomWalkSpeed; private Expression randomWalkInterval; private Expression temptItem; private Expression temptSpeed; + private Expression temptScared; private Expression> nonTamedTarget; private Expression entity; @@ -82,49 +88,56 @@ public class EffSetPathGoal extends Effect { typeToAvoid = (Expression>) expr[1]; avoidRadius = (Expression) expr[2]; avoidSpeed = (Expression) expr[3]; + avoidSpeedNear = (Expression) expr[4]; } else if (mark == 2) { - breedSpeed = (Expression) expr[4]; + breedSpeed = (Expression) expr[5]; } else if (mark == 4) { - fleeSunSpeed = (Expression) expr[5]; + fleeSunSpeed = (Expression) expr[6]; } else if (mark == 6) { - followOwnerSpeed = (Expression) expr[6]; + followOwnerSpeed = (Expression) expr[7]; + followMinDist = (Expression) expr[8]; + followMaxDist = (Expression) expr[9]; } else if (mark == 7) { - followAdultsSpeed = (Expression) expr[7]; + followAdultsSpeed = (Expression) expr[10]; } else if (mark == 8) { - typesToFightBack = (Expression>) expr[8]; + typesToFightBack = (Expression>) expr[11]; + callForHelp = (Expression) expr[12]; } else if (mark == 9) { - jumpOnBlockSpeed = (Expression) expr[9]; + jumpOnBlockSpeed = (Expression) expr[13]; } else if (mark == 10) { - leapHeight = (Expression) expr[10]; + leapHeight = (Expression) expr[14]; } else if (mark == 11) { - lookType = (Expression>) expr[11]; - lookRadius = (Expression) expr[12]; + lookType = (Expression>) expr[15]; + lookRadius = (Expression) expr[16]; } else if (mark == 12) { - meleeTarget = (Expression>) expr[13]; - meleeSpeed = (Expression) expr[14]; + meleeTarget = (Expression>) expr[17]; + meleeSpeed = (Expression) expr[18]; + meleeMemorize = (Expression) expr[19]; } else if (mark == 13) { - moveTargetSpeed = (Expression) expr[15]; - moveTargetRadius = (Expression) expr[16]; + moveTargetSpeed = (Expression) expr[20]; + moveTargetRadius = (Expression) expr[21]; } else if (mark == 14) { - nearTarget = (Expression>) expr[17]; + nearTarget = (Expression>) expr[22]; + checkSight = (Expression) expr[23]; } else if (mark == 17) { - panicSpeed = (Expression) expr[18]; + panicSpeed = (Expression) expr[24]; } else if (mark == 19) { - randomWalkSpeed = (Expression) expr[19]; - randomWalkInterval = (Expression) expr[20]; + randomWalkSpeed = (Expression) expr[25]; + randomWalkInterval = (Expression) expr[26]; } else if (mark == 31) { - temptItem = (Expression) expr[21]; - temptSpeed = (Expression) expr[22]; + temptItem = (Expression) expr[27]; + temptSpeed = (Expression) expr[28]; + temptScared = (Expression) expr[29]; } else if (mark == 32) { - nonTamedTarget = (Expression>) expr[23]; + nonTamedTarget = (Expression>) expr[30]; } - entity = (Expression) expr[24]; + entity = (Expression) expr[31]; return true; } @Override public String toString(@Nullable Event e, boolean debug) { - return "add pathfinder goal to entity"; + return "add pathfinder goal to" + entity.toString(e, debug); } @SuppressWarnings("deprecation") @@ -136,8 +149,8 @@ public class EffSetPathGoal extends Effect { } else { priority = 4; } - if (priority < 1) { - priority = 1; + if (priority < 0) { + priority = 0; } else if (priority > 9) { priority = 9; } @@ -153,8 +166,15 @@ public class EffSetPathGoal extends Effect { Object goals = ReflectionUtils.getField("goalSelector", entInsent, nmsEnt); Object targets = ReflectionUtils.getField("targetSelector", entInsent, nmsEnt); if (mark == 0) { - float radius = avoidRadius.getSingle(e).floatValue(); - double spd = avoidSpeed.getSingle(e).doubleValue(); + float radius = 6.0F; + double spd = 1.0D; + double nearSpd = 1.2D; + if (avoidRadius != null) + radius = avoidRadius.getSingle(e).floatValue(); + if (avoidSpeed != null) + spd = avoidSpeed.getSingle(e).doubleValue(); + if (avoidSpeedNear != null) + nearSpd = avoidSpeedNear.getSingle(e).doubleValue(); EntityData entityData; String exprInput = typeToAvoid.toString(e, false); if (exprInput.startsWith("the ")) { @@ -175,17 +195,19 @@ public class EffSetPathGoal extends Effect { return; if (ent instanceof Rabbit) { Class goalRabbitAvoid = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitAvoidTarget", false); - newGoal = goalRabbitAvoid.getDeclaredConstructor(nmsEnt.getClass(), Class.class, float.class, double.class, double.class).newInstance(nmsEnt, nmsClass, radius, spd, spd); + newGoal = goalRabbitAvoid.getDeclaredConstructor(nmsEnt.getClass(), Class.class, float.class, double.class, double.class).newInstance(nmsEnt, nmsClass, radius, spd, nearSpd); } else { Class goalAvoid = ReflectionUtils.getNMSClass("PathfinderGoalAvoidTarget", false); - newGoal = goalAvoid.getConstructor(entCreature, Class.class, float.class, double.class, double.class).newInstance(nmsEnt, nmsClass, radius, spd, spd); + newGoal = goalAvoid.getConstructor(entCreature, Class.class, float.class, double.class, double.class).newInstance(nmsEnt, nmsClass, radius, spd, nearSpd); } } else if (mark == 1) { Class goalBreakDoor = ReflectionUtils.getNMSClass("PathfinderGoalBreakDoor", false); newGoal = goalBreakDoor.getConstructor(entInsent).newInstance(nmsEnt); } else if (mark == 2) { Class goalBreed = ReflectionUtils.getNMSClass("PathfinderGoalBreed", false); - double spd = breedSpeed.getSingle(e).doubleValue(); + double spd = 1.0D; + if (breedSpeed != null) + spd = breedSpeed.getSingle(e).doubleValue(); if (!(ent instanceof Animals)) return; newGoal = goalBreed.getConstructor(entAnimal, double.class).newInstance(nmsEnt, spd); @@ -194,25 +216,38 @@ public class EffSetPathGoal extends Effect { newGoal = goalEatGrass.getConstructor(entInsent).newInstance(nmsEnt); } else if (mark == 4) { Class goalFleeSun = ReflectionUtils.getNMSClass("PathfinderGoalFleeSun", false); - double spd = fleeSunSpeed.getSingle(e).doubleValue(); + double spd = 1.0D; + if (fleeSunSpeed != null) + spd = fleeSunSpeed.getSingle(e).doubleValue(); newGoal = goalFleeSun.getConstructor(entCreature, double.class).newInstance(nmsEnt, spd); } else if (mark == 5) { Class goalFloat = ReflectionUtils.getNMSClass("PathfinderGoalFloat", false); newGoal = goalFloat.getConstructor(entInsent).newInstance(nmsEnt); } else if (mark == 6) { Class goalFollowOwner = ReflectionUtils.getNMSClass("PathfinderGoalFollowOwner", false); - double spd = followOwnerSpeed.getSingle(e).doubleValue(); + double spd = 1.0D; + if (followOwnerSpeed != null) + spd = followOwnerSpeed.getSingle(e).doubleValue(); + float minDist = 3.0F; + if (followMinDist != null) + minDist = followMinDist.getSingle(e).floatValue(); + float maxDist = 10.0F; + if (followMaxDist != null) + maxDist = followMaxDist.getSingle(e).floatValue(); if (!(ent instanceof Tameable)) return; - newGoal = goalFollowOwner.getConstructor(entTameable, double.class, float.class, float.class).newInstance(nmsEnt, spd, 20.0F, 5.0F); + newGoal = goalFollowOwner.getConstructor(entTameable, double.class, float.class, float.class).newInstance(nmsEnt, spd, maxDist, minDist); } else if (mark == 7) { Class goalFollowAdults = ReflectionUtils.getNMSClass("PathfinderGoalFollowParent", false); - double spd = followAdultsSpeed.getSingle(e).doubleValue(); + double spd = 1.0D; + if (followAdultsSpeed != null) + spd = followAdultsSpeed.getSingle(e).doubleValue(); if (!(ent instanceof Animals)) return; newGoal = goalFollowAdults.getConstructor(entAnimal, double.class).newInstance(nmsEnt, spd); } else if (mark == 8) { target = true; + boolean callHelp = false; Class goalReactAttack = ReflectionUtils.getNMSClass("PathfinderGoalHurtByTarget", false); EntityData entityData; String exprInput = typesToFightBack.toString(e, false); @@ -231,16 +266,22 @@ public class EffSetPathGoal extends Effect { Class[] nmsClass = new Class[] { ReflectionUtils.getNMSClass(className, false) }; if (nmsClass[0] == null) return; - newGoal = goalReactAttack.getConstructor(entCreature, boolean.class, Class[].class).newInstance(nmsEnt, false, nmsClass); + if (callForHelp != null) + callHelp = callForHelp.getSingle(e); + newGoal = goalReactAttack.getConstructor(entCreature, boolean.class, Class[].class).newInstance(nmsEnt, callHelp, nmsClass); } else if (mark == 9) { Class goalJumpOnBlock = ReflectionUtils.getNMSClass("PathfinderGoalJumpOnBlock", false); - double spd = jumpOnBlockSpeed.getSingle(e).doubleValue(); + double spd = 1.0D; + if (jumpOnBlockSpeed != null) + spd = jumpOnBlockSpeed.getSingle(e).doubleValue(); if (!(ent instanceof Ocelot)) return; newGoal = goalJumpOnBlock.getConstructor(nmsEnt.getClass(), double.class).newInstance(nmsEnt, spd); } else if (mark == 10) { Class goalLeapTarget = ReflectionUtils.getNMSClass("PathfinderGoalLeapAtTarget", false); - float height = leapHeight.getSingle(e).floatValue(); + float height = 0.4F; + if (leapHeight != null) + height = leapHeight.getSingle(e).floatValue(); newGoal = goalLeapTarget.getConstructor(entInsent, float.class).newInstance(nmsEnt, height); } else if (mark == 11) { Class goalLookEntities = ReflectionUtils.getNMSClass("PathfinderGoalLookAtPlayer", false); @@ -261,7 +302,9 @@ public class EffSetPathGoal extends Effect { Class nmsClass = ReflectionUtils.getNMSClass(className, false); if (nmsClass == null) return; - float radius = lookRadius.getSingle(e).floatValue(); + float radius = 1.0F; + if (lookRadius != null) + radius = lookRadius.getSingle(e).floatValue(); newGoal = goalLookEntities.getConstructor(entInsent, Class.class, float.class).newInstance(nmsEnt, nmsClass, radius); } else if (mark == 12) { EntityData entityData; @@ -288,23 +331,31 @@ public class EffSetPathGoal extends Effect { newGoal = constr.newInstance(nmsEnt, nmsClass); } else { Class goalMeleeAttack = ReflectionUtils.getNMSClass("PathfinderGoalMeleeAttack", false); - double spd = meleeSpeed.getSingle(e).doubleValue(); - newGoal = goalMeleeAttack.getConstructor(entCreature, Class.class, double.class, boolean.class).newInstance(nmsEnt, nmsClass, spd, false); + double spd = 1.0D; + if (meleeSpeed != null) + spd = meleeSpeed.getSingle(e).doubleValue(); + boolean memorize = false; + if (meleeMemorize != null) + memorize = meleeMemorize.getSingle(e); + newGoal = goalMeleeAttack.getConstructor(entCreature, Class.class, double.class, boolean.class).newInstance(nmsEnt, nmsClass, spd, memorize); } } else if (mark == 13) { Class goalGotoTarget = ReflectionUtils.getNMSClass("PathfinderGoalMoveTowardsTarget", false); - double spd = moveTargetSpeed.getSingle(e).doubleValue(); - float radius = moveTargetRadius.getSingle(e).floatValue(); + double spd = 1.0D; + if (moveTargetSpeed != null) + spd = moveTargetSpeed.getSingle(e).doubleValue(); + float radius = 32.0F; + if (moveTargetRadius != null) + radius = moveTargetRadius.getSingle(e).floatValue(); newGoal = goalGotoTarget.getConstructor(entCreature, double.class, float.class).newInstance(nmsEnt, spd, radius); } else if (mark == 14) { target = true; + boolean checkView = false; EntityData entityData; - EntityData test = nearTarget.getSingle(e); String exprInput = nearTarget.toString(e, false); if (exprInput.startsWith("the ")) { exprInput = exprInput.substring(4); } - Bukkit.broadcastMessage("Unconverted expression to string: \u00A7a" + exprInput + "\n\u00A7rConverted expression to string: \u00A72" + test); entityData = EntityData.parseWithoutIndefiniteArticle(exprInput); if (!LivingEntity.class.isAssignableFrom(entityData.getType())) return; @@ -323,8 +374,10 @@ public class EffSetPathGoal extends Effect { constr.setAccessible(true); newGoal = constr.newInstance(nmsEnt, nmsClass); } else { + if (checkSight != null) + checkView = checkSight.getSingle(e); Class goalNearTarget = ReflectionUtils.getNMSClass("PathfinderGoalNearestAttackableTarget", false); - newGoal = goalNearTarget.getConstructor(entCreature, Class.class, boolean.class).newInstance(nmsEnt, nmsClass, false); + newGoal = goalNearTarget.getConstructor(entCreature, Class.class, boolean.class).newInstance(nmsEnt, nmsClass, checkView); } } else if (mark == 15) { Class goalOcelotAttack = ReflectionUtils.getNMSClass("PathfinderGoalOcelotAttack", false); @@ -333,7 +386,9 @@ public class EffSetPathGoal extends Effect { Class goalOpenDoors = ReflectionUtils.getNMSClass("PathfinderGoalOpenDoor", false); newGoal = goalOpenDoors.getConstructor(entInsent, boolean.class).newInstance(nmsEnt, false); } else if (mark == 17) { - double spd = panicSpeed.getSingle(e).doubleValue(); + double spd = 1.0D; + if (panicSpeed != null) + spd = panicSpeed.getSingle(e).doubleValue(); if (ent instanceof Rabbit) { Class goalRabbitPanic = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitPanic", false); newGoal = goalRabbitPanic.getDeclaredConstructor(nmsEnt.getClass(), double.class).newInstance(nmsEnt, spd); @@ -347,8 +402,12 @@ public class EffSetPathGoal extends Effect { newGoal = goalRandomLook.getConstructor(entInsent).newInstance(nmsEnt); } else if (mark == 19) { Class goalWander = ReflectionUtils.getNMSClass("PathfinderGoalRandomStroll", false); - double spd = randomWalkSpeed.getSingle(e).doubleValue(); - int interval = randomWalkInterval.getSingle(e).getTicks(); + double spd = 1.0D; + if (randomWalkSpeed != null) + spd = randomWalkSpeed.getSingle(e).doubleValue(); + int interval = 120; + if (randomWalkInterval != null) + interval = randomWalkInterval.getSingle(e).getTicks(); newGoal = goalWander.getConstructor(entCreature, double.class, int.class).newInstance(nmsEnt, spd, interval); } else if (mark == 20) { Class goalSit = ReflectionUtils.getNMSClass("PathfinderGoalSit", false); @@ -380,7 +439,7 @@ public class EffSetPathGoal extends Effect { newGoal = constr.newInstance(nmsEnt); } } else if (mark == 24) { - Class goalHideInBlock = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishHideInBlocks", false); + Class goalHideInBlock = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishHideInBlock", false); if (!(ent instanceof Silverfish)) return; Constructor constr = goalHideInBlock.getDeclaredConstructor(nmsEnt.getClass()); @@ -436,8 +495,13 @@ public class EffSetPathGoal extends Effect { return; Object nmsItemStack = craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(itemStack, itemStack); Object nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack); - double spd = temptSpeed.getSingle(e).doubleValue(); - newGoal = goalTempt.getConstructor(entCreature, double.class, nmsItemClass, boolean.class).newInstance(nmsEnt, spd, nmsItem, false); + double spd = 1.0D; + if (temptSpeed != null) + spd = temptSpeed.getSingle(e).doubleValue(); + boolean scared = false; + if (temptScared != null) + scared = temptScared.getSingle(e); + newGoal = goalTempt.getConstructor(entCreature, double.class, nmsItemClass, boolean.class).newInstance(nmsEnt, spd, nmsItem, scared); } else if (mark == 32) { target = true; Class goalTargetNonTamed = ReflectionUtils.getNMSClass("PathfinderGoalRandomTargetNonTamed", false); @@ -466,52 +530,68 @@ public class EffSetPathGoal extends Effect { if (!(ent instanceof Guardian)) return; Class goalGuardianAttack = ReflectionUtils.getNMSClass("EntityGuardian$PathfinderGoalGuardianAttack", false); - newGoal = goalGuardianAttack.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalGuardianAttack.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 34) { if (!(ent instanceof PigZombie)) return; target = true; Class goalAnger = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAnger", false); - newGoal = goalAnger.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalAnger.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 35) { if (!(ent instanceof PigZombie)) return; target = true; Class goalAngerOther = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAngerOther", false); - newGoal = goalAngerOther.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalAngerOther.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 36) { if (!(ent instanceof Rabbit)) return; Class goalEatCarrots = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalEatCarrots", false); - newGoal = goalEatCarrots.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalEatCarrots.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 37) { if (!(ent instanceof Rabbit)) return; Class goalRabbitAttack = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalKillerRabbitMeleeAttack", false); - newGoal = goalRabbitAttack.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalRabbitAttack.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 38) { if (!(ent instanceof Slime)) return; Class goalJump = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomJump", false); - newGoal = goalJump.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalJump.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 39) { if (!(ent instanceof Slime)) return; Class goalRandomDir = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomDirection", false); - newGoal = goalRandomDir.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalRandomDir.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } else if (mark == 40) { if (!(ent instanceof Slime)) return; Class goalSlimeWander = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeIdle", false); - newGoal = goalSlimeWander.getDeclaredConstructor(nmsEnt.getClass()).newInstance(nmsEnt); + Constructor constr = goalSlimeWander.getDeclaredConstructor(nmsEnt.getClass()); + constr.setAccessible(true); + newGoal = constr.newInstance(nmsEnt); } if (newGoal == null) return; Class goal = ReflectionUtils.getNMSClass("PathfinderGoal", false); Class goalSelector = ReflectionUtils.getNMSClass("PathfinderGoalSelector", false); - if (target) { + if (target) { //Target Selector newGoal = goalSelector.getMethod("a", int.class, goal).invoke(targets, priority, newGoal); - } else { + } else { //Goal Selector newGoal = goalSelector.getMethod("a", int.class, goal).invoke(goals, priority, newGoal); } diff --git a/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java b/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java index 8569ce6..c4668d8 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprEndermanBlocks.java @@ -1,11 +1,14 @@ package me.TheBukor.SkStuff.expressions; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Set; import javax.annotation.Nullable; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.entity.Enderman; import org.bukkit.entity.Entity; import org.bukkit.event.Event; @@ -60,7 +63,7 @@ public class ExprEndermanBlocks extends SimpleExpression { return null; Object nmsEnt = null; try { - nmsEnt = craftEntClass.getMethod("getHandle").invoke(ent); + nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); } catch (Exception ex) { ex.printStackTrace(); } @@ -70,39 +73,89 @@ public class ExprEndermanBlocks extends SimpleExpression { Object nmsBlockData; try { nmsBlockData = nmsBlockClass.getMethod("getBlockData").invoke(nmsBlock); - int dataValue = (int) nmsBlockClass.getMethod("toLegacyData", nmsIBlockData).invoke(nmsBlock, nmsBlockData); - Object nmsItem = nmsItemClass.getConstructor(nmsBlockClass, int.class, int.class).newInstance(nmsBlock, 1, dataValue); - ItemStack bukkitItem = (ItemStack) craftItemClass.getMethod("asCraftMirror", nmsItemClass).invoke(null, nmsItem); + int dataValue = (int) nmsBlockClass.getMethod("toLegacyData", nmsIBlockData).invoke(nmsBlock, + nmsBlockData); + Object nmsItem = nmsItemClass.getConstructor(nmsBlockClass, int.class, int.class).newInstance(nmsBlock, + 1, dataValue); + ItemStack bukkitItem = (ItemStack) craftItemClass.getMethod("asCraftMirror", nmsItemClass).invoke(null, + nmsItem); items.add(bukkitItem); } catch (Exception ex) { - ex.printStackTrace();; + ex.printStackTrace(); + ; } } - return (ItemStack[]) items.toArray(); + return Arrays.copyOf(items.toArray(), items.size(), ItemStack[].class); } - @SuppressWarnings("unused") + @SuppressWarnings({ "unused", "unchecked" }) @Override public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { - if (mode == ChangeMode.SET) { - ItemStack[] toSet = (ItemStack[]) delta; - // TODO Convert bukkit items to NMS items (blocks). Then clear the list and add the delta items. - } else if (mode == ChangeMode.REMOVE) { - ItemStack[] toRemove = (ItemStack[]) delta; - // TODO The code. - } else if (mode == ChangeMode.ADD) { - ItemStack[] toAdd = (ItemStack[]) delta; - // TODO The code. + Entity ent = entity.getSingle(e); + if (ent == null || !(ent instanceof Enderman)) + return; + Object nmsEnt = null; + try { + nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); + } catch (Exception ex) { + ex.printStackTrace(); + } + Set enderBlocks = (Set) ReflectionUtils.getField("c", endermanClass, nmsEnt); + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) { + ItemStack[] deltaItems = Arrays.copyOf(delta, delta.length, ItemStack[].class); + if (mode == ChangeMode.SET) { + enderBlocks.clear(); + } + for (ItemStack itemStack : deltaItems) { + if (itemStack.getType() == Material.AIR || itemStack == null) + continue; + Object nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + Object nmsItem = null; + try { + nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack); + } catch (Exception ex) { + ex.printStackTrace(); + } + if (mode == ChangeMode.ADD || mode == ChangeMode.SET) + enderBlocks.add(nmsItem); + else //ChangeMode.REMOVE + enderBlocks.remove(nmsItem); + } } else if (mode == ChangeMode.RESET) { - // TODO The code. + ItemStack grass = new ItemStack(Material.GRASS); + ItemStack dirt = new ItemStack(Material.DIRT); + ItemStack sand = new ItemStack(Material.SAND); + ItemStack gravel = new ItemStack(Material.GRAVEL); + ItemStack dandelion = new ItemStack(Material.YELLOW_FLOWER); + ItemStack poppy = new ItemStack(Material.RED_ROSE); + ItemStack brownShroom = new ItemStack(Material.BROWN_MUSHROOM); + ItemStack redShroom = new ItemStack(Material.RED_MUSHROOM); + ItemStack tnt = new ItemStack(Material.TNT); + ItemStack cactus = new ItemStack(Material.CACTUS); + ItemStack clay = new ItemStack(Material.CLAY); + ItemStack pumpkin = new ItemStack(Material.PUMPKIN); + ItemStack melon = new ItemStack(Material.MELON_BLOCK); + ItemStack mycellium = new ItemStack(Material.MYCEL); + ItemStack[] defaultItems = new ItemStack[] { grass, dirt, gravel, dandelion, poppy, brownShroom, redShroom, tnt, cactus, clay, pumpkin, melon, mycellium }; + enderBlocks.clear(); + for (ItemStack itemStack : defaultItems) { + Object nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + Object nmsItem = null; + try { + nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack); + } catch (Exception ex) { + ex.printStackTrace(); + } + enderBlocks.add(nmsItem); + } } } - + @SuppressWarnings("unchecked") @Override @Nullable public Class[] acceptChange(ChangeMode mode) { - if (mode == ChangeMode.SET || mode == ChangeMode.REMOVE || mode == ChangeMode.ADD || mode == ChangeMode.RESET) { + if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.RESET|| mode == ChangeMode.SET) { return CollectionUtils.array(ItemStack[].class); } return null; diff --git a/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java b/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java index e07880f..27044f8 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprFireProof.java @@ -1,6 +1,7 @@ package me.TheBukor.SkStuff.expressions; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.annotation.Nullable; @@ -50,17 +51,19 @@ public class ExprFireProof extends SimpleExpression { return null; List fireProofStates = new ArrayList(); for (Entity ent : ents) { + if (ent == null) + continue; Object nmsEnt = null; try { - nmsEnt = craftEntClass.getMethod("getHandle").invoke(ent); + 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)); } - return (Boolean[]) fireProofStates.toArray(); + return Arrays.copyOf(fireProofStates.toArray(), fireProofStates.size(), Boolean[].class); } - + @Override public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { Entity[] ents = entities.getAll(e); @@ -69,9 +72,11 @@ public class ExprFireProof extends SimpleExpression { if (mode == ChangeMode.SET) { Boolean newValue = (Boolean) delta[0]; for (Entity ent : ents) { + if (ent == null) + continue; Object nmsEnt = null; try { - nmsEnt = craftEntClass.getMethod("getHandle").invoke(ent); + nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); //nmsEnt = ((CraftEntity) ent).getHandle(); } catch (Exception ex) { ex.printStackTrace(); } diff --git a/src/me/TheBukor/SkStuff/expressions/ExprNBTOf.java b/src/me/TheBukor/SkStuff/expressions/ExprNBTOf.java index cfea675..f08469b 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprNBTOf.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprNBTOf.java @@ -23,7 +23,7 @@ import me.TheBukor.SkStuff.util.NBTUtil; import me.TheBukor.SkStuff.util.ReflectionUtils; public class ExprNBTOf extends SimpleExpression { - private Expression target; + private Expression target; private Class nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound", false); private Class nbtParserClass = ReflectionUtils.getNMSClass("MojangsonParser", false); @@ -44,9 +44,10 @@ public class ExprNBTOf extends SimpleExpression { return true; } + @SuppressWarnings("unchecked") @Override public boolean init(Expression[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) { - target = expr[0]; + target = (Expression) expr[0]; return true; } diff --git a/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java b/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java index f941d77..a19f786 100644 --- a/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java +++ b/src/me/TheBukor/SkStuff/expressions/ExprNoClip.java @@ -1,6 +1,7 @@ package me.TheBukor.SkStuff.expressions; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.annotation.Nullable; @@ -51,15 +52,17 @@ public class ExprNoClip extends SimpleExpression { return null; List noClipStates = new ArrayList(); for (Entity ent : ents) { + if (ent == null) + continue; Object nmsEnt = null; try { - nmsEnt = craftEntClass.getMethod("getHandle").invoke(ent); + 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)); } - return (Boolean[]) noClipStates.toArray(); + return Arrays.copyOf(noClipStates.toArray(), noClipStates.size(), Boolean[].class); } @Override @@ -70,9 +73,11 @@ public class ExprNoClip extends SimpleExpression { if (mode == ChangeMode.SET) { Boolean newValue = (Boolean) delta[0]; for (Entity ent : ents) { + if (ent == null) + continue; Object nmsEnt = null; try { - nmsEnt = craftEntClass.getMethod("getHandle").invoke(ent); + nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent); //nmsEnt = ((CraftEntity) ent).getHandle(); } catch (Exception ex) { ex.printStackTrace(); } diff --git a/src/me/TheBukor/SkStuff/util/ReflectionUtils.java b/src/me/TheBukor/SkStuff/util/ReflectionUtils.java index 78ea21b..3322c04 100644 --- a/src/me/TheBukor/SkStuff/util/ReflectionUtils.java +++ b/src/me/TheBukor/SkStuff/util/ReflectionUtils.java @@ -7,7 +7,7 @@ import org.bukkit.Bukkit; public class ReflectionUtils { public static Class getNMSClass(String classString, boolean isArray) { - String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] + "."; + String version = getVersion(); String name = "net.minecraft.server." + version + classString; if (isArray) name = "[L" + name + ";";