Missed last commit for 1.6, whoopsies! This commit is from 1.6.1.

Some cleanup on SetPathfinderGoal effect, and also testing support for
multiple entities.
This commit is contained in:
TheBukor 2016-03-06 02:50:34 -03:00
parent b0aa11475e
commit f046b64367
15 changed files with 409 additions and 544 deletions

View File

@ -2,13 +2,13 @@
<classpath> <classpath>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/Server - Survival - 1.8/plugins/Skript.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/1.7.10.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/Server - Survival - 1.8/plugins/WorldEdit.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/1.8.3.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.7.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/1.8.8.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/VanishNoPacket.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/1.8.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.7.10.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/Skript.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.3.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/1.9.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/VanishNoPacket.jar"/>
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.9.jar"/> <classpathentry kind="lib" path="C:/Users/DELL/AppData/Roaming/.minecraft/workspace/eclipse/Build Path/WorldEdit.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@ -1,6 +1,6 @@
name: SkStuff name: SkStuff
author: TheBukor author: TheBukor
description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support. description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support.
version: 1.6 version: 1.6.1
main: me.TheBukor.SkStuff.SkStuff main: me.TheBukor.SkStuff.SkStuff
softdepend: [Skript, WorldEdit] softdepend: [Skript, WorldEdit, VanishNoPacket]

View File

@ -85,7 +85,6 @@ public class SkStuff extends JavaPlugin {
if (Bukkit.getPluginManager().getPlugin("Skript") != null && Skript.isAcceptRegistrations()) { if (Bukkit.getPluginManager().getPlugin("Skript") != null && Skript.isAcceptRegistrations()) {
Skript.registerAddon(this); Skript.registerAddon(this);
getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully enabled!"); getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully enabled!");
getLogger().info("Registering general non version specific stuff..."); getLogger().info("Registering general non version specific stuff...");
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.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(ExprToUpperCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] (cap[ital]s|upper[ ]case)", "convert %string% to [all] (cap[ital]s|upper[ ]case)", "capitalize [all] [char[acter]s (of|in)] %string%"); Skript.registerExpression(ExprToUpperCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] (cap[ital]s|upper[ ]case)", "convert %string% to [all] (cap[ital]s|upper[ ]case)", "capitalize [all] [char[acter]s (of|in)] %string%");
@ -95,12 +94,11 @@ public class SkStuff extends JavaPlugin {
Skript.registerExpression(ExprClickedInventory.class, Inventory.class, ExpressionType.SIMPLE, "[skstuff] clicked inventory"); Skript.registerExpression(ExprClickedInventory.class, Inventory.class, ExpressionType.SIMPLE, "[skstuff] clicked inventory");
effAmount += 1; effAmount += 1;
exprAmount += 5; exprAmount += 5;
if (setupNMSVersion()) { if (setupNMSVersion()) {
getLogger().info("Trying to register version specific stuff..."); getLogger().info("Trying to register version specific stuff...");
Skript.registerEffect(EffClearPathGoals.class, "(clear|delete) [all] pathfind[er] goals (of|from) %livingentity%"); Skript.registerEffect(EffClearPathGoals.class, "(clear|delete) [all] pathfind[er] goals (of|from) %livingentities%");
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(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 %livingentities%");
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(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)) to %livingentities%");
Skript.registerEffect(EffMakeJump.class, "make %livingentities% jump", "force %livingentities% to jump"); 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(EffGZipFile.class, "create [a] gzip[ped] file [at] [path] %string%");
Skript.registerExpression(ExprNBTOf.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] of %~object%", "%~object%'s nbt[[ ]tag[s]]"); Skript.registerExpression(ExprNBTOf.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] of %~object%", "%~object%'s nbt[[ ]tag[s]]");

View File

@ -1,7 +1,5 @@
package me.TheBukor.SkStuff.effects; package me.TheBukor.SkStuff.effects;
import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
@ -12,43 +10,30 @@ import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean; import ch.njol.util.Kleenean;
import me.TheBukor.SkStuff.util.ReflectionUtils; import me.TheBukor.SkStuff.SkStuff;
public class EffClearPathGoals extends Effect { public class EffClearPathGoals extends Effect {
private Expression<LivingEntity> entity; private Expression<LivingEntity> entities;
private Class<?> goalSelectorClass = ReflectionUtils.getNMSClass("PathfinderGoalSelector");
private Class<?> insentientEnt = ReflectionUtils.getNMSClass("EntityInsentient");
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) { public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
entity = (Expression<LivingEntity>) expr[0]; entities = (Expression<LivingEntity>) expr[0];
return true; return true;
} }
@Override @Override
public String toString(@Nullable Event e, boolean debug) { public String toString(@Nullable Event e, boolean debug) {
return "clear all pathfinder goals from " + entity.toString(e, debug); return "clear all pathfinder goals from " + entities.toString(e, debug);
} }
@Override @Override
protected void execute(Event e) { protected void execute(Event e) {
LivingEntity ent = entity.getSingle(e); LivingEntity[] ents = entities.getAll(e);
for (LivingEntity ent : ents) {
if (ent instanceof Player || ent == null) if (ent instanceof Player || ent == null)
return; continue;
Object obcEnt = craftLivEnt.cast(ent); SkStuff.getNMSMethods().clearPathfinderGoals(ent);
try {
Object nmsEnt = insentientEnt.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
Object goalSelector = ReflectionUtils.getField("goalSelector", insentientEnt, nmsEnt);
Object targetSelector = ReflectionUtils.getField("targetSelector", insentientEnt, nmsEnt);
((List<?>) ReflectionUtils.getField("b", goalSelectorClass, goalSelector)).clear();
((List<?>) ReflectionUtils.getField("c", goalSelectorClass, goalSelector)).clear();
((List<?>) ReflectionUtils.getField("b", goalSelectorClass, targetSelector)).clear();
((List<?>) ReflectionUtils.getField("c", goalSelectorClass, targetSelector)).clear();
} catch (Exception ex) {
ex.printStackTrace();
} }
} }
} }

View File

@ -1,5 +1,7 @@
package me.TheBukor.SkStuff.effects; package me.TheBukor.SkStuff.effects;
import java.lang.reflect.InvocationTargetException;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.bukkit.entity.ArmorStand; import org.bukkit.entity.ArmorStand;
@ -43,7 +45,7 @@ public class EffMakeJump extends Effect {
Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt)); Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
Object controllerJump = nmsEnt.getClass().getMethod("getControllerJump").invoke(nmsEnt); Object controllerJump = nmsEnt.getClass().getMethod("getControllerJump").invoke(nmsEnt);
controllerJump.getClass().getMethod("a").invoke(controllerJump); controllerJump.getClass().getMethod("a").invoke(controllerJump);
} catch (Exception ex) { } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }

View File

@ -1,5 +1,7 @@
package me.TheBukor.SkStuff.effects; package me.TheBukor.SkStuff.effects;
import java.lang.reflect.InvocationTargetException;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.bukkit.entity.Blaze; import org.bukkit.entity.Blaze;
@ -19,7 +21,7 @@ import me.TheBukor.SkStuff.SkStuff;
import me.TheBukor.SkStuff.util.ReflectionUtils; import me.TheBukor.SkStuff.util.ReflectionUtils;
public class EffRemovePathGoal extends Effect { public class EffRemovePathGoal extends Effect {
private Expression<LivingEntity> entity; private Expression<LivingEntity> entities;
private int mark; private int mark;
@ -30,23 +32,28 @@ public class EffRemovePathGoal extends Effect {
@Override @Override
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) { public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
mark = result.mark; mark = result.mark;
entity = (Expression<LivingEntity>) expr[0]; entities = (Expression<LivingEntity>) expr[0];
return true; return true;
} }
@Override @Override
public String toString(@Nullable Event e, boolean debug) { public String toString(@Nullable Event e, boolean debug) {
return "remove pathfinder goal from " + entity.toString(e, debug); return "remove pathfinder goal from " + entities.toString(e, debug);
} }
@Override @Override
protected void execute(Event e) { protected void execute(Event e) {
LivingEntity ent = entity.getSingle(e); LivingEntity[] ents = entities.getAll(e);
for (LivingEntity ent : ents) {
if (ent instanceof Player || ent == null) if (ent instanceof Player || ent == null)
return; return;
Object obcEnt = craftLivEnt.cast(ent); Object obcEnt = craftLivEnt.cast(ent);
Object nmsEnt = null;
try { try {
Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt)); nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) {
ex.printStackTrace();
}
Class<?> toRemove = null; Class<?> toRemove = null;
boolean target = false; boolean target = false;
boolean resetGoalTarget = false; boolean resetGoalTarget = false;
@ -224,12 +231,10 @@ public class EffRemovePathGoal extends Effect {
*/ */
if (resetGoalTarget) { if (resetGoalTarget) {
((Creature) entity.getSingle(e)).setTarget(null); ((Creature) ent).setTarget(null);
} }
SkStuff.getNMSMethods().removePathfinderGoal(nmsEnt, toRemove, target); SkStuff.getNMSMethods().removePathfinderGoal(nmsEnt, toRemove, target);
} catch (Exception ex) {
ex.printStackTrace();
} }
} }
} }

View File

@ -1,6 +1,9 @@
package me.TheBukor.SkStuff.effects; package me.TheBukor.SkStuff.effects;
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -31,7 +34,6 @@ import ch.njol.skript.entity.EntityData;
import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.localization.Language;
import ch.njol.skript.util.Timespan; import ch.njol.skript.util.Timespan;
import ch.njol.util.Kleenean; import ch.njol.util.Kleenean;
import me.TheBukor.SkStuff.SkStuff; import me.TheBukor.SkStuff.SkStuff;
@ -39,7 +41,7 @@ import me.TheBukor.SkStuff.util.ReflectionUtils;
public class EffSetPathGoal extends Effect { public class EffSetPathGoal extends Effect {
private Expression<Integer> goalPriority; private Expression<Integer> goalPriority;
private Expression<EntityData<?>> typeToAvoid; private Expression<? extends EntityData<?>> typeToAvoid;
private Expression<Number> avoidRadius; private Expression<Number> avoidRadius;
private Expression<Number> avoidSpeed; private Expression<Number> avoidSpeed;
private Expression<Number> avoidSpeedNear; private Expression<Number> avoidSpeedNear;
@ -49,18 +51,18 @@ public class EffSetPathGoal extends Effect {
private Expression<Number> followMinDist; private Expression<Number> followMinDist;
private Expression<Number> followMaxDist; private Expression<Number> followMaxDist;
private Expression<Number> followAdultsSpeed; private Expression<Number> followAdultsSpeed;
private Expression<EntityData<?>> typesToFightBack; private Expression<? extends EntityData<?>> typesToFightBack;
private Expression<Boolean> callForHelp; private Expression<Boolean> callForHelp;
private Expression<Number> jumpOnBlockSpeed; private Expression<Number> jumpOnBlockSpeed;
private Expression<Number> leapHeight; private Expression<Number> leapHeight;
private Expression<EntityData<?>> lookType; private Expression<? extends EntityData<?>> lookType;
private Expression<Number> lookRadius; private Expression<Number> lookRadius;
private Expression<EntityData<?>> meleeTarget; private Expression<? extends EntityData<?>> meleeTarget;
private Expression<Number> meleeSpeed; private Expression<Number> meleeSpeed;
private Expression<Boolean> meleeMemorize; private Expression<Boolean> meleeMemorize;
private Expression<Number> moveTargetSpeed; private Expression<Number> moveTargetSpeed;
private Expression<Number> moveTargetRadius; private Expression<Number> moveTargetRadius;
private Expression<EntityData<?>> nearTarget; private Expression<? extends EntityData<?>> nearTarget;
private Expression<Boolean> checkSight; private Expression<Boolean> checkSight;
private Expression<Number> panicSpeed; private Expression<Number> panicSpeed;
private Expression<Number> randomWalkSpeed; private Expression<Number> randomWalkSpeed;
@ -68,8 +70,8 @@ public class EffSetPathGoal extends Effect {
private Expression<ItemStack> temptItem; private Expression<ItemStack> temptItem;
private Expression<Number> temptSpeed; private Expression<Number> temptSpeed;
private Expression<Boolean> temptScared; private Expression<Boolean> temptScared;
private Expression<EntityData<?>> nonTamedTarget; private Expression<? extends EntityData<?>> nonTamedTarget;
private Expression<LivingEntity> entity; private Expression<LivingEntity> entities;
private int mark; private int mark;
@ -133,276 +135,154 @@ public class EffSetPathGoal extends Effect {
} else if (mark == 32) { } else if (mark == 32) {
nonTamedTarget = (Expression<EntityData<?>>) expr[30]; nonTamedTarget = (Expression<EntityData<?>>) expr[30];
} }
entity = (Expression<LivingEntity>) expr[31]; entities = (Expression<LivingEntity>) expr[31];
return true; return true;
} }
@Override @Override
public String toString(@Nullable Event e, boolean debug) { public String toString(@Nullable Event e, boolean debug) {
return "add pathfinder goal to" + entity.toString(e, debug); return "add pathfinder goal to" + entities.toString(e, debug);
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
protected void execute(Event e) { protected void execute(Event e) {
int priority = 0; LivingEntity[] ents = entities.getAll(e);
if (goalPriority != null) { for (LivingEntity ent : ents) {
priority = goalPriority.getSingle(e).intValue(); if (ent == null || ent instanceof Player)
} else {
priority = 4;
}
if (priority < 0) {
priority = 0;
} else if (priority > 9) {
priority = 9;
}
LivingEntity ent = entity.getSingle(e);
if (ent == null ||ent instanceof Player)
return; return;
int priority = (goalPriority == null ? 4 : goalPriority.getSingle(e).intValue());
if (priority < 0)
priority = 0;
else if (priority > 9)
priority = 9;
Object obcEnt = craftLivEnt.cast(ent); Object obcEnt = craftLivEnt.cast(ent);
try {
Object nmsEnt = null; Object nmsEnt = null;
boolean target = false; boolean target = false;
Object newGoal = null; Object newGoal = null;
try {
nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt)); nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
if (mark == 0) { if (mark == 0) {
boolean wasLocal = Language.setUseLocal(false); float radius = (avoidRadius == null ? 6.0F : avoidRadius.getSingle(e).floatValue());
float radius = 6.0F; double spd = (avoidSpeed == null ? 1.0D : avoidSpeed.getSingle(e).doubleValue());
double spd = 1.0D; double nearSpd = (avoidSpeedNear == null ? 1.2D : avoidSpeedNear.getSingle(e).doubleValue());
double nearSpd = 1.2D; EntityData<?>[] types = typeToAvoid.getAll(e);
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 ")) {
exprInput = exprInput.substring(4);
}
try {
entityData = EntityData.parseWithoutIndefiniteArticle(exprInput);
} finally {
Language.setUseLocal(wasLocal);
}
if (!LivingEntity.class.isAssignableFrom(entityData.getType())) {
return;
}
String className = entityData.getType().getSimpleName();
if (className.equals("HumanEntity"))
className = "Human";
else if (className.equals("LivingEntity"))
className = "Living";
className = "Entity" + className;
Class<?> nmsClass = ReflectionUtils.getNMSClass(className);
if (nmsClass == null)
return;
if (ent instanceof Rabbit) { if (ent instanceof Rabbit) {
Class<?> goalRabbitAvoid = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitAvoidTarget"); Class<?> goalRabbitAvoid = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitAvoidTarget");
newGoal = goalRabbitAvoid.getDeclaredConstructor(nmsEnt.getClass(), Class.class, float.class, double.class, double.class).newInstance(nmsEnt, nmsClass, radius, spd, nearSpd); for (EntityData<?> entData : types) {
if (LivingEntity.class.isAssignableFrom(entData.getType()))
newGoal = goalRabbitAvoid.getDeclaredConstructor(nmsEnt.getClass(), Class.class, float.class, double.class, double.class).newInstance(nmsEnt, entData.getType(), radius, spd, nearSpd);
}
} else { } else {
Class<?> goalAvoid = ReflectionUtils.getNMSClass("PathfinderGoalAvoidTarget"); Class<?> goalAvoid = ReflectionUtils.getNMSClass("PathfinderGoalAvoidTarget");
newGoal = goalAvoid.getConstructor(entCreature, Class.class, float.class, double.class, double.class).newInstance(nmsEnt, nmsClass, radius, spd, nearSpd); for (EntityData<?> entData : types) {
if (LivingEntity.class.isAssignableFrom(entData.getType()))
newGoal = goalAvoid.getConstructor(entCreature, Class.class, float.class, double.class, double.class).newInstance(nmsEnt, entData.getType(), radius, spd, nearSpd);
}
} }
} else if (mark == 1) { } else if (mark == 1) {
Class<?> goalBreakDoor = ReflectionUtils.getNMSClass("PathfinderGoalBreakDoor"); Class<?> goalBreakDoor = ReflectionUtils.getNMSClass("PathfinderGoalBreakDoor");
newGoal = goalBreakDoor.getConstructor(entInsent).newInstance(nmsEnt); newGoal = goalBreakDoor.getConstructor(entInsent).newInstance(nmsEnt);
} else if (mark == 2) { } else if (mark == 2) {
Class<?> goalBreed = ReflectionUtils.getNMSClass("PathfinderGoalBreed");
double spd = 1.0D;
if (breedSpeed != null)
spd = breedSpeed.getSingle(e).doubleValue();
if (!(ent instanceof Animals)) if (!(ent instanceof Animals))
return; return;
double spd = (breedSpeed == null ? 1.0D : breedSpeed.getSingle(e).doubleValue());
Class<?> goalBreed = ReflectionUtils.getNMSClass("PathfinderGoalBreed");
newGoal = goalBreed.getConstructor(entAnimal, double.class).newInstance(nmsEnt, spd); newGoal = goalBreed.getConstructor(entAnimal, double.class).newInstance(nmsEnt, spd);
} else if (mark == 3) { } else if (mark == 3) {
Class<?> goalEatGrass = ReflectionUtils.getNMSClass("PathfinderGoalEatTile"); Class<?> goalEatGrass = ReflectionUtils.getNMSClass("PathfinderGoalEatTile");
newGoal = goalEatGrass.getConstructor(entInsent).newInstance(nmsEnt); newGoal = goalEatGrass.getConstructor(entInsent).newInstance(nmsEnt);
} else if (mark == 4) { } else if (mark == 4) {
double spd = (fleeSunSpeed == null ? 1.0D : fleeSunSpeed.getSingle(e).doubleValue());
Class<?> goalFleeSun = ReflectionUtils.getNMSClass("PathfinderGoalFleeSun"); Class<?> goalFleeSun = ReflectionUtils.getNMSClass("PathfinderGoalFleeSun");
double spd = 1.0D;
if (fleeSunSpeed != null)
spd = fleeSunSpeed.getSingle(e).doubleValue();
newGoal = goalFleeSun.getConstructor(entCreature, double.class).newInstance(nmsEnt, spd); newGoal = goalFleeSun.getConstructor(entCreature, double.class).newInstance(nmsEnt, spd);
} else if (mark == 5) { } else if (mark == 5) {
Class<?> goalFloat = ReflectionUtils.getNMSClass("PathfinderGoalFloat"); Class<?> goalFloat = ReflectionUtils.getNMSClass("PathfinderGoalFloat");
newGoal = goalFloat.getConstructor(entInsent).newInstance(nmsEnt); newGoal = goalFloat.getConstructor(entInsent).newInstance(nmsEnt);
} else if (mark == 6) { } else if (mark == 6) {
Class<?> goalFollowOwner = ReflectionUtils.getNMSClass("PathfinderGoalFollowOwner");
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)) if (!(ent instanceof Tameable))
return; return;
double spd = (followOwnerSpeed == null ? 1.0D : followOwnerSpeed.getSingle(e).doubleValue());
float minDist = (followMinDist == null ? 3.0F : followMinDist.getSingle(e).floatValue());
float maxDist = (followMaxDist == null ? 10.0F : followMaxDist.getSingle(e).floatValue());
Class<?> goalFollowOwner = ReflectionUtils.getNMSClass("PathfinderGoalFollowOwner");
newGoal = goalFollowOwner.getConstructor(entTameable, double.class, float.class, float.class).newInstance(nmsEnt, spd, maxDist, minDist); newGoal = goalFollowOwner.getConstructor(entTameable, double.class, float.class, float.class).newInstance(nmsEnt, spd, maxDist, minDist);
} else if (mark == 7) { } else if (mark == 7) {
Class<?> goalFollowAdults = ReflectionUtils.getNMSClass("PathfinderGoalFollowParent");
double spd = 1.0D;
if (followAdultsSpeed != null)
spd = followAdultsSpeed.getSingle(e).doubleValue();
if (!(ent instanceof Animals)) if (!(ent instanceof Animals))
return; return;
double spd = (followAdultsSpeed == null ? 1.0D : followAdultsSpeed.getSingle(e).doubleValue());
Class<?> goalFollowAdults = ReflectionUtils.getNMSClass("PathfinderGoalFollowParent");
newGoal = goalFollowAdults.getConstructor(entAnimal, double.class).newInstance(nmsEnt, spd); newGoal = goalFollowAdults.getConstructor(entAnimal, double.class).newInstance(nmsEnt, spd);
} else if (mark == 8) { } else if (mark == 8) {
boolean wasLocal = Language.setUseLocal(false);
target = true; target = true;
boolean callHelp = false; boolean callHelp = (callForHelp == null ? false : callForHelp.getSingle(e));
EntityData<?>[] types = typesToFightBack.getAll(e);
List<Class<?>> typesClasses = new ArrayList<Class<?>>();
for (EntityData<?> entData : types) {
if (LivingEntity.class.isAssignableFrom(entData.getType()))
typesClasses.add(entData.getType());
}
Class<?>[] finalTypes = Arrays.copyOf(typesClasses.toArray(), typesClasses.size(), Class[].class);
Class<?> goalReactAttack = ReflectionUtils.getNMSClass("PathfinderGoalHurtByTarget"); Class<?> goalReactAttack = ReflectionUtils.getNMSClass("PathfinderGoalHurtByTarget");
EntityData<?> entityData; newGoal = goalReactAttack.getConstructor(entCreature, boolean.class, Class[].class).newInstance(nmsEnt, callHelp, finalTypes);
String exprInput = typesToFightBack.toString(e, false);
if (exprInput.startsWith("the ")) {
exprInput = exprInput.substring(4);
}
try {
entityData = EntityData.parseWithoutIndefiniteArticle(exprInput);
} finally {
Language.setUseLocal(wasLocal);
}
if (!LivingEntity.class.isAssignableFrom(entityData.getType()))
return;
String className = entityData.getType().getSimpleName();
if (className.equals("HumanEntity"))
className = "Human";
else if (className.equals("LivingEntity"))
className = "Living";
className = "Entity" + className;
Class<?>[] nmsClass = new Class<?>[] { ReflectionUtils.getNMSClass(className) };
if (nmsClass[0] == null)
return;
if (callForHelp != null)
callHelp = callForHelp.getSingle(e);
newGoal = goalReactAttack.getConstructor(entCreature, boolean.class, Class[].class).newInstance(nmsEnt, callHelp, nmsClass);
} else if (mark == 9) { } else if (mark == 9) {
Class<?> goalJumpOnBlock = ReflectionUtils.getNMSClass("PathfinderGoalJumpOnBlock");
double spd = 1.0D;
if (jumpOnBlockSpeed != null)
spd = jumpOnBlockSpeed.getSingle(e).doubleValue();
if (!(ent instanceof Ocelot)) if (!(ent instanceof Ocelot))
return; return;
double spd = (jumpOnBlockSpeed == null ? 1.0D : jumpOnBlockSpeed.getSingle(e).doubleValue());
Class<?> goalJumpOnBlock = ReflectionUtils.getNMSClass("PathfinderGoalJumpOnBlock");
newGoal = goalJumpOnBlock.getConstructor(nmsEnt.getClass(), double.class).newInstance(nmsEnt, spd); newGoal = goalJumpOnBlock.getConstructor(nmsEnt.getClass(), double.class).newInstance(nmsEnt, spd);
} else if (mark == 10) { } else if (mark == 10) {
float height = (leapHeight == null ? 0.4F : leapHeight.getSingle(e).floatValue());
Class<?> goalLeapTarget = ReflectionUtils.getNMSClass("PathfinderGoalLeapAtTarget"); Class<?> goalLeapTarget = ReflectionUtils.getNMSClass("PathfinderGoalLeapAtTarget");
float height = 0.4F;
if (leapHeight != null)
height = leapHeight.getSingle(e).floatValue();
newGoal = goalLeapTarget.getConstructor(entInsent, float.class).newInstance(nmsEnt, height); newGoal = goalLeapTarget.getConstructor(entInsent, float.class).newInstance(nmsEnt, height);
} else if (mark == 11) { } else if (mark == 11) {
boolean wasLocal = Language.setUseLocal(false); float radius = (lookRadius == null ? 1.0F : lookRadius.getSingle(e).floatValue());
EntityData<?>[] types = lookType.getAll(e);
Class<?> goalLookEntities = ReflectionUtils.getNMSClass("PathfinderGoalLookAtPlayer"); Class<?> goalLookEntities = ReflectionUtils.getNMSClass("PathfinderGoalLookAtPlayer");
EntityData<?> entityData; for (EntityData<?> entData : types) {
String exprInput = lookType.toString(e, false); if (LivingEntity.class.isAssignableFrom(entData.getType()))
if (exprInput.startsWith("the ")) { newGoal = goalLookEntities.getConstructor(entInsent, Class.class, float.class).newInstance(nmsEnt, entData.getType(), radius);
exprInput = exprInput.substring(4);
} }
try {
entityData = EntityData.parseWithoutIndefiniteArticle(exprInput);
} finally {
Language.setUseLocal(wasLocal);
}
if (!LivingEntity.class.isAssignableFrom(entityData.getType()))
return;
String className = entityData.getType().getSimpleName();
if (className.equals("HumanEntity"))
className = "Human";
else if (className.equals("LivingEntity"))
className = "Living";
className = "Entity" + className;
Class<?> nmsClass = ReflectionUtils.getNMSClass(className);
if (nmsClass == null)
return;
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) { } else if (mark == 12) {
boolean wasLocal = Language.setUseLocal(false); EntityData<?>[] types = meleeTarget.getAll(e);
EntityData<?> entityData;
String exprInput = meleeTarget.toString(e, false);
if (exprInput.startsWith("the ")) {
exprInput = exprInput.substring(4);
}
try {
entityData = EntityData.parseWithoutIndefiniteArticle(exprInput);
} finally {
Language.setUseLocal(wasLocal);
}
if (!LivingEntity.class.isAssignableFrom(entityData.getType()))
return;
String className = entityData.getType().getSimpleName();
if (className.equals("HumanEntity"))
className = "Human";
else if (className.equals("LivingEntity"))
className = "Living";
className = "Entity" + className;
Class<?> nmsClass = ReflectionUtils.getNMSClass(className);
if (nmsClass == null)
return;
if (ent instanceof Spider) { if (ent instanceof Spider) {
Class<?> goalSpiderMelee = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderMeleeAttack"); Class<?> goalSpiderMelee = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderMeleeAttack");
Constructor<?> constr = goalSpiderMelee.getDeclaredConstructor(nmsEnt.getClass(), Class.class); for (EntityData<?> entData : types) {
constr.setAccessible(true); if (LivingEntity.class.isAssignableFrom(entData.getType()))
newGoal = constr.newInstance(nmsEnt, nmsClass); newGoal = ReflectionUtils.getConstructor(goalSpiderMelee, nmsEnt.getClass(), Class.class).newInstance(nmsEnt, entData.getType());
}
} else { } else {
double spd = (meleeSpeed == null ? 1.0D : meleeSpeed.getSingle(e).doubleValue());
boolean memorize = (meleeMemorize == null ? false : meleeMemorize.getSingle(e));
Class<?> goalMeleeAttack = ReflectionUtils.getNMSClass("PathfinderGoalMeleeAttack"); Class<?> goalMeleeAttack = ReflectionUtils.getNMSClass("PathfinderGoalMeleeAttack");
double spd = 1.0D; for (EntityData<?> entData : types) {
if (meleeSpeed != null) if (LivingEntity.class.isAssignableFrom(entData.getType()))
spd = meleeSpeed.getSingle(e).doubleValue(); newGoal = goalMeleeAttack.getConstructor(entCreature, Class.class, double.class, boolean.class).newInstance(nmsEnt, entData.getType(), spd, memorize);
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) { } else if (mark == 13) {
double spd = (moveTargetSpeed == null ? 1.0D : moveTargetSpeed.getSingle(e).doubleValue());
float radius = (moveTargetRadius == null ? 32.0F : moveTargetRadius.getSingle(e).floatValue());
Class<?> goalGotoTarget = ReflectionUtils.getNMSClass("PathfinderGoalMoveTowardsTarget"); Class<?> goalGotoTarget = ReflectionUtils.getNMSClass("PathfinderGoalMoveTowardsTarget");
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); newGoal = goalGotoTarget.getConstructor(entCreature, double.class, float.class).newInstance(nmsEnt, spd, radius);
} else if (mark == 14) { } else if (mark == 14) {
boolean wasLocal = Language.setUseLocal(false);
target = true; target = true;
boolean checkView = false; EntityData<?>[] types = nearTarget.getAll(e);
EntityData<?> entityData;
String exprInput = nearTarget.toString(e, false);
if (exprInput.startsWith("the ")) {
exprInput = exprInput.substring(4);
}
try {
entityData = EntityData.parseWithoutIndefiniteArticle(exprInput);
} finally {
Language.setUseLocal(wasLocal);
}
if (!LivingEntity.class.isAssignableFrom(entityData.getType()))
return;
String className = entityData.getType().getSimpleName();
if (className.equals("HumanEntity"))
className = "Human";
else if (className.equals("LivingEntity"))
className = "Living";
className = "Entity" + className;
Class<?> nmsClass = ReflectionUtils.getNMSClass(className);
if (nmsClass == null)
return;
if (ent instanceof Spider) { if (ent instanceof Spider) {
Class<?> goalSpiderNearTarget = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderNearestAttackableTarget"); Class<?> goalSpiderNearTarget = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderNearestAttackableTarget");
Constructor<?> constr = goalSpiderNearTarget.getDeclaredConstructor(nmsEnt.getClass(), Class.class); for (EntityData<?> entData : types) {
constr.setAccessible(true); if (LivingEntity.class.isAssignableFrom(entData.getType()))
newGoal = constr.newInstance(nmsEnt, nmsClass); newGoal = ReflectionUtils.getConstructor(goalSpiderNearTarget, nmsEnt.getClass(), Class.class).newInstance(nmsEnt, entData.getType());
}
} else { } else {
if (checkSight != null) boolean checkView = (checkSight == null ? true : checkSight.getSingle(e));
checkView = checkSight.getSingle(e);
Class<?> goalNearTarget = ReflectionUtils.getNMSClass("PathfinderGoalNearestAttackableTarget"); Class<?> goalNearTarget = ReflectionUtils.getNMSClass("PathfinderGoalNearestAttackableTarget");
newGoal = goalNearTarget.getConstructor(entCreature, Class.class, boolean.class).newInstance(nmsEnt, nmsClass, checkView); for (EntityData<?> entData : types) {
if (LivingEntity.class.isAssignableFrom(entData.getType()))
newGoal = goalNearTarget.getConstructor(entCreature, Class.class, boolean.class).newInstance(nmsEnt, entData.getType(), checkView);
}
} }
} else if (mark == 15) { } else if (mark == 15) {
Class<?> goalOcelotAttack = ReflectionUtils.getNMSClass("PathfinderGoalOcelotAttack"); Class<?> goalOcelotAttack = ReflectionUtils.getNMSClass("PathfinderGoalOcelotAttack");
@ -411,215 +291,150 @@ public class EffSetPathGoal extends Effect {
Class<?> goalOpenDoors = ReflectionUtils.getNMSClass("PathfinderGoalOpenDoor"); Class<?> goalOpenDoors = ReflectionUtils.getNMSClass("PathfinderGoalOpenDoor");
newGoal = goalOpenDoors.getConstructor(entInsent, boolean.class).newInstance(nmsEnt, false); newGoal = goalOpenDoors.getConstructor(entInsent, boolean.class).newInstance(nmsEnt, false);
} else if (mark == 17) { } else if (mark == 17) {
double spd = 1.0D; double spd = (panicSpeed == null ? 1.25D : panicSpeed.getSingle(e).doubleValue());
if (panicSpeed != null)
spd = panicSpeed.getSingle(e).doubleValue();
if (ent instanceof Rabbit) { if (ent instanceof Rabbit) {
Class<?> goalRabbitPanic = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitPanic"); Class<?> goalRabbitPanic = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitPanic");
newGoal = goalRabbitPanic.getDeclaredConstructor(nmsEnt.getClass(), double.class).newInstance(nmsEnt, spd); newGoal = goalRabbitPanic.getDeclaredConstructor(nmsEnt.getClass(), double.class).newInstance(nmsEnt, spd);
} else { } else {
Class<?> goalPanic = ReflectionUtils.getNMSClass("PathfinderGoalPanic"); Class<?> goalPanic = ReflectionUtils.getNMSClass("PathfinderGoalPanic");
newGoal = goalPanic.getConstructor(entCreature, double.class).newInstance(nmsEnt, spd); newGoal = goalPanic.getConstructor(entCreature, double.class).newInstance(nmsEnt, spd);
} }
} else if (mark == 18) { } else if (mark == 18) {
Class<?> goalRandomLook = ReflectionUtils.getNMSClass("PathfinderGoalRandomLookaround"); Class<?> goalRandomLook = ReflectionUtils.getNMSClass("PathfinderGoalRandomLookaround");
newGoal = goalRandomLook.getConstructor(entInsent).newInstance(nmsEnt); newGoal = goalRandomLook.getConstructor(entInsent).newInstance(nmsEnt);
} else if (mark == 19) { } else if (mark == 19) {
double spd = (randomWalkSpeed == null ? 1.0D : randomWalkSpeed.getSingle(e).doubleValue());
int interval = (randomWalkInterval == null ? 120 : randomWalkInterval.getSingle(e).getTicks());
Class<?> goalWander = ReflectionUtils.getNMSClass("PathfinderGoalRandomStroll"); Class<?> goalWander = ReflectionUtils.getNMSClass("PathfinderGoalRandomStroll");
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); newGoal = goalWander.getConstructor(entCreature, double.class, int.class).newInstance(nmsEnt, spd, interval);
} else if (mark == 20) { } else if (mark == 20) {
Class<?> goalSit = ReflectionUtils.getNMSClass("PathfinderGoalSit");
if (!(ent instanceof Tameable)) if (!(ent instanceof Tameable))
return; return;
Class<?> goalSit = ReflectionUtils.getNMSClass("PathfinderGoalSit");
newGoal = goalSit.getConstructor(entTameable).newInstance(nmsEnt); newGoal = goalSit.getConstructor(entTameable).newInstance(nmsEnt);
} else if (mark == 21) { } else if (mark == 21) {
Class<?> goalSwell = ReflectionUtils.getNMSClass("PathfinderGoalSwell");
if (!(ent instanceof Creeper)) if (!(ent instanceof Creeper))
return; return;
Class<?> goalSwell = ReflectionUtils.getNMSClass("PathfinderGoalSwell");
newGoal = goalSwell.getConstructor(nmsEnt.getClass()).newInstance(nmsEnt); newGoal = goalSwell.getConstructor(nmsEnt.getClass()).newInstance(nmsEnt);
} else if (mark == 22) { } else if (mark == 22) {
Class<?> goalSquid = ReflectionUtils.getNMSClass("EntitySquid$PathfinderGoalSquid");
if (!(ent instanceof Squid)) if (!(ent instanceof Squid))
return; return;
Constructor<?> constr = goalSquid.getDeclaredConstructor(nmsEnt.getClass()); Class<?> goalSquid = ReflectionUtils.getNMSClass("EntitySquid$PathfinderGoalSquid");
constr.setAccessible(true); newGoal = ReflectionUtils.getConstructor(goalSquid, nmsEnt.getClass()).newInstance(nmsEnt);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 23) { } else if (mark == 23) {
if (ent instanceof Blaze) { if (ent instanceof Blaze) {
Class<?> goalBlazeFireball = ReflectionUtils.getNMSClass("EntityBlaze$PathfinderGoalBlazeFireball"); Class<?> goalBlazeFireball = ReflectionUtils.getNMSClass("EntityBlaze$PathfinderGoalBlazeFireball");
Constructor<?> constr = goalBlazeFireball.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalBlazeFireball, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (ent instanceof Ghast) { } else if (ent instanceof Ghast) {
Class<?> goalGhastFireball = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastAttackTarget"); Class<?> goalGhastFireball = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastAttackTarget");
Constructor<?> constr = goalGhastFireball.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalGhastFireball, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} }
} else if (mark == 24) { } else if (mark == 24) {
if (!(ent instanceof Silverfish))
return;
Class<?> goalHideInBlock = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishHideInBlock"); Class<?> goalHideInBlock = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishHideInBlock");
if (!(ent instanceof Silverfish)) newGoal = ReflectionUtils.getConstructor(goalHideInBlock, nmsEnt.getClass()).newInstance(nmsEnt);
return;
Constructor<?> constr = goalHideInBlock.getDeclaredConstructor(nmsEnt.getClass());
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 25) { } else if (mark == 25) {
Class<?> goalWakeSilverfish = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishWakeOthers");
if (!(ent instanceof Silverfish)) if (!(ent instanceof Silverfish))
return; return;
Constructor<?> constr = goalWakeSilverfish.getDeclaredConstructor(nmsEnt.getClass()); Class<?> goalWakeSilverfish = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishWakeOthers");
constr.setAccessible(true); newGoal = ReflectionUtils.getConstructor(goalWakeSilverfish, nmsEnt.getClass()).newInstance(nmsEnt);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 26) { } else if (mark == 26) {
if (!(ent instanceof Enderman))
return;
Class<?> goalPickBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPickupBlock"); Class<?> goalPickBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPickupBlock");
if (!(ent instanceof Enderman)) newGoal = ReflectionUtils.getConstructor(goalPickBlocks, nmsEnt.getClass()).newInstance(nmsEnt);
return;
Constructor<?> constr = goalPickBlocks.getDeclaredConstructor(nmsEnt.getClass());
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 27) { } else if (mark == 27) {
Class<?> goalPlaceBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPlaceBlock");
if (!(ent instanceof Enderman)) if (!(ent instanceof Enderman))
return; return;
Constructor<?> constr = goalPlaceBlocks.getDeclaredConstructor(nmsEnt.getClass()); Class<?> goalPlaceBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPlaceBlock");
constr.setAccessible(true); newGoal = ReflectionUtils.getConstructor(goalPlaceBlocks, nmsEnt.getClass()).newInstance(nmsEnt);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 28) { } else if (mark == 28) {
if (!(ent instanceof Enderman))
return;
target = true; target = true;
Class<?> goalAttackLooker = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalPlayerWhoLookedAtTarget"); Class<?> goalAttackLooker = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalPlayerWhoLookedAtTarget");
if (!(ent instanceof Enderman)) newGoal = ReflectionUtils.getConstructor(goalAttackLooker, nmsEnt.getClass()).newInstance(nmsEnt);
return;
Constructor<?> constr = goalAttackLooker.getDeclaredConstructor(nmsEnt.getClass());
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 29) { } else if (mark == 29) {
if (!(ent instanceof Ghast))
return;
Class<?> goalGhastMoveTarget = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastMoveTowardsTarget"); Class<?> goalGhastMoveTarget = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastMoveTowardsTarget");
if (!(ent instanceof Ghast)) newGoal = ReflectionUtils.getConstructor(goalGhastMoveTarget, nmsEnt.getClass()).newInstance(nmsEnt);
return;
Constructor<?> constr = goalGhastMoveTarget.getDeclaredConstructor(nmsEnt.getClass());
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 30) { } else if (mark == 30) {
Class<?> goalGhastIdleMove = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastIdleMove");
if (!(ent instanceof Ghast)) if (!(ent instanceof Ghast))
return; return;
Constructor<?> constr = goalGhastIdleMove.getDeclaredConstructor(nmsEnt.getClass()); Class<?> goalGhastIdleMove = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastIdleMove");
constr.setAccessible(true); newGoal = ReflectionUtils.getConstructor(goalGhastIdleMove, nmsEnt.getClass()).newInstance(nmsEnt);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 31) { } else if (mark == 31) {
Class<?> goalTempt = ReflectionUtils.getNMSClass("PathfinderGoalTempt");
ItemStack itemStack = temptItem.getSingle(e); ItemStack itemStack = temptItem.getSingle(e);
if (itemStack.getType() == Material.AIR || itemStack == null) if (itemStack.getType() == Material.AIR || itemStack == null)
return; return;
Object nmsItemStack = craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(itemStack, itemStack); Object nmsItemStack = craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(itemStack, itemStack);
Object nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack); Object nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack);
double spd = 1.0D; double spd = (temptSpeed == null ? 1.0D : temptSpeed.getSingle(e).doubleValue());
if (temptSpeed != null) boolean scared = (temptScared == null ? false : temptScared.getSingle(e));
spd = temptSpeed.getSingle(e).doubleValue(); Class<?> goalTempt = ReflectionUtils.getNMSClass("PathfinderGoalTempt");
boolean scared = false;
if (temptScared != null)
scared = temptScared.getSingle(e);
newGoal = goalTempt.getConstructor(entCreature, double.class, nmsItemClass, boolean.class).newInstance(nmsEnt, spd, nmsItem, scared); newGoal = goalTempt.getConstructor(entCreature, double.class, nmsItemClass, boolean.class).newInstance(nmsEnt, spd, nmsItem, scared);
} else if (mark == 32) { } else if (mark == 32) {
boolean wasLocal = Language.setUseLocal(false);
target = true;
Class<?> goalTargetNonTamed = ReflectionUtils.getNMSClass("PathfinderGoalRandomTargetNonTamed");
if (!(ent instanceof Tameable)) if (!(ent instanceof Tameable))
return; return;
EntityData<?> entityData; target = true;
String exprInput = nonTamedTarget.toString(e, false); EntityData<?>[] types = nonTamedTarget.getAll(e);
if (exprInput.startsWith("the ")) { Class<?> goalTargetNonTamed = ReflectionUtils.getNMSClass("PathfinderGoalRandomTargetNonTamed");
exprInput = exprInput.substring(4); for (EntityData<?> entData : types) {
if (LivingEntity.class.isAssignableFrom(entData.getType()))
newGoal = goalTargetNonTamed.getConstructor(entTameable, Class.class, boolean.class, Predicate.class).newInstance(nmsEnt, entData.getType(), false, Predicates.alwaysTrue());
} }
try {
entityData = EntityData.parseWithoutIndefiniteArticle(exprInput);
} finally {
Language.setUseLocal(wasLocal);
}
if (!LivingEntity.class.isAssignableFrom(entityData.getType())) {
return;
}
String className = entityData.getType().getSimpleName();
if (className.equals("HumanEntity"))
className = "Human";
else if (className.equals("LivingEntity"))
className = "Living";
className = "Entity" + className;
Class<?> nmsClass = ReflectionUtils.getNMSClass(className);
if (nmsClass == null)
return;
newGoal = goalTargetNonTamed.getConstructor(entTameable, Class.class, boolean.class, Predicate.class).newInstance(nmsEnt, nmsClass, false, Predicates.alwaysTrue());
} else if (mark == 33) { } else if (mark == 33) {
if (!(ent instanceof Guardian)) if (!(ent instanceof Guardian))
return; return;
Class<?> goalGuardianAttack = ReflectionUtils.getNMSClass("EntityGuardian$PathfinderGoalGuardianAttack"); Class<?> goalGuardianAttack = ReflectionUtils.getNMSClass("EntityGuardian$PathfinderGoalGuardianAttack");
Constructor<?> constr = goalGuardianAttack.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalGuardianAttack, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 34) { } else if (mark == 34) {
if (!(ent instanceof PigZombie)) if (!(ent instanceof PigZombie))
return; return;
target = true; target = true;
Class<?> goalAnger = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAnger"); Class<?> goalAnger = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAnger");
Constructor<?> constr = goalAnger.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalAnger, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 35) { } else if (mark == 35) {
if (!(ent instanceof PigZombie)) if (!(ent instanceof PigZombie))
return; return;
target = true; target = true;
Class<?> goalAngerOther = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAngerOther"); Class<?> goalAngerOther = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAngerOther");
Constructor<?> constr = goalAngerOther.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalAngerOther, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 36) { } else if (mark == 36) {
if (!(ent instanceof Rabbit)) if (!(ent instanceof Rabbit))
return; return;
Class<?> goalEatCarrots = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalEatCarrots"); Class<?> goalEatCarrots = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalEatCarrots");
Constructor<?> constr = goalEatCarrots.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalEatCarrots, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 37) { } else if (mark == 37) {
if (!(ent instanceof Rabbit)) if (!(ent instanceof Rabbit))
return; return;
Class<?> goalRabbitAttack = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalKillerRabbitMeleeAttack"); Class<?> goalRabbitAttack = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalKillerRabbitMeleeAttack");
Constructor<?> constr = goalRabbitAttack.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalRabbitAttack, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 38) { } else if (mark == 38) {
if (!(ent instanceof Slime)) if (!(ent instanceof Slime))
return; return;
Class<?> goalJump = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomJump"); Class<?> goalJump = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomJump");
Constructor<?> constr = goalJump.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalJump, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 39) { } else if (mark == 39) {
if (!(ent instanceof Slime)) if (!(ent instanceof Slime))
return; return;
Class<?> goalRandomDir = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomDirection"); Class<?> goalRandomDir = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomDirection");
Constructor<?> constr = goalRandomDir.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalRandomDir, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} else if (mark == 40) { } else if (mark == 40) {
if (!(ent instanceof Slime)) if (!(ent instanceof Slime))
return; return;
Class<?> goalSlimeWander = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeIdle"); Class<?> goalSlimeWander = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeIdle");
Constructor<?> constr = goalSlimeWander.getDeclaredConstructor(nmsEnt.getClass()); newGoal = ReflectionUtils.getConstructor(goalSlimeWander, nmsEnt.getClass()).newInstance(nmsEnt);
constr.setAccessible(true);
newGoal = constr.newInstance(nmsEnt);
} }
if (newGoal == null) if (newGoal == null)
return; return;
SkStuff.getNMSMethods().addPathfinderGoal(nmsEnt, priority, newGoal, target); SkStuff.getNMSMethods().addPathfinderGoal(nmsEnt, priority, newGoal, target);
} catch (Exception ex) { } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
}
} }

View File

@ -61,6 +61,13 @@ public class ExprFileNBT extends SimpleExpression<Object> {
if (!file.exists()) if (!file.exists())
return; return;
Object fileNBT = SkStuff.getNMSMethods().getFileNBT(file); Object fileNBT = SkStuff.getNMSMethods().getFileNBT(file);
if (fileNBT == null) {
try {
fileNBT = nbtClass.newInstance();
} catch (InstantiationException | IllegalAccessException ex) {
ex.printStackTrace();
}
}
if (mode == ChangeMode.ADD) { if (mode == ChangeMode.ADD) {
Object parsedNBT = null; Object parsedNBT = null;
parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]); parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]);
@ -79,7 +86,7 @@ public class ExprFileNBT extends SimpleExpression<Object> {
@Nullable @Nullable
public Class<?>[] acceptChange(ChangeMode mode) { public Class<?>[] acceptChange(ChangeMode mode) {
if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) { if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) {
return CollectionUtils.array(String[].class); return CollectionUtils.array(String.class);
} }
return null; return null;
} }

View File

@ -26,6 +26,8 @@ public interface NMSInterface {
public Object getIndex(Object nbtList, int index); public Object getIndex(Object nbtList, int index);
public void clearPathfinderGoals(Entity entity);
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector); public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector);
public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector); public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector);

View File

@ -166,6 +166,11 @@ public class NMS_v1_7_R4 implements NMSInterface {
return null; return null;
} }
@Override
public void clearPathfinderGoals(Entity entity) {
Bukkit.getLogger().warning("Sorry, Pathfinder Goal are only supported in 1.8 and above");
}
@Override @Override
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) { public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
Bukkit.getLogger().warning("Sorry, Pathfinder Goals are only supported in 1.8 and above"); Bukkit.getLogger().warning("Sorry, Pathfinder Goals are only supported in 1.8 and above");

View File

@ -148,6 +148,15 @@ public class NMS_v1_8_R1 implements NMSInterface {
return null; return null;
} }
@Override
public void clearPathfinderGoals(Entity entity) {
EntityInsentient nmsEnt = (EntityInsentient) ((CraftEntity) entity).getHandle();
((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((List<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
((List<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
}
@Override @Override
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) { public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
if (entity instanceof EntityInsentient) { if (entity instanceof EntityInsentient) {

View File

@ -154,6 +154,15 @@ public class NMS_v1_8_R2 implements NMSInterface {
return null; return null;
} }
@Override
public void clearPathfinderGoals(Entity entity) {
EntityInsentient nmsEnt = (EntityInsentient) ((CraftEntity) entity).getHandle();
((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((List<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
((List<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
}
@Override @Override
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) { public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
if (entity instanceof EntityInsentient) { if (entity instanceof EntityInsentient) {

View File

@ -154,6 +154,15 @@ public class NMS_v1_8_R3 implements NMSInterface {
return null; return null;
} }
@Override
public void clearPathfinderGoals(Entity entity) {
EntityInsentient nmsEnt = (EntityInsentient) ((CraftEntity) entity).getHandle();
((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((List<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
((List<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
}
@Override @Override
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) { public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
if (entity instanceof EntityInsentient) { if (entity instanceof EntityInsentient) {

View File

@ -10,10 +10,12 @@ import java.io.NotSerializableException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.StreamCorruptedException; import java.io.StreamCorruptedException;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; import org.bukkit.craftbukkit.v1_9_R1.CraftWorld;
@ -155,6 +157,15 @@ public class NMS_v1_9_R1 implements NMSInterface {
return null; return null;
} }
@Override
public void clearPathfinderGoals(Entity entity) {
EntityInsentient nmsEnt = (EntityInsentient) ((CraftEntity) entity).getHandle();
((LinkedHashSet<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((LinkedHashSet<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.goalSelector)).clear();
((LinkedHashSet<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
((LinkedHashSet<?>) ReflectionUtils.getField("c", PathfinderGoalSelector.class, nmsEnt.targetSelector)).clear();
}
@Override @Override
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) { public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
if (entity instanceof EntityInsentient) { if (entity instanceof EntityInsentient) {
@ -205,7 +216,9 @@ public class NMS_v1_9_R1 implements NMSInterface {
@Override @Override
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) { public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
Bukkit.broadcastMessage("Changing a compound");
if (mode == ChangeMode.SET) { if (mode == ChangeMode.SET) {
Bukkit.broadcastMessage("is setting");
if (delta[0] instanceof NBTTagCompound) { if (delta[0] instanceof NBTTagCompound) {
NBT[0] = (NBTTagCompound) delta[0]; NBT[0] = (NBTTagCompound) delta[0];
} else { } else {
@ -214,6 +227,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
NBT[0] = parsedNBT; NBT[0] = parsedNBT;
} }
} else if (mode == ChangeMode.ADD) { } else if (mode == ChangeMode.ADD) {
Bukkit.broadcastMessage("is adding");
if (delta[0] instanceof String) { if (delta[0] instanceof String) {
NBTTagCompound parsedNBT = null; NBTTagCompound parsedNBT = null;
parsedNBT = parseRawNBT((String) delta[0]); parsedNBT = parseRawNBT((String) delta[0]);
@ -222,6 +236,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
addToCompound(NBT[0], delta[0]); addToCompound(NBT[0], delta[0]);
} }
} else if (mode == ChangeMode.REMOVE) { } else if (mode == ChangeMode.REMOVE) {
Bukkit.broadcastMessage("is removing");
if (delta[0] instanceof NBTTagCompound) if (delta[0] instanceof NBTTagCompound)
return; return;
for (Object s : delta) { for (Object s : delta) {
@ -308,13 +323,14 @@ public class NMS_v1_9_R1 implements NMSInterface {
@Nullable @Nullable
public Class<?>[] acceptChange(ChangeMode mode) { public Class<?>[] acceptChange(ChangeMode mode) {
if (mode == ChangeMode.ADD || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) { if (mode == ChangeMode.ADD || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class); return CollectionUtils.array(Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, String.class, NBTTagCompound.class, NBTTagList.class);
} }
return null; return null;
} }
@Override @Override
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) { public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
Bukkit.broadcastMessage("Changing a NBTList");
int typeId = 0; int typeId = 0;
if (delta instanceof Byte[]) { if (delta instanceof Byte[]) {
typeId = 1; typeId = 1;
@ -335,9 +351,11 @@ public class NMS_v1_9_R1 implements NMSInterface {
} else if (delta instanceof NBTTagCompound[]) { } else if (delta instanceof NBTTagCompound[]) {
typeId = 10; typeId = 10;
} else { } else {
Bukkit.broadcastMessage("No compatible class: " + delta.getClass() + "\nStopping...");
return; return;
} }
if (mode == ChangeMode.SET) { if (mode == ChangeMode.SET) {
Bukkit.broadcastMessage("is setting");
if (typeId == 9) if (typeId == 9)
nbtList[0] = (NBTTagList) delta[0]; nbtList[0] = (NBTTagList) delta[0];
} else if (mode == ChangeMode.ADD) { } else if (mode == ChangeMode.ADD) {
@ -350,6 +368,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
addToList(nbtList, delta[0]); addToList(nbtList, delta[0]);
} }
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) { } else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
Bukkit.broadcastMessage("Is deleting/resetting");
nbtList[0] = new NBTTagList(); nbtList[0] = new NBTTagList();
} }
} }

View File

@ -57,7 +57,7 @@ public class ReflectionUtils {
} }
} }
public static Constructor<?> getConstructor(String constructor, Class<?> clazz, Object object, Class<?> ... params) { public static Constructor<?> getConstructor(Class<?> clazz, Class<?> ... params) {
Constructor<?> constr = null; Constructor<?> constr = null;
try { try {
constr = clazz.getDeclaredConstructor(params); constr = clazz.getDeclaredConstructor(params);