Some COOL stuff

Fixed PathfinderGoalMeleeAttack
Fixed error when using remove/clear pathfinder goals on an armor stand
(why is it considered a living entity?!?)
Forgot to make NBTListIndex return a single value, now fixed
Added "Minecraft ID of %itemtype%" (to return for example
"minecraft:planks")
Also some stuff I don't remember (see the changes!)
This commit is contained in:
TheBukor 2016-03-13 04:06:43 -03:00
parent 36b069fa3e
commit 48685db4be
13 changed files with 239 additions and 123 deletions

View File

@ -6,6 +6,7 @@ import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityToggleGlideEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
@ -34,6 +35,7 @@ import me.TheBukor.SkStuff.effects.EffPasteSchematic;
import me.TheBukor.SkStuff.effects.EffRememberChanges;
import me.TheBukor.SkStuff.effects.EffRemovePathGoal;
import me.TheBukor.SkStuff.effects.EffReplaceBlocksWE;
import me.TheBukor.SkStuff.effects.EffRestoreInv;
import me.TheBukor.SkStuff.effects.EffSetBlocksWE;
import me.TheBukor.SkStuff.effects.EffSetPathGoal;
import me.TheBukor.SkStuff.effects.EffShowEntityEffect;
@ -48,7 +50,9 @@ import me.TheBukor.SkStuff.expressions.ExprEditSessionLimit;
import me.TheBukor.SkStuff.expressions.ExprEndermanBlocks;
import me.TheBukor.SkStuff.expressions.ExprFileNBT;
import me.TheBukor.SkStuff.expressions.ExprFireProof;
import me.TheBukor.SkStuff.expressions.ExprGlideState;
import me.TheBukor.SkStuff.expressions.ExprItemNBT;
import me.TheBukor.SkStuff.expressions.ExprMCIdOf;
import me.TheBukor.SkStuff.expressions.ExprNBTListContents;
import me.TheBukor.SkStuff.expressions.ExprNBTListIndex;
import me.TheBukor.SkStuff.expressions.ExprNBTOf;
@ -58,6 +62,7 @@ import me.TheBukor.SkStuff.expressions.ExprSchematicArea;
import me.TheBukor.SkStuff.expressions.ExprSelectionArea;
import me.TheBukor.SkStuff.expressions.ExprSelectionOfPlayer;
import me.TheBukor.SkStuff.expressions.ExprSelectionPos;
import me.TheBukor.SkStuff.expressions.ExprSerializedInv;
import me.TheBukor.SkStuff.expressions.ExprTagOf;
import me.TheBukor.SkStuff.expressions.ExprTimespanToNumber;
import me.TheBukor.SkStuff.expressions.ExprToLowerCase;
@ -87,13 +92,32 @@ public class SkStuff extends JavaPlugin {
getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully enabled!");
getLogger().info("Registering general non version specific stuff...");
Skript.registerEffect(EffShowEntityEffect.class, "(display|play|show) entity effect (0圩irework[s] explo(de|sion)|1多urt|2吆[iron] golem] (give|offer) (rose|poppy)|3吆sheep] eat grass|4安olf shake) at %entity%");
Skript.registerEffect(EffRestoreInv.class, "[(skstuff|1.9)] restore %inventory% (to|from) [serialized [inventory [conents]]] %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%");
Skript.registerExpression(ExprToLowerCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] lower[ ]case", "convert %string% to [all] lower[ ]case", "un[( |-)]capitalize [all] [char[acter]s (of|in)] %string%");
Skript.registerExpression(ExprWordsToUpperCase.class, String.class, ExpressionType.SIMPLE, "(first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% [converted] to (cap[ital]s|upper[ ]case) (0帆1夷gnoring [other] upper[ ]case [(char[acter]s|letters)])", "convert (first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% to (cap[ital]s|upper[ ]case) (0帆1夷gnoring [other] upper[ ]case [(char[acter]s|letters)])", "capitalize (first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% (0帆1夷gnoring [other] upper[ ]case [(char[acter]s|letters)])");
Skript.registerExpression(ExprTimespanToNumber.class, Number.class, ExpressionType.SIMPLE, "%timespan% [converted] [in]to (0宇icks|1存ec[ond]s|2妃in[ute]s|3多ours|4圬ays)");
Skript.registerExpression(ExprClickedInventory.class, Inventory.class, ExpressionType.SIMPLE, "[skstuff] clicked inventory");
effAmount += 1;
exprAmount += 5;
Skript.registerExpression(ExprSerializedInv.class, String.class, ExpressionType.PROPERTY, "[(skstuff|1.9)] serialized [contents of] %inventory%");
Skript.registerExpression(ExprMCIdOf.class, String.class, ExpressionType.PROPERTY, "minecraft [(string|native)] id of %itemtype%", "%itemtype%'s minecraft [(string|native)] id");
effAmount += 2;
exprAmount += 7;
if (Skript.isRunningMinecraft(1, 9)) {
getLogger().info("WOW! You're using Minecraft 1.9! Lemme register some cool stuff right away!");
Skript.registerEvent("Elytra glide toggle", SimpleEvent.class, EntityToggleGlideEvent.class, "[entity] elytra (fl(y|ight)|glid(e|ing)) toggl(e|ing)", "[entity] toggle elytra (fl(y|ight)|glid(e|ing))");
Skript.registerExpression(ExprGlideState.class, Boolean.class, ExpressionType.PROPERTY, "elytra (fl(y|ight)|glid(e|ing)) state of %player%", "%player%'s elytra (fl(y|ight)|glid(e|ing)) state");
/* Don't register it yet, Spigot isn't doing it properly as of now.
EventValues.registerEventValue(EntityToggleGlideEvent.class, Entity.class, new Getter<Entity, EntityToggleGlideEvent>() {
@Override
@Nullable
public Entity get(EntityToggleGlideEvent e) {
return e.getEntity();
}
}, 0);
*/
evtAmount += 1;
exprAmount += 1;
}
if (setupNMSVersion()) {
getLogger().info("Trying to register version specific stuff...");
Skript.registerEffect(EffClearPathGoals.class, "(clear|delete) [all] pathfind[er] goals (of|from) %livingentities%");

View File

@ -2,6 +2,7 @@ package me.TheBukor.SkStuff.effects;
import javax.annotation.Nullable;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
@ -31,7 +32,7 @@ public class EffClearPathGoals extends Effect {
protected void execute(Event e) {
LivingEntity[] ents = entities.getAll(e);
for (LivingEntity ent : ents) {
if (ent instanceof Player || ent == null)
if (ent instanceof Player || ent instanceof ArmorStand || ent == null)
continue;
SkStuff.getNMSMethods().clearPathfinderGoals(ent);
}

View File

@ -4,6 +4,7 @@ import java.lang.reflect.InvocationTargetException;
import javax.annotation.Nullable;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Blaze;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Ghast;
@ -45,7 +46,7 @@ public class EffRemovePathGoal extends Effect {
protected void execute(Event e) {
LivingEntity[] ents = entities.getAll(e);
for (LivingEntity ent : ents) {
if (ent instanceof Player || ent == null)
if (ent instanceof Player || ent instanceof ArmorStand || ent == null)
return;
Object obcEnt = craftLivEnt.cast(ent);
Object nmsEnt = null;

View File

@ -9,6 +9,7 @@ import javax.annotation.Nullable;
import org.bukkit.Material;
import org.bukkit.entity.Animals;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Blaze;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Enderman;
@ -149,7 +150,7 @@ public class EffSetPathGoal extends Effect {
protected void execute(Event e) {
LivingEntity[] ents = entities.getAll(e);
for (LivingEntity ent : ents) {
if (ent == null || ent instanceof Player)
if (ent == null || ent instanceof Player || ent instanceof ArmorStand)
return;
int priority = (goalPriority == null ? 4 : goalPriority.getSingle(e).intValue());
@ -174,7 +175,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -188,7 +189,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -239,7 +240,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -268,7 +269,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -284,7 +285,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -297,18 +298,7 @@ public class EffSetPathGoal extends Effect {
double spd = (meleeSpeed == null ? 1.0D : meleeSpeed.getSingle(e).doubleValue());
boolean memorize = (meleeMemorize == null ? false : meleeMemorize.getSingle(e));
Class<?> goalMeleeAttack = ReflectionUtils.getNMSClass("PathfinderGoalMeleeAttack");
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
className = "Living";
}
Class<?> nmsClass = ReflectionUtils.getNMSClass("Entity" + className);
newGoals.add(goalMeleeAttack.getConstructor(entCreature, Class.class, double.class, boolean.class).newInstance(nmsEnt, nmsClass, spd, memorize));
}
newGoals.add(goalMeleeAttack.getConstructor(entCreature, double.class, boolean.class).newInstance(nmsEnt, spd, memorize));
}
} else if (mark == 13) {
double spd = (moveTargetSpeed == null ? 1.0D : moveTargetSpeed.getSingle(e).doubleValue());
@ -323,7 +313,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -338,7 +328,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {
@ -449,7 +439,7 @@ public class EffSetPathGoal extends Effect {
for (EntityData<?> entData : types) {
if (!LivingEntity.class.isAssignableFrom(entData.getType()))
return;
String className = entData.getType().getClass().getSimpleName();
String className = entData.getType().getSimpleName();
if (className.equals("HumanEntity")) {
className = "Human";
} else if (className.equals("EntityLiving")) {

View File

@ -0,0 +1,69 @@
package me.TheBukor.SkStuff.expressions;
import javax.annotation.Nullable;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import net.minecraft.server.v1_9_R1.EntityPlayer;
public class ExprGlideState extends SimpleExpression<Boolean> {
private Expression<Player> player;
@Override
public boolean isSingle() {
return true;
}
@Override
public Class<? extends Boolean> getReturnType() {
return Boolean.class;
}
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
player = (Expression<Player>) expr[0];
return true;
}
@Override
public String toString(@Nullable Event e, boolean debug) {
return "elytra gliding state of " + player.toString(e, debug);
}
@Override
@Nullable
protected Boolean[] get(Event e) {
Player p = player.getSingle(e);
EntityPlayer nmsPlayer = ((CraftPlayer) p).getHandle();
return new Boolean[] { nmsPlayer.cB() };
}
@SuppressWarnings("unchecked")
@Override
@Nullable
public Class<?>[] acceptChange(ChangeMode mode) {
if (mode == ChangeMode.SET) {
return CollectionUtils.array(Boolean.class);
}
return null;
}
@Override
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
Player p = player.getSingle(e);
EntityPlayer nmsPlayer = ((CraftPlayer) p).getHandle();
if (mode == ChangeMode.SET) {
boolean newValue = (boolean) delta[0];
nmsPlayer.setFlag(7, newValue);
}
}
}

View File

@ -0,0 +1,49 @@
package me.TheBukor.SkStuff.expressions;
import javax.annotation.Nullable;
import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import me.TheBukor.SkStuff.SkStuff;
public class ExprMCIdOf extends SimpleExpression<String> {
private Expression<ItemType> itemType;
@Override
public boolean isSingle() {
return true;
}
@Override
public Class<? extends String> getReturnType() {
return String.class;
}
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
itemType = (Expression<ItemType>) expr[0];
return true;
}
@Override
public String toString(@Nullable Event e, boolean debug) {
return "minecraft id of " + itemType.toString(e, debug);
}
@SuppressWarnings("deprecation")
@Override
@Nullable
protected String[] get(Event e) {
ItemType type = itemType.getSingle(e);
ItemStack item = new ItemStack(type.getTypes().get(0).getId());
return new String[] { SkStuff.getNMSMethods().getMCId(item) };
}
}

View File

@ -26,7 +26,7 @@ public class ExprNBTListIndex extends SimpleExpression<Object> {
@Override
public boolean isSingle() {
return false;
return true;
}
@SuppressWarnings("unchecked")

View File

@ -55,4 +55,6 @@ public interface NMSInterface {
public Object convertToNBT(Number number);
public Object convertToNBT(String string);
public String getMCId(ItemStack itemStack);
}

View File

@ -30,20 +30,21 @@ import ch.njol.skript.classes.Parser;
import ch.njol.skript.lang.ParseContext;
import ch.njol.skript.registrations.Classes;
import ch.njol.util.coll.CollectionUtils;
import net.minecraft.server.v1_7_R4.Item;
import net.minecraft.server.v1_7_R4.MojangsonParser;
import net.minecraft.server.v1_7_R4.NBTBase;
import net.minecraft.server.v1_7_R4.NBTCompressedStreamTools;
import net.minecraft.server.v1_7_R4.NBTTagByte;
import net.minecraft.server.v1_7_R4.NBTTagCompound;
import net.minecraft.server.v1_7_R4.NBTTagDouble;
import net.minecraft.server.v1_7_R4.NBTTagFloat;
import net.minecraft.server.v1_7_R4.NBTTagInt;
import net.minecraft.server.v1_7_R4.NBTTagList;
import net.minecraft.server.v1_7_R4.NBTTagLong;
import net.minecraft.server.v1_7_R4.NBTTagShort;
import net.minecraft.server.v1_7_R4.NBTTagString;
import net.minecraft.server.v1_7_R4.TileEntity;
import net.minecraft.server.v1_7_R4.World;
import net.minecraft.server.v1_8_R3.NBTTagByte;
import net.minecraft.server.v1_8_R3.NBTTagLong;
import net.minecraft.server.v1_8_R3.NBTTagShort;
public class NMS_v1_7_R4 implements NMSInterface {
@ -456,48 +457,33 @@ public class NMS_v1_7_R4 implements NMSInterface {
}
}
public NBTTagByte convertToNBT(byte b) {
return new NBTTagByte(b);
}
public NBTTagShort convertToNBT(short s) {
return new NBTTagShort(s);
}
public NBTTagInt convertToNBT(int i) {
return new NBTTagInt(i);
}
public NBTTagLong convertToNBT(long l) {
return new NBTTagLong(l);
}
public NBTTagFloat convertToNBT(float f) {
return new NBTTagFloat(f);
}
public NBTTagDouble convertToNBT(double d) {
return new NBTTagDouble(d);
@Override
public NBTBase convertToNBT(Number number) {
if (number instanceof Byte) {
return new NBTTagByte((byte) number);
} else if (number instanceof Short) {
return new NBTTagShort((short) number);
} else if (number instanceof Integer) {
return new NBTTagInt((int) number);
} else if (number instanceof Long) {
return new NBTTagLong((long) number);
} else if (number instanceof Float) {
return new NBTTagFloat((float) number);
} else if (number instanceof Double) {
return new NBTTagDouble((double) number);
}
return null;
}
@Override
public NBTTagString convertToNBT(String string) {
return new NBTTagString(string);
}
@Override
public Object convertToNBT(Number number) {
if (number instanceof Byte)
return convertToNBT((byte) number);
else if (number instanceof Short)
return convertToNBT((short) number);
else if (number instanceof Integer)
return convertToNBT((int) number);
else if (number instanceof Long)
return convertToNBT((long) number);
else if (number instanceof Float)
return convertToNBT((float) number);
else if (number instanceof Double)
return convertToNBT((double) number);
return number;
public String getMCId(ItemStack itemStack) {
net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
String test = Item.REGISTRY.c(nmsItem.getItem());
return test;
}
}

View File

@ -48,6 +48,8 @@ import net.minecraft.server.v1_8_R1.PathfinderGoal;
import net.minecraft.server.v1_8_R1.PathfinderGoalSelector;
import net.minecraft.server.v1_8_R1.TileEntity;
import net.minecraft.server.v1_8_R1.World;
import net.minecraft.server.v1_8_R1.Item;
import net.minecraft.server.v1_8_R1.MinecraftKey;
public class NMS_v1_8_R1 implements NMSInterface {
@ -560,4 +562,11 @@ public class NMS_v1_8_R1 implements NMSInterface {
public NBTTagString convertToNBT(String string) {
return new NBTTagString(string);
}
@Override
public String getMCId(ItemStack itemStack) {
net.minecraft.server.v1_8_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
MinecraftKey mcKey = (MinecraftKey) Item.REGISTRY.c(nmsItem.getItem());
return mcKey.toString();
}
}

View File

@ -50,6 +50,8 @@ import net.minecraft.server.v1_8_R2.PathfinderGoal;
import net.minecraft.server.v1_8_R2.PathfinderGoalSelector;
import net.minecraft.server.v1_8_R2.TileEntity;
import net.minecraft.server.v1_8_R2.World;
import net.minecraft.server.v1_8_R2.Item;
import net.minecraft.server.v1_8_R2.MinecraftKey;
public class NMS_v1_8_R2 implements NMSInterface {
@ -566,4 +568,11 @@ public class NMS_v1_8_R2 implements NMSInterface {
public NBTTagString convertToNBT(String string) {
return new NBTTagString(string);
}
@Override
public String getMCId(ItemStack itemStack) {
net.minecraft.server.v1_8_R2.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
MinecraftKey mcKey = Item.REGISTRY.c(nmsItem.getItem());
return mcKey.toString();
}
}

View File

@ -50,6 +50,8 @@ import net.minecraft.server.v1_8_R3.PathfinderGoal;
import net.minecraft.server.v1_8_R3.PathfinderGoalSelector;
import net.minecraft.server.v1_8_R3.TileEntity;
import net.minecraft.server.v1_8_R3.World;
import net.minecraft.server.v1_8_R3.Item;
import net.minecraft.server.v1_8_R3.MinecraftKey;
public class NMS_v1_8_R3 implements NMSInterface {
@ -566,4 +568,11 @@ public class NMS_v1_8_R3 implements NMSInterface {
public NBTTagString convertToNBT(String string) {
return new NBTTagString(string);
}
@Override
public String getMCId(ItemStack itemStack) {
net.minecraft.server.v1_8_R3.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
MinecraftKey mcKey = Item.REGISTRY.c(nmsItem.getItem());
return mcKey.toString();
}
}

View File

@ -11,11 +11,9 @@ import java.io.OutputStream;
import java.io.StreamCorruptedException;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import javax.annotation.Nullable;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_9_R1.CraftWorld;
@ -36,6 +34,8 @@ import ch.njol.yggdrasil.Fields;
import net.minecraft.server.v1_9_R1.BlockPosition;
import net.minecraft.server.v1_9_R1.EntityInsentient;
import net.minecraft.server.v1_9_R1.IBlockData;
import net.minecraft.server.v1_9_R1.Item;
import net.minecraft.server.v1_9_R1.MinecraftKey;
import net.minecraft.server.v1_9_R1.MojangsonParseException;
import net.minecraft.server.v1_9_R1.MojangsonParser;
import net.minecraft.server.v1_9_R1.NBTBase;
@ -171,7 +171,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
if (entity instanceof EntityInsentient) {
((EntityInsentient) entity).setGoalTarget(null);
if (isTargetSelector) {
Iterator<?> goals = ((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, ((EntityInsentient) entity).targetSelector)).iterator();
Iterator<?> goals = ((LinkedHashSet<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, ((EntityInsentient) entity).targetSelector)).iterator();
while (goals.hasNext()) {
Object goal = goals.next();
if (ReflectionUtils.getField("a", goal.getClass(), goal).getClass() == goalClass) {
@ -179,7 +179,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
}
}
} else {
Iterator<?> goals = ((List<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, ((EntityInsentient) entity).goalSelector)).iterator();
Iterator<?> goals = ((LinkedHashSet<?>) ReflectionUtils.getField("b", PathfinderGoalSelector.class, ((EntityInsentient) entity).goalSelector)).iterator();
while (goals.hasNext()) {
Object goal = goals.next();
if (ReflectionUtils.getField("a", goal.getClass(), goal).getClass() == goalClass) {
@ -208,26 +208,15 @@ public class NMS_v1_9_R1 implements NMSInterface {
@Override
@Nullable
public Class<?>[] acceptChange(ChangeMode mode) {
if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) {
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) {
return CollectionUtils.array(String.class, NBTTagCompound.class);
}
return null;
}
@Override
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
Bukkit.broadcastMessage("Changing a compound");
if (mode == ChangeMode.SET) {
Bukkit.broadcastMessage("is setting");
if (delta[0] instanceof NBTTagCompound) {
NBT[0] = (NBTTagCompound) delta[0];
} else {
NBTTagCompound parsedNBT = null;
parsedNBT = parseRawNBT((String) delta[0]);
NBT[0] = parsedNBT;
}
} else if (mode == ChangeMode.ADD) {
Bukkit.broadcastMessage("is adding");
if (mode == ChangeMode.ADD) {
if (delta[0] instanceof String) {
NBTTagCompound parsedNBT = null;
parsedNBT = parseRawNBT((String) delta[0]);
@ -236,7 +225,6 @@ public class NMS_v1_9_R1 implements NMSInterface {
addToCompound(NBT[0], delta[0]);
}
} else if (mode == ChangeMode.REMOVE) {
Bukkit.broadcastMessage("is removing");
if (delta[0] instanceof NBTTagCompound)
return;
for (Object s : delta) {
@ -322,7 +310,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
@Override
@Nullable
public Class<?>[] acceptChange(ChangeMode mode) {
if (mode == ChangeMode.ADD || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
if (mode == ChangeMode.ADD) {
return CollectionUtils.array(Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, String.class, NBTTagCompound.class, NBTTagList.class);
}
return null;
@ -330,46 +318,16 @@ public class NMS_v1_9_R1 implements NMSInterface {
@Override
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
Bukkit.broadcastMessage("Changing a NBTList");
int typeId = 0;
if (delta instanceof Byte[]) {
typeId = 1;
} else if (delta instanceof Short[]) {
typeId = 2;
} else if (delta instanceof Integer[]) {
typeId = 3;
} else if (delta instanceof Long[]) {
typeId = 4;
} else if (delta instanceof Float[]) {
typeId = 5;
} else if (delta instanceof Double[]) {
typeId = 6;
} else if (delta instanceof String[]) {
typeId = 8;
} else if (delta instanceof NBTTagList[]) {
typeId = 9;
} else if (delta instanceof NBTTagCompound[]) {
typeId = 10;
} else {
Bukkit.broadcastMessage("No compatible class: " + delta.getClass() + "\nStopping...");
if (delta.length == 0)
return;
}
if (mode == ChangeMode.SET) {
Bukkit.broadcastMessage("is setting");
if (typeId == 9)
nbtList[0] = (NBTTagList) delta[0];
} else if (mode == ChangeMode.ADD) {
if (getContentsId(nbtList[0]) == typeId) {
if (delta[0] instanceof Number)
addToList(nbtList, convertToNBT((Number) delta[0]));
else if (delta[0] instanceof String)
addToList(nbtList, convertToNBT((String) delta[0]));
else if (delta[0] instanceof NBTTagCompound || delta[0] instanceof NBTTagList)
addToList(nbtList, delta[0]);
if (mode == ChangeMode.ADD) {
if (delta[0] instanceof Number) {
addToList(nbtList[0], convertToNBT((Number) delta[0]));
} else if (delta[0] instanceof String) {
addToList(nbtList[0], convertToNBT((String) delta[0]));
} else if (delta[0] instanceof NBTBase) {
addToList(nbtList[0], delta[0]);
}
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
Bukkit.broadcastMessage("Is deleting/resetting");
nbtList[0] = new NBTTagList();
}
}
}).parser(new Parser<NBTTagList>() {
@ -558,6 +516,7 @@ public class NMS_v1_9_R1 implements NMSInterface {
}
}
@Override
public NBTBase convertToNBT(Number number) {
if (number instanceof Byte) {
return new NBTTagByte((byte) number);
@ -575,7 +534,15 @@ public class NMS_v1_9_R1 implements NMSInterface {
return null;
}
@Override
public NBTTagString convertToNBT(String string) {
return new NBTTagString(string);
}
@Override
public String getMCId(ItemStack itemStack) {
net.minecraft.server.v1_9_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
MinecraftKey mcKey = Item.REGISTRY.b(nmsItem.getItem());
return mcKey.toString();
}
}