1.13 & 1.14 Update, removal of old stuff
1.13 & 1.14 Update, removed worldedit, nbt, vanishnopacket stuff and old version stuff
This commit is contained in:
		
							parent
							
								
									752c8e2da4
								
							
						
					
					
						commit
						fbe72a548e
					
				@ -1,49 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.conditions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Condition;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Checker;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class CondSelectionContains extends Condition {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private Expression<Location> loc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		loc = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		setNegated(matchedPattern == 2 || matchedPattern == 3);
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "if WorldEdit selection of " + player.toString(e, debug) + (isNegated() ? " doesn't contain " : " contains ") + loc.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean check(final Event e) {
 | 
					 | 
				
			||||||
		final WorldEditPlugin we = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
		if (we.getSelection(player.getSingle(e)) == null) {
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return player.check(e, new Checker<Player>() {
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean check(Player p) {
 | 
					 | 
				
			||||||
				return we.getSelection(p).contains(loc.getSingle(e));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}, isNegated());
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,52 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffDrainLiquid extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
	private Expression<Double> radius;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		radius = (Expression<Double>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "drain liquids at " + location.toString(e, debug) + " in a radius of " + radius.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad = radius.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.drainArea(BukkitUtil.toVector(loc), rad);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,70 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffDrawLineWE extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location1;
 | 
					 | 
				
			||||||
	private Expression<Location> location2;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList;
 | 
					 | 
				
			||||||
	private Expression<Double> thickness;
 | 
					 | 
				
			||||||
	private boolean filled = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location1 = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		location2 = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		blockList = (Expression<ItemStack>) expr[3];
 | 
					 | 
				
			||||||
		thickness = (Expression<Double>) expr[4];
 | 
					 | 
				
			||||||
		if (result.mark == 1)
 | 
					 | 
				
			||||||
			filled = false;
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "draw a line from " + location1.toString(e, debug) + " to " + location2.toString(e, debug) + " using an edit session with " + blockList.toString(e, debug) + " and thickness " + thickness.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location pos1 = location1.getSingle(e);
 | 
					 | 
				
			||||||
		Location pos2 = location2.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList.getAll(e);
 | 
					 | 
				
			||||||
		Double thick = thickness.getSingle(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.drawLine(Patterns.wrap(random), BukkitUtil.toVector(pos1), BukkitUtil.toVector(pos2), thick, filled);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (MaxChangedBlocksException ex) {
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,76 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffMakeCylinder extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
	private Expression<Double> radius1;
 | 
					 | 
				
			||||||
	private Expression<Double> radius2;
 | 
					 | 
				
			||||||
	private Expression<Integer> height;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList;
 | 
					 | 
				
			||||||
	private boolean filled = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		radius1 = (Expression<Double>) expr[1];
 | 
					 | 
				
			||||||
		height = (Expression<Integer>) expr[2];
 | 
					 | 
				
			||||||
		radius2 = (Expression<Double>) expr[3];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[4];
 | 
					 | 
				
			||||||
		blockList = (Expression<ItemStack>) expr[5];
 | 
					 | 
				
			||||||
		if (result.mark == 1)
 | 
					 | 
				
			||||||
			filled = false;
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "create a cylinder at " + location.toString(e, debug) + " with a radius of " + radius1.toString(e, debug) + " " + height.toString(e, debug) + " " + radius2.toString(e, debug) + " using an edit session with " + blockList.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad1 = radius1.getSingle(e);
 | 
					 | 
				
			||||||
		Integer h = height.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad2 = radius2.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList.getAll(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.makeCylinder(BukkitUtil.toVector(loc), Patterns.wrap(random), rad1, rad2, h, filled);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,70 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffMakePyramid extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
	private Expression<Integer> radius;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList;
 | 
					 | 
				
			||||||
	private boolean filled = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		radius = (Expression<Integer>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		blockList = (Expression<ItemStack>) expr[3];
 | 
					 | 
				
			||||||
		if (result.mark == 1)
 | 
					 | 
				
			||||||
			filled = false;
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "create a pyramid at " + location.toString(e, debug) + " with a radius of " + radius.toString(e, debug) + " using an edit session with " + blockList.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		Integer rad = radius.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList.getAll(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.makePyramid(BukkitUtil.toVector(loc), Patterns.wrap(random), rad, filled);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,76 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffMakeSphere extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
	private Expression<Double> radius1;
 | 
					 | 
				
			||||||
	private Expression<Double> radius2;
 | 
					 | 
				
			||||||
	private Expression<Double> radius3;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList;
 | 
					 | 
				
			||||||
	private boolean filled = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		radius1 = (Expression<Double>) expr[1];
 | 
					 | 
				
			||||||
		radius2 = (Expression<Double>) expr[2];
 | 
					 | 
				
			||||||
		radius3 = (Expression<Double>) expr[3];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[4];
 | 
					 | 
				
			||||||
		blockList = (Expression<ItemStack>) expr[5];
 | 
					 | 
				
			||||||
		if (result.mark == 1)
 | 
					 | 
				
			||||||
			filled = false;
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "create a sphere centered at " + location.toString(e, debug) + " with a radius of " + radius1.toString(e, debug) + " " + radius2.toString(e, debug) + " " + radius3.toString(e, debug) + " using an edit session with " + blockList.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad1 = radius1.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad2 = radius2.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad3 = radius3.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList.getAll(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.makeSphere(BukkitUtil.toVector(loc), Patterns.wrap(random), rad1, rad2, rad3, filled);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,69 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffMakeWalls extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location1;
 | 
					 | 
				
			||||||
	private Expression<Location> location2;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location1 = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		location2 = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		blockList = (Expression<ItemStack>) expr[3];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "make walls from " + location1.toString(e, debug) + " to " + location2.toString(e, debug) + " using an edit session with " + blockList.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location pos1 = location1.getSingle(e);
 | 
					 | 
				
			||||||
		Location pos2 = location2.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList.getAll(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.makeWalls(new CuboidRegion((World) BukkitUtil.getLocalWorld(pos1.getWorld()), BukkitUtil.toVector(pos1), BukkitUtil.toVector(pos2)), Patterns.wrap(random));
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,54 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffNaturalize extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location1;
 | 
					 | 
				
			||||||
	private Expression<Location> location2;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location1 = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		location2 = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "naturalize all blocks from " + location1.toString(e, debug) + " to " + location2.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location pos1 = location1.getSingle(e);
 | 
					 | 
				
			||||||
		Location pos2 = location2.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		CuboidRegion region = new CuboidRegion(BukkitUtil.toVector(pos1), BukkitUtil.toVector(pos2));
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.naturalizeCuboidBlocks(region);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,65 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.Vector;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.data.DataException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.schematic.SchematicFormat;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
public class EffPasteSchematic extends Effect {
 | 
					 | 
				
			||||||
	private Expression<String> schematic;
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private int mark;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		mark = result.mark;
 | 
					 | 
				
			||||||
		schematic = (Expression<String>) expr[0];
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "paste schematic " + schematic.toString(e, debug) + " at " + location.toString(e, debug) + " using edit session" + (mark == 1 ? " ignoring air" : "");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		String schem = schematic.getSingle(e);
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		Vector origin = BukkitUtil.toVector(loc);
 | 
					 | 
				
			||||||
		boolean noAir = false;
 | 
					 | 
				
			||||||
		if (mark == 1)
 | 
					 | 
				
			||||||
			noAir = true;
 | 
					 | 
				
			||||||
		File schemFile = new File((schem.endsWith(".schematic") ? schem : (schem + ".schematic")));
 | 
					 | 
				
			||||||
		if (!schemFile.exists() || session == null)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			SchematicFormat.getFormat(schemFile).load(schemFile).paste(session, origin, noAir);
 | 
					 | 
				
			||||||
		} catch (MaxChangedBlocksException | DataException | IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,42 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffRememberChanges extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[1];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "make " + player.toString(e, debug) + " remember changes from edit session";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		WorldEditPlugin we = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		if (we.getSession(p) == null) return;
 | 
					 | 
				
			||||||
		we.getSession(p).remember(session);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,81 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.HashSet;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffReplaceBlocksWE extends Effect {
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList1;
 | 
					 | 
				
			||||||
	private Expression<Location> location1;
 | 
					 | 
				
			||||||
	private Expression<Location> location2;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList2;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		blockList1 = (Expression<ItemStack>) expr[0];
 | 
					 | 
				
			||||||
		location1 = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		location2 = (Expression<Location>) expr[2];
 | 
					 | 
				
			||||||
		blockList2 = (Expression<ItemStack>) expr[3];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[4];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "replace all " + blockList1.toString(e, debug) + " from " + location1.toString(e, debug) + " to " + location2.toString(e, debug) + " with " + blockList1.toString(e, debug) + " using an edit session";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings({ "deprecation" })
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location pos1 = location1.getSingle(e);
 | 
					 | 
				
			||||||
		Location pos2 = location2.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList1.getAll(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocksToPlace = blockList2.getAll(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		Set<BaseBlock> blocksToReplace = new HashSet<BaseBlock>();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				blocksToReplace.add(new BaseBlock(b.getTypeId(), b.getDurability()));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for (ItemStack b : blocksToPlace) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.replaceBlocks(new CuboidRegion((World) BukkitUtil.getLocalWorld(pos1.getWorld()), BukkitUtil.toVector(pos1), BukkitUtil.toVector(pos2)), blocksToReplace, Patterns.wrap(random));
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,69 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.BlockPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.Patterns;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffSetBlocksWE extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location1;
 | 
					 | 
				
			||||||
	private Expression<Location> location2;
 | 
					 | 
				
			||||||
	private Expression<ItemStack> blockList;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location1 = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		location2 = (Expression<Location>) expr[1];
 | 
					 | 
				
			||||||
		blockList = (Expression<ItemStack>) expr[2];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[3];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "set all blocks from " + location1.toString(e, debug) + " to " + location2.toString(e, debug) + " to " + blockList.toString(e, debug) + " using an edit session";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location pos1 = location1.getSingle(e);
 | 
					 | 
				
			||||||
		Location pos2 = location2.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		ItemStack[] blocks = blockList.getAll(e);
 | 
					 | 
				
			||||||
		RandomPattern random = new RandomPattern();
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		for (ItemStack b : blocks) {
 | 
					 | 
				
			||||||
			if (b.getType().isBlock()) {
 | 
					 | 
				
			||||||
				random.add(new BlockPattern(new BaseBlock(b.getTypeId(), b.getDurability())), 50);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.setBlocks(new CuboidRegion((World) BukkitUtil.getLocalWorld(pos1.getWorld()), BukkitUtil.toVector(pos1), BukkitUtil.toVector(pos2)), Patterns.wrap(random));
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,52 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEditException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffSimulateSnow extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
	private Expression<Double> radius;
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		radius = (Expression<Double>) expr[1];
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[2];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "make " + location.toString(e, debug) + " snowy in a radius of " + radius.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		Double rad = radius.getSingle(e);
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			session.simulateSnow(BukkitUtil.toVector(loc), rad);
 | 
					 | 
				
			||||||
			session.flushQueue();
 | 
					 | 
				
			||||||
		} catch (WorldEditException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof MaxChangedBlocksException)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,47 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.plugin.Plugin;
 | 
					 | 
				
			||||||
import org.kitteh.vanish.VanishPlugin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffToggleVanish extends Effect {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private Plugin vanishPlugin = Bukkit.getPluginManager().getPlugin("VanishNoPacket");
 | 
					 | 
				
			||||||
	private boolean silent = false;
 | 
					 | 
				
			||||||
	private String toStringMark = "";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		if (result.mark == 1) {
 | 
					 | 
				
			||||||
			toStringMark = " silently";
 | 
					 | 
				
			||||||
			silent = true;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "toggle vanished state of " + player.toString(e, debug) + toStringMark;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		if (silent) {
 | 
					 | 
				
			||||||
			((VanishPlugin) vanishPlugin).getManager().toggleVanishQuiet(p, false);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			((VanishPlugin) vanishPlugin).getManager().toggleVanish(p);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,43 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.effects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Effect;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EffUndoRedoSession extends Effect {
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	private boolean redo = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[0];
 | 
					 | 
				
			||||||
		if (result.mark == 1)
 | 
					 | 
				
			||||||
			redo = true;
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return (redo == true ? "redo " : "undo ") + "changes from edit session";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected void execute(Event e) {
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		if (session == null) return;
 | 
					 | 
				
			||||||
		if (redo == false) { 
 | 
					 | 
				
			||||||
			session.undo(session);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			session.redo(session);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		session.flushQueue();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,46 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.events;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Cancellable;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.event.HandlerList;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EvtWorldEditChange extends Event implements Cancellable {
 | 
					 | 
				
			||||||
	private static Player player;
 | 
					 | 
				
			||||||
	private static Block block;
 | 
					 | 
				
			||||||
	private boolean cancelled;
 | 
					 | 
				
			||||||
	private static final HandlerList handlers = new HandlerList();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	EvtWorldEditChange(Player player, Block block) {
 | 
					 | 
				
			||||||
		EvtWorldEditChange.player = player;
 | 
					 | 
				
			||||||
		EvtWorldEditChange.block = block;
 | 
					 | 
				
			||||||
		this.cancelled = false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public static Player getPlayer() {
 | 
					 | 
				
			||||||
		return player;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public static Block getBlock() {
 | 
					 | 
				
			||||||
		return block;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public HandlerList getHandlers() {
 | 
					 | 
				
			||||||
		return handlers;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public static HandlerList getHandlerList() {
 | 
					 | 
				
			||||||
		return handlers;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isCancelled() {
 | 
					 | 
				
			||||||
		return this.cancelled;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setCancelled(boolean bool) {
 | 
					 | 
				
			||||||
		this.cancelled = bool;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,24 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.events;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.WorldEdit;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.event.extent.EditSessionEvent;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.extension.platform.Actor;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.util.eventbus.Subscribe;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class WorldEditChangeHandler {
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public WorldEditChangeHandler() {
 | 
					 | 
				
			||||||
		WorldEdit.getInstance().getEventBus().register(this);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
    @Subscribe
 | 
					 | 
				
			||||||
    public void wrapForLogging(EditSessionEvent event) {
 | 
					 | 
				
			||||||
        Actor actor = event.getActor();
 | 
					 | 
				
			||||||
        World world = event.getWorld();
 | 
					 | 
				
			||||||
        if (actor != null && world instanceof BukkitWorld) {
 | 
					 | 
				
			||||||
            event.setExtent(new WorldEditExtent(actor, world, event.getExtent()));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,34 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.events;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.World;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.Vector;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.blocks.BaseBlock;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.extension.platform.Actor;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.extent.Extent;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.extent.logging.AbstractLoggingExtent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class WorldEditExtent extends AbstractLoggingExtent {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private final Actor actor;
 | 
					 | 
				
			||||||
    private final World world;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public WorldEditExtent(Actor actor, com.sk89q.worldedit.world.World weWorld, Extent extent) {
 | 
					 | 
				
			||||||
        super(extent);
 | 
					 | 
				
			||||||
        this.actor = actor;
 | 
					 | 
				
			||||||
        this.world = ((BukkitWorld) weWorld).getWorld();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    protected void onBlockChange(final Vector vec, BaseBlock baseBlock) {
 | 
					 | 
				
			||||||
        final Block b = BukkitUtil.toLocation(world, vec).getBlock();
 | 
					 | 
				
			||||||
       	final Player p = Bukkit.getPlayerExact(actor.getName());
 | 
					 | 
				
			||||||
       	EvtWorldEditChange event = new EvtWorldEditChange(p, b);
 | 
					 | 
				
			||||||
		Bukkit.getPluginManager().callEvent(event);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,46 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprChangedBlocksSession extends SimpleExpression<Integer> {
 | 
					 | 
				
			||||||
	private Expression<EditSession> editSession;
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Integer> getReturnType() {
 | 
					 | 
				
			||||||
		return Integer.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		editSession = (Expression<EditSession>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the number of changed blocks in an edit session";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Integer[] get(Event e) {
 | 
					 | 
				
			||||||
		EditSession session = editSession.getSingle(e);
 | 
					 | 
				
			||||||
		if (session == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		return new Integer[] { session.getBlockChangeCount() };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,162 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.ArrayList;
 | 
					 | 
				
			||||||
import java.util.Arrays;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Enderman;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprEndermanBlocks extends SimpleExpression<ItemStack> {
 | 
					 | 
				
			||||||
	private Expression<Entity> entity;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Class<?> nmsBlockClass = ReflectionUtils.getNMSClass("Block");
 | 
					 | 
				
			||||||
	private Class<?> endermanClass = ReflectionUtils.getNMSClass("EntityEnderman");
 | 
					 | 
				
			||||||
	private Class<?> nmsIBlockData = ReflectionUtils.getNMSClass("IBlockData");
 | 
					 | 
				
			||||||
	private Class<?> nmsItemClass = ReflectionUtils.getNMSClass("ItemStack");
 | 
					 | 
				
			||||||
	private Class<?> craftEntClass = ReflectionUtils.getOBCClass("entity.CraftEntity");
 | 
					 | 
				
			||||||
	private Class<?> craftItemClass = ReflectionUtils.getOBCClass("inventory.CraftItemStack");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends ItemStack> getReturnType() {
 | 
					 | 
				
			||||||
		return ItemStack.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		entity = (Expression<Entity>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "blocks that " + entity.toString(e, debug) + " can carry";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected ItemStack[] get(Event e) {
 | 
					 | 
				
			||||||
		Entity ent = entity.getSingle(e);
 | 
					 | 
				
			||||||
		if (ent == null || !(ent instanceof Enderman))
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		Object nmsEnt = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent);
 | 
					 | 
				
			||||||
		} catch (Exception ex) {
 | 
					 | 
				
			||||||
			ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		Set<Object> nmsBlocks = (Set<Object>) ReflectionUtils.getField("c", endermanClass, nmsEnt);
 | 
					 | 
				
			||||||
		List<ItemStack> items = new ArrayList<ItemStack>();
 | 
					 | 
				
			||||||
		for (Object nmsBlock : nmsBlocks) {
 | 
					 | 
				
			||||||
			Object nmsBlockData;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				nmsBlockData = nmsBlockClass.getMethod("getBlockData").invoke(nmsBlock);
 | 
					 | 
				
			||||||
				int dataValue = (int) nmsBlockClass.getMethod("toLegacyData", nmsIBlockData).invoke(nmsBlock,
 | 
					 | 
				
			||||||
						nmsBlockData);
 | 
					 | 
				
			||||||
				Object nmsItem = nmsItemClass.getConstructor(nmsBlockClass, int.class, int.class).newInstance(nmsBlock,
 | 
					 | 
				
			||||||
						1, dataValue);
 | 
					 | 
				
			||||||
				ItemStack bukkitItem = (ItemStack) craftItemClass.getMethod("asCraftMirror", nmsItemClass).invoke(null,
 | 
					 | 
				
			||||||
						nmsItem);
 | 
					 | 
				
			||||||
				items.add(bukkitItem);
 | 
					 | 
				
			||||||
			} catch (Exception ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return Arrays.copyOf(items.toArray(), items.size(), ItemStack[].class);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings({ "unused", "unchecked" })
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Entity ent = entity.getSingle(e);
 | 
					 | 
				
			||||||
		if (ent == null || !(ent instanceof Enderman))
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		Object nmsEnt = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			nmsEnt = craftEntClass.cast(ent).getClass().getMethod("getHandle").invoke(ent);
 | 
					 | 
				
			||||||
		} catch (Exception ex) {
 | 
					 | 
				
			||||||
			ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		Set<Object> enderBlocks = (Set<Object>) ReflectionUtils.getField("c", endermanClass, nmsEnt);
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			ItemStack[] deltaItems = Arrays.copyOf(delta, delta.length, ItemStack[].class);
 | 
					 | 
				
			||||||
			if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
				enderBlocks.clear();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			for (ItemStack itemStack : deltaItems) {
 | 
					 | 
				
			||||||
				if (itemStack.getType() == Material.AIR || itemStack == null)
 | 
					 | 
				
			||||||
					continue;
 | 
					 | 
				
			||||||
				Object nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
				Object nmsItem = null;
 | 
					 | 
				
			||||||
				try {
 | 
					 | 
				
			||||||
					nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack);
 | 
					 | 
				
			||||||
				} catch (Exception ex) {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD || mode == ChangeMode.SET)
 | 
					 | 
				
			||||||
					enderBlocks.add(nmsItem);
 | 
					 | 
				
			||||||
				else //ChangeMode.REMOVE
 | 
					 | 
				
			||||||
					enderBlocks.remove(nmsItem);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
			ItemStack grass = new ItemStack(Material.GRASS);
 | 
					 | 
				
			||||||
			ItemStack dirt = new ItemStack(Material.DIRT);
 | 
					 | 
				
			||||||
			ItemStack sand = new ItemStack(Material.SAND);
 | 
					 | 
				
			||||||
			ItemStack gravel = new ItemStack(Material.GRAVEL);
 | 
					 | 
				
			||||||
			ItemStack dandelion = new ItemStack(Material.YELLOW_FLOWER);
 | 
					 | 
				
			||||||
			ItemStack poppy = new ItemStack(Material.RED_ROSE);
 | 
					 | 
				
			||||||
			ItemStack brownShroom = new ItemStack(Material.BROWN_MUSHROOM);
 | 
					 | 
				
			||||||
			ItemStack redShroom = new ItemStack(Material.RED_MUSHROOM);
 | 
					 | 
				
			||||||
			ItemStack tnt = new ItemStack(Material.TNT);
 | 
					 | 
				
			||||||
			ItemStack cactus = new ItemStack(Material.CACTUS);
 | 
					 | 
				
			||||||
			ItemStack clay = new ItemStack(Material.CLAY);
 | 
					 | 
				
			||||||
			ItemStack pumpkin = new ItemStack(Material.PUMPKIN);
 | 
					 | 
				
			||||||
			ItemStack melon = new ItemStack(Material.MELON_BLOCK);
 | 
					 | 
				
			||||||
			ItemStack mycellium = new ItemStack(Material.MYCEL);
 | 
					 | 
				
			||||||
			ItemStack[] defaultItems = new ItemStack[] { grass, dirt, gravel, dandelion, poppy, brownShroom, redShroom, tnt, cactus, clay, pumpkin, melon, mycellium };
 | 
					 | 
				
			||||||
			enderBlocks.clear();
 | 
					 | 
				
			||||||
			for (ItemStack itemStack : defaultItems) {
 | 
					 | 
				
			||||||
				Object nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
				Object nmsItem = null;
 | 
					 | 
				
			||||||
				try {
 | 
					 | 
				
			||||||
					nmsItem = nmsItemStack.getClass().getMethod("getItem").invoke(nmsItemStack);
 | 
					 | 
				
			||||||
				} catch (Exception ex) {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				enderBlocks.add(nmsItem);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.RESET|| mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(ItemStack[].class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,93 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprFileNBT extends SimpleExpression<Object> {
 | 
					 | 
				
			||||||
	private Expression<String> input;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Object> getReturnType() {
 | 
					 | 
				
			||||||
		return nbtClass;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		input = (Expression<String>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the NBT from file " + input.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Object[] get(Event e) {
 | 
					 | 
				
			||||||
		String fileName = input.getSingle(e);
 | 
					 | 
				
			||||||
		fileName = !fileName.endsWith(".dat") ? fileName + ".dat" : fileName;
 | 
					 | 
				
			||||||
		File file = new File(fileName);
 | 
					 | 
				
			||||||
		if (!file.exists())
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		return new Object[] { SkStuff.getNMSMethods().getFileNBT(file) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		String fileName = input.getSingle(e);
 | 
					 | 
				
			||||||
		fileName = !fileName.endsWith(".dat") ? fileName + ".dat" : fileName;
 | 
					 | 
				
			||||||
		File file = new File(fileName);
 | 
					 | 
				
			||||||
		if (!file.exists())
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		Object fileNBT = SkStuff.getNMSMethods().getFileNBT(file);
 | 
					 | 
				
			||||||
		if (fileNBT == null) {
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				fileNBT = nbtClass.newInstance();
 | 
					 | 
				
			||||||
			} catch (InstantiationException | IllegalAccessException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
			Object parsedNBT = null;
 | 
					 | 
				
			||||||
			parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().addToCompound(fileNBT, parsedNBT);
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setFileNBT(file, fileNBT);
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
			for (Object s : delta) {
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().removeFromCompound(fileNBT, (String) s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setFileNBT(file, fileNBT);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(String.class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,110 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.libs.jline.internal.Nullable;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.flags.BooleanFlag;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.flags.Flag;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.flags.StateFlag;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.flags.StateFlag.State;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.flags.StringFlag;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.entity.EntityData;
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprFlagOfWGRegion extends SimpleExpression<String> {
 | 
					 | 
				
			||||||
	private Expression<Flag<?>> flag;
 | 
					 | 
				
			||||||
	private Expression<ProtectedRegion> region;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(final Expression<?>[] expr, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) {
 | 
					 | 
				
			||||||
		flag = (Expression<Flag<?>>) expr[0];
 | 
					 | 
				
			||||||
		region = (Expression<ProtectedRegion>) expr[1];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected String[] get(final Event e) {
 | 
					 | 
				
			||||||
		ProtectedRegion region = this.region.getSingle(e);
 | 
					 | 
				
			||||||
		Flag<?> flag = this.flag.getSingle(e);
 | 
					 | 
				
			||||||
		return new String[] { region.getFlag(flag).toString() };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends String> getReturnType() {
 | 
					 | 
				
			||||||
		return String.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(final @Nullable Event e, final boolean debug) {
 | 
					 | 
				
			||||||
		return "worldguard flag " + flag.toString(e, debug) + " of " + region.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		ProtectedRegion region = this.region.getSingle(e);
 | 
					 | 
				
			||||||
		Flag<?> flag = this.flag.getSingle(e);
 | 
					 | 
				
			||||||
		if (region == null)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			if (flag instanceof StateFlag && delta[0] instanceof Boolean) {
 | 
					 | 
				
			||||||
				boolean allow = (boolean) delta[0];
 | 
					 | 
				
			||||||
				State newState = State.DENY;
 | 
					 | 
				
			||||||
				if (allow) {
 | 
					 | 
				
			||||||
					newState = State.ALLOW;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				region.setFlag((StateFlag) flag, newState);
 | 
					 | 
				
			||||||
			} else if (flag instanceof StringFlag && delta[0] instanceof String) {
 | 
					 | 
				
			||||||
				String newValue = (String) delta[0];
 | 
					 | 
				
			||||||
				region.setFlag((StringFlag) flag, newValue);
 | 
					 | 
				
			||||||
			} else if (flag instanceof BooleanFlag && delta[0] instanceof Boolean) {
 | 
					 | 
				
			||||||
				boolean newValue = (boolean) delta[0];
 | 
					 | 
				
			||||||
				region.setFlag((BooleanFlag) flag, newValue);
 | 
					 | 
				
			||||||
			/*
 | 
					 | 
				
			||||||
			} else if (flag instanceof SetFlag) {
 | 
					 | 
				
			||||||
				if (delta instanceof EntityData[]) {
 | 
					 | 
				
			||||||
					if (((SetFlag) flag).getType() instanceof EntityTypeFlag) {
 | 
					 | 
				
			||||||
						Set<EntityType> newSet = new HashSet<EntityType>();
 | 
					 | 
				
			||||||
						for (Object entData : delta) {
 | 
					 | 
				
			||||||
							EntityType toAdd = null;
 | 
					 | 
				
			||||||
							for (EntityType entType : EntityType.values()) { //A weird workaround I've thought to get the entity type from a Skript entity data
 | 
					 | 
				
			||||||
								if (((EntityData) entData).getType() == entType.getEntityClass()) {
 | 
					 | 
				
			||||||
									toAdd = entType;
 | 
					 | 
				
			||||||
								}
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
							if (toAdd != null) {
 | 
					 | 
				
			||||||
								newSet.add(toAdd);
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
						region.setFlag((SetFlag<EntityType>) flag, newSet);
 | 
					 | 
				
			||||||
			*/
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				Skript.error("Sorry, this flag type isn't supported yet! Flag type: " + flag.getClass().getSimpleName());
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			region.setFlag(flag, null);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(final ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET || mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(String.class, Boolean.class, EntityData[].class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,67 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.libs.jline.internal.Nullable;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.flags.Flag;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@SuppressWarnings("rawtypes")
 | 
					 | 
				
			||||||
public class ExprFlagsOfWGRegion extends SimpleExpression<Flag> {
 | 
					 | 
				
			||||||
	private Expression<ProtectedRegion> region;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(final Expression<?>[] expr, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) {
 | 
					 | 
				
			||||||
		region = (Expression<ProtectedRegion>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	protected Flag[] get(final Event e) {
 | 
					 | 
				
			||||||
		ProtectedRegion region = this.region.getSingle(e);
 | 
					 | 
				
			||||||
		if (region != null) {
 | 
					 | 
				
			||||||
			return region.getFlags().keySet().toArray(new Flag[region.getFlags().size()]);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Flag> getReturnType() {
 | 
					 | 
				
			||||||
		return Flag.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(final @Nullable Event e, final boolean debug) {
 | 
					 | 
				
			||||||
		return "all worldguard flags of " + region.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		ProtectedRegion region = this.region.getSingle(e);
 | 
					 | 
				
			||||||
		if (region == null)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			region.getFlags().clear();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(final ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			return new Class[0];
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,56 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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 ExprItemNBT extends SimpleExpression<ItemStack> {
 | 
					 | 
				
			||||||
	private Expression<ItemStack> itemStack;
 | 
					 | 
				
			||||||
	private Expression<String> string;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends ItemStack> getReturnType() {
 | 
					 | 
				
			||||||
		return ItemStack.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		itemStack = (Expression<ItemStack>) expr[0];
 | 
					 | 
				
			||||||
		string = (Expression<String>) expr[1];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return itemStack.toString(e, debug) + " with custom NBT " + string.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public ItemStack[] get(Event e) {
 | 
					 | 
				
			||||||
		ItemStack item = itemStack.getSingle(e);
 | 
					 | 
				
			||||||
		String newTags = string.getSingle(e);
 | 
					 | 
				
			||||||
		if (item.getType() == Material.AIR || item == null) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		Object parsedNBT = null;
 | 
					 | 
				
			||||||
		parsedNBT = SkStuff.getNMSMethods().parseRawNBT(newTags);
 | 
					 | 
				
			||||||
		ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT(item, parsedNBT);
 | 
					 | 
				
			||||||
		return new ItemStack[] { newItem };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,49 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprLastLocation extends SimpleExpression<Location> {
 | 
					 | 
				
			||||||
	private Expression<Entity> entity;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Location> getReturnType() {
 | 
					 | 
				
			||||||
		return Location.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 | 
					 | 
				
			||||||
		entity = (Expression<Entity>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "last location of " + entity.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Location[] get(Event e) {
 | 
					 | 
				
			||||||
		Entity ent = entity.getSingle(e);
 | 
					 | 
				
			||||||
		if (ent == null) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
			return new Location[] { SkStuff.getNMSMethods().getLastLocation(ent) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,52 +0,0 @@
 | 
				
			|||||||
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);
 | 
					 | 
				
			||||||
		if (type == null) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ItemStack item = new ItemStack(type.getTypes().get(0).getId());
 | 
					 | 
				
			||||||
		return new String[] { SkStuff.getNMSMethods().getMCId(item) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,49 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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 ExprMCIdToItem extends SimpleExpression<ItemStack> {
 | 
					 | 
				
			||||||
	private Expression<String> mcId;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends ItemStack> getReturnType() {
 | 
					 | 
				
			||||||
		return ItemStack.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 | 
					 | 
				
			||||||
		mcId = (Expression<String>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "item from minecraft id " + mcId.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected ItemStack[] get(Event e) {
 | 
					 | 
				
			||||||
		String id = mcId.getSingle(e);
 | 
					 | 
				
			||||||
		if (id == null) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return new ItemStack[] { SkStuff.getNMSMethods().getItemFromMcId(id) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,74 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprNBTListContents extends SimpleExpression<Object> {
 | 
					 | 
				
			||||||
	private Expression<Object> nbtList;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Object> getReturnType() {
 | 
					 | 
				
			||||||
		return Object.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		nbtList = (Expression<Object>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "contents from NBT list " + nbtList.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Object[] get(Event e) {
 | 
					 | 
				
			||||||
		Object list = nbtList.getSingle(e);
 | 
					 | 
				
			||||||
		return SkStuff.getNMSMethods().getContents(list);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Object list = nbtList.getSingle(e);
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
			if (nbtBaseClass.isAssignableFrom(delta[0].getClass()))
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().addToList(list, delta[0]);
 | 
					 | 
				
			||||||
			else if (delta[0] instanceof Number)
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().addToList(list, SkStuff.getNMSMethods().convertToNBT((Number) delta[0]));
 | 
					 | 
				
			||||||
			else if (delta[0] instanceof String)
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().addToList(list, SkStuff.getNMSMethods().convertToNBT((String) delta[0]));
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.REMOVE || mode == ChangeMode.REMOVE_ALL) {
 | 
					 | 
				
			||||||
			// TODO Code to remove a single or all objects of some value in an NBT array.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.REMOVE_ALL) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(Object.class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,83 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprNBTListIndex extends SimpleExpression<Object> {
 | 
					 | 
				
			||||||
	private Expression<Object> nbtList;
 | 
					 | 
				
			||||||
	private Expression<Number> index;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Object> getReturnType() {
 | 
					 | 
				
			||||||
		return Object.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		if (matchedPattern == 0) {
 | 
					 | 
				
			||||||
			nbtList = (Expression<Object>) expr[0];
 | 
					 | 
				
			||||||
			index = (Expression<Number>) expr[1];
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			index = (Expression<Number>) expr[0];
 | 
					 | 
				
			||||||
			nbtList = (Expression<Object>) expr[1];
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "index " + index.toString(e, debug) + " from nbt list " + nbtList.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Object[] get(Event e) {
 | 
					 | 
				
			||||||
		int i = index.getSingle(e).intValue();
 | 
					 | 
				
			||||||
		i--;
 | 
					 | 
				
			||||||
		Object list = nbtList.getSingle(e);
 | 
					 | 
				
			||||||
		return new Object[] { SkStuff.getNMSMethods().getIndex(list, i) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		int i = index.getSingle(e).intValue();
 | 
					 | 
				
			||||||
		i--;
 | 
					 | 
				
			||||||
		Object list = nbtList.getSingle(e);
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			if (!(delta[0] instanceof Number || delta[0] instanceof String || nbtBaseClass.isAssignableFrom(delta[0].getClass())))
 | 
					 | 
				
			||||||
				//All NBTTags extends NBTBase, so it will check if delta[0] is instance of NBTTagList or NBTTagCompound, because these are the only NBTTagX classes registered in this addon.
 | 
					 | 
				
			||||||
				return; //NBT can only store numbers, strings, lists or compounds.
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setIndex(list, i, delta[0]);
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().removeFromList(list, i);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET || mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(Object.class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,137 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.Arrays;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
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.skript.log.ErrorQuality;
 | 
					 | 
				
			||||||
import ch.njol.skript.util.Slot;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprNBTOf extends SimpleExpression<Object> {
 | 
					 | 
				
			||||||
	private Expression<Object> target;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Object> getReturnType() {
 | 
					 | 
				
			||||||
		return nbtClass;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		target = (Expression<Object>) expr[0];
 | 
					 | 
				
			||||||
		Class<?> type = target.getReturnType();
 | 
					 | 
				
			||||||
		if (type != Entity.class || type != Block.class || type != ItemStack.class || type != Slot.class) {
 | 
					 | 
				
			||||||
			Skript.error(target.toString() + " is neither an entity, a block nor an itemstack.", ErrorQuality.SEMANTIC_ERROR);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the NBT of " + target.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Object[] get(Event e) {
 | 
					 | 
				
			||||||
		Object tar = target.getSingle(e);
 | 
					 | 
				
			||||||
		if (tar instanceof Entity) {
 | 
					 | 
				
			||||||
			return new Object[] { SkStuff.getNMSMethods().getEntityNBT((Entity) tar) };
 | 
					 | 
				
			||||||
		} else if (tar instanceof Block) {
 | 
					 | 
				
			||||||
			return new Object[] { SkStuff.getNMSMethods().getTileNBT((Block) tar) };
 | 
					 | 
				
			||||||
		} else if (tar instanceof ItemStack) {
 | 
					 | 
				
			||||||
			return new Object[] { SkStuff.getNMSMethods().getItemNBT((ItemStack) tar) };
 | 
					 | 
				
			||||||
		} else if (tar instanceof Slot) {
 | 
					 | 
				
			||||||
			return new Object[] { SkStuff.getNMSMethods().getItemNBT(((Slot) tar).getItem()) };
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Object tar = target.getSingle(e);
 | 
					 | 
				
			||||||
		Object parsedNBT = null;
 | 
					 | 
				
			||||||
		if (delta != null) {
 | 
					 | 
				
			||||||
			parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (tar instanceof Entity) {
 | 
					 | 
				
			||||||
			Object entNBT = SkStuff.getNMSMethods().getEntityNBT((Entity) tar);
 | 
					 | 
				
			||||||
			if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().removeFromCompound(parsedNBT, "UUIDMost", "UUIDLeast", "WorldUUDMost", "WorldUUIDLeast", "Bukkit.updateLevel");
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().addToCompound(entNBT, parsedNBT);
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().setEntityNBT((Entity) tar, entNBT);
 | 
					 | 
				
			||||||
			} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
				for (Object s : delta) {
 | 
					 | 
				
			||||||
					if (s != "UUIDMost" || s != "UUIDLeast" || s != "WorldUUIDMost" || s != "WorldUUIDLeast" || s != "Bukkit.updateLevel") { // Prevent crucial data from being modified
 | 
					 | 
				
			||||||
						SkStuff.getNMSMethods().removeFromCompound(entNBT, (String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().setEntityNBT((Entity) tar, entNBT);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if (tar instanceof Block) {
 | 
					 | 
				
			||||||
			Object blockNBT = SkStuff.getNMSMethods().getTileNBT((Block) tar);
 | 
					 | 
				
			||||||
			if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().removeFromCompound(parsedNBT, "x", "y", "z", "id");
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().addToCompound(blockNBT, parsedNBT);
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().setTileNBT((Block) tar, blockNBT);
 | 
					 | 
				
			||||||
			} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
				for (Object s : delta) {
 | 
					 | 
				
			||||||
					if (s != "x" || s != "y" || s != "z" || s != "id") {
 | 
					 | 
				
			||||||
						SkStuff.getNMSMethods().removeFromCompound(blockNBT, (String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().setTileNBT((Block) tar, blockNBT);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if (tar instanceof ItemStack) {
 | 
					 | 
				
			||||||
			if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
				Skript.warning("Failed to change the NBT of an item: Itemstack didn't have any slot attached to it.");
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if (tar instanceof Slot) {
 | 
					 | 
				
			||||||
			ItemStack slotItem = ((Slot) tar).getItem();
 | 
					 | 
				
			||||||
			Object itemNBT = SkStuff.getNMSMethods().getItemNBT(slotItem);
 | 
					 | 
				
			||||||
			if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().addToCompound(itemNBT, parsedNBT);
 | 
					 | 
				
			||||||
				ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT(slotItem, itemNBT);
 | 
					 | 
				
			||||||
				((Slot) tar).setItem(newItem);
 | 
					 | 
				
			||||||
			} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
				String[] toRemove = Arrays.copyOf(delta, delta.length, String[].class);
 | 
					 | 
				
			||||||
				SkStuff.getNMSMethods().removeFromCompound(itemNBT, toRemove);
 | 
					 | 
				
			||||||
				ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT(slotItem, itemNBT);
 | 
					 | 
				
			||||||
				((Slot) tar).setItem(newItem);
 | 
					 | 
				
			||||||
			} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
				ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT(slotItem, null);
 | 
					 | 
				
			||||||
				((Slot) tar).setItem(newItem);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(final ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(String[].class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,54 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.World;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.EditSession;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprNewEditSession extends SimpleExpression<EditSession> {
 | 
					 | 
				
			||||||
	private Expression<World> world;
 | 
					 | 
				
			||||||
	private Expression<Integer> blockLimit;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends EditSession> getReturnType() {
 | 
					 | 
				
			||||||
		return EditSession.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		world = (Expression<World>) expr[0];
 | 
					 | 
				
			||||||
		blockLimit = (Expression<Integer>) expr[1];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "new edit session in world " + world.toString(e, debug) + " with maximum block change limit of " + blockLimit.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected EditSession[] get(Event e) {
 | 
					 | 
				
			||||||
		WorldEditPlugin we = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
		World w = world.getSingle(e);
 | 
					 | 
				
			||||||
		Integer limit = blockLimit.getSingle(e);
 | 
					 | 
				
			||||||
		com.sk89q.worldedit.world.World weWorld = BukkitUtil.getLocalWorld(w);
 | 
					 | 
				
			||||||
		return new EditSession[] { we.getWorldEdit().getEditSessionFactory().getEditSession(weWorld, limit) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,62 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.ArrayList;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.Vector;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprRegionsWithinLocation extends SimpleExpression<ProtectedRegion> {
 | 
					 | 
				
			||||||
	private Expression<Location> location;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends ProtectedRegion> getReturnType() {
 | 
					 | 
				
			||||||
		return ProtectedRegion.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 | 
					 | 
				
			||||||
		location = (Expression<Location>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "all the regions containing " + location.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected ProtectedRegion[] get(Event e) {
 | 
					 | 
				
			||||||
		WorldGuardPlugin wg = (WorldGuardPlugin) Bukkit.getPluginManager().getPlugin("WorldGuard");
 | 
					 | 
				
			||||||
		Location loc = location.getSingle(e);
 | 
					 | 
				
			||||||
		Vector vec = new Vector(loc.getX(), loc.getY(), loc.getZ());
 | 
					 | 
				
			||||||
		Map<String, ProtectedRegion> regions = wg.getRegionManager(loc.getWorld()).getRegions();
 | 
					 | 
				
			||||||
		List<ProtectedRegion> regionsInside = new ArrayList<ProtectedRegion>();
 | 
					 | 
				
			||||||
		for (ProtectedRegion region : regions.values()) {
 | 
					 | 
				
			||||||
			if (region.contains(vec)) {
 | 
					 | 
				
			||||||
				regionsInside.add(region);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return regionsInside.toArray(new ProtectedRegion[0]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,85 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.Vector;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.schematic.MCEditSchematicFormat;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.DataException;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprSchematicArea extends SimpleExpression<Integer> {
 | 
					 | 
				
			||||||
	private Expression<String> schematic;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private int parseMark;
 | 
					 | 
				
			||||||
	private String toStringMark;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Integer> getReturnType() {
 | 
					 | 
				
			||||||
		return Integer.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		schematic = (Expression<String>) expr[0];
 | 
					 | 
				
			||||||
		parseMark = result.mark;
 | 
					 | 
				
			||||||
		if (parseMark == 0) {
 | 
					 | 
				
			||||||
			toStringMark = "volume";
 | 
					 | 
				
			||||||
		} else if (parseMark == 1) {
 | 
					 | 
				
			||||||
			toStringMark = "width (x-size)";
 | 
					 | 
				
			||||||
		} else if (parseMark == 2) {
 | 
					 | 
				
			||||||
			toStringMark = "height (y-size)";
 | 
					 | 
				
			||||||
		} else if (parseMark == 3) {
 | 
					 | 
				
			||||||
			toStringMark = "length (z-size)";
 | 
					 | 
				
			||||||
		} else if (parseMark == 4) {
 | 
					 | 
				
			||||||
			toStringMark = "area";
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the " + toStringMark + " of the schematic from " + schematic.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("deprecation")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Integer[] get(Event e) {
 | 
					 | 
				
			||||||
		String schem = schematic.getSingle(e);
 | 
					 | 
				
			||||||
		File schemFile = new File((schem.endsWith(".schematic") ? schem : (schem + ".schematic")));
 | 
					 | 
				
			||||||
		Vector size = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			size = MCEditSchematicFormat.getFormat(schemFile).load(schemFile).getSize();
 | 
					 | 
				
			||||||
		} catch (DataException | IOException ex) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		Number result = null;
 | 
					 | 
				
			||||||
		if (parseMark == 0) {
 | 
					 | 
				
			||||||
			result = (size.getX() * size.getY() * size.getZ());
 | 
					 | 
				
			||||||
		} else if (parseMark == 1) {
 | 
					 | 
				
			||||||
			result = size.getX();
 | 
					 | 
				
			||||||
		} else if (parseMark == 2) {
 | 
					 | 
				
			||||||
			result = size.getY();
 | 
					 | 
				
			||||||
		} else if (parseMark == 3) {
 | 
					 | 
				
			||||||
			result = size.getZ();
 | 
					 | 
				
			||||||
		} else if (parseMark == 4) {
 | 
					 | 
				
			||||||
			result = (size.getX() * size.getZ());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return new Integer[] { result.intValue() };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,77 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.selections.Selection;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprSelectionArea extends SimpleExpression<Integer> {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private Integer parseMark;
 | 
					 | 
				
			||||||
	private String toStringMark;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Integer> getReturnType() {
 | 
					 | 
				
			||||||
		return Integer.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		parseMark = result.mark;
 | 
					 | 
				
			||||||
		if (parseMark == 0) {
 | 
					 | 
				
			||||||
			toStringMark = "volume";
 | 
					 | 
				
			||||||
		} else if (parseMark == 1) {
 | 
					 | 
				
			||||||
			toStringMark = "width (x-size)";
 | 
					 | 
				
			||||||
		} else if (parseMark == 2) {
 | 
					 | 
				
			||||||
			toStringMark = "height (y-size)";
 | 
					 | 
				
			||||||
		} else if (parseMark == 3) {
 | 
					 | 
				
			||||||
			toStringMark = "length (z-size)";
 | 
					 | 
				
			||||||
		} else if (parseMark == 4) {
 | 
					 | 
				
			||||||
			toStringMark = "area";
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the " + toStringMark + " of the WorldEdit selection of " + player.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Integer[] get(Event e) {
 | 
					 | 
				
			||||||
		WorldEditPlugin we = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
		Selection sel = we.getSelection(player.getSingle(e));
 | 
					 | 
				
			||||||
		if (sel == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		Integer result = null;
 | 
					 | 
				
			||||||
		if (parseMark == 0) {
 | 
					 | 
				
			||||||
			result = sel.getArea();
 | 
					 | 
				
			||||||
		} else if (parseMark == 1) {
 | 
					 | 
				
			||||||
			result = sel.getWidth();
 | 
					 | 
				
			||||||
		} else if (parseMark == 2) {
 | 
					 | 
				
			||||||
			result = sel.getHeight();
 | 
					 | 
				
			||||||
		} else if (parseMark == 3) {
 | 
					 | 
				
			||||||
			result = sel.getLength();
 | 
					 | 
				
			||||||
		} else if (parseMark == 4) {
 | 
					 | 
				
			||||||
			result = (sel.getWidth() * sel.getLength());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return new Integer[] { result };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,90 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.IncompleteRegionException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.Vector;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.Region;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprSelectionOfPlayer extends SimpleExpression<Location> {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private WorldEditPlugin we =  (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Location> getReturnType() {
 | 
					 | 
				
			||||||
		return Location.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the WorldEdit selection of " + player.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Location[] get(Event e) {
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		Region region = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			region = we.getSession(p).getSelection((World) BukkitUtil.getLocalWorld(we.getSelection(p).getWorld()));
 | 
					 | 
				
			||||||
		} catch (IncompleteRegionException ex) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (!(region instanceof CuboidRegion)) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		CuboidRegion cuboid = (CuboidRegion) region;
 | 
					 | 
				
			||||||
		Vector pos1Vec = cuboid.getPos1();
 | 
					 | 
				
			||||||
		Vector pos2Vec = cuboid.getPos2();
 | 
					 | 
				
			||||||
		Location pos1 = new Location(we.getSelection(p).getWorld(), pos1Vec.getX(), pos1Vec.getY(), pos1Vec.getZ());
 | 
					 | 
				
			||||||
		Location pos2 = new Location(we.getSelection(p).getWorld(), pos2Vec.getX(), pos2Vec.getY(), pos2Vec.getZ());
 | 
					 | 
				
			||||||
		return new Location[] { pos1, pos2 };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
			if (we.getSelection(p) == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			we.getSession(p).getRegionSelector((World) BukkitUtil.getLocalWorld(we.getSelection(p).getWorld())).clear();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(Location.class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,110 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.IncompleteRegionException;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.Vector;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.BukkitUtil;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.CuboidRegion;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.Region;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.world.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprSelectionPos extends SimpleExpression<Location> {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private boolean usePos2 = false;
 | 
					 | 
				
			||||||
	private WorldEditPlugin we = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Location> getReturnType() {
 | 
					 | 
				
			||||||
		return Location.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		if (result.mark == 1) {
 | 
					 | 
				
			||||||
			usePos2 = true;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the WorldEdit point " + (usePos2 ? "2" : "1") + " selection of " + player.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Location[] get(Event e) {
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		Region region = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			region = we.getSession(p).getSelection((World) BukkitUtil.getLocalWorld(we.getSelection(p).getWorld()));
 | 
					 | 
				
			||||||
		} catch (IncompleteRegionException ex) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (!(region instanceof CuboidRegion))
 | 
					 | 
				
			||||||
			return null; //Who uses polygonal and other selection types anyways?
 | 
					 | 
				
			||||||
		CuboidRegion cuboid = (CuboidRegion) region;
 | 
					 | 
				
			||||||
		Vector pos = null;
 | 
					 | 
				
			||||||
		if (usePos2 == true) {
 | 
					 | 
				
			||||||
			pos = cuboid.getPos2();
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			pos = cuboid.getPos1();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return new Location[] { BukkitUtil.toLocation(we.getSelection(p).getWorld(), pos) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		Location newLoc = (Location) delta[0];
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			Region region = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				region = we.getSession(p).getSelection((World) BukkitUtil.getLocalWorld(we.getSelection(p).getWorld()));
 | 
					 | 
				
			||||||
			} catch (IncompleteRegionException | NullPointerException ex) {
 | 
					 | 
				
			||||||
				CuboidRegionSelector cuboidregion = new CuboidRegionSelector(BukkitUtil.getLocalWorld((org.bukkit.World) newLoc.getWorld()), BukkitUtil.toVector(newLoc), BukkitUtil.toVector(newLoc));
 | 
					 | 
				
			||||||
				we.getSession(p).setRegionSelector((World) BukkitUtil.getLocalWorld(p.getWorld()), cuboidregion);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if (!(region instanceof CuboidRegion))
 | 
					 | 
				
			||||||
				return; //Who uses polygonal and other selection types anyways?
 | 
					 | 
				
			||||||
			CuboidRegion cuboid = (CuboidRegion) region;
 | 
					 | 
				
			||||||
			if (usePos2 == true) {
 | 
					 | 
				
			||||||
				cuboid.setPos2(BukkitUtil.toVector(newLoc));
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				cuboid.setPos1(BukkitUtil.toVector(newLoc));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(Location.class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,80 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprStepLength extends SimpleExpression<Number> {
 | 
					 | 
				
			||||||
	private Expression<Entity> entity;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Number> getReturnType() {
 | 
					 | 
				
			||||||
		return Number.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 | 
					 | 
				
			||||||
		entity = (Expression<Entity>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "step length of " + entity.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Number[] get(Event e) {
 | 
					 | 
				
			||||||
		Entity ent = entity.getSingle(e);
 | 
					 | 
				
			||||||
		if (ent == null) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return new Number[] { SkStuff.getNMSMethods().getEntityStepLength(ent) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Entity ent = entity.getSingle(e);
 | 
					 | 
				
			||||||
		if (ent == null) {
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
			float toAdd = ((Number) delta[0]).floatValue();
 | 
					 | 
				
			||||||
			float currentLength = SkStuff.getNMSMethods().getEntityStepLength(ent);
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setEntityStepLength(ent, (currentLength + toAdd));
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
			float toRemove = ((Number) delta[0]).floatValue();
 | 
					 | 
				
			||||||
			float currentLength = SkStuff.getNMSMethods().getEntityStepLength(ent);
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setEntityStepLength(ent, (currentLength - toRemove));
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			float toSet = ((Number) delta[0]).floatValue();
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setEntityStepLength(ent, toSet);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(Number.class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,82 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprSuperPickaxe extends SimpleExpression<Boolean> {
 | 
					 | 
				
			||||||
	private Expression<Player> players;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return players.isSingle();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Boolean> getReturnType() {
 | 
					 | 
				
			||||||
		return Boolean.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
 | 
					 | 
				
			||||||
		players = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "world edit super pickaxe state of " + players.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Boolean[] get(Event e) {
 | 
					 | 
				
			||||||
		WorldEditPlugin we = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
		Player[] ps = players.getAll(e);
 | 
					 | 
				
			||||||
		Boolean[] states = new Boolean[ps.length];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (Player p : ps) {
 | 
					 | 
				
			||||||
			states[i] = we.getSession(p).hasSuperPickAxe();
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return states;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			WorldEditPlugin we = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
 | 
					 | 
				
			||||||
			Player[] ps = players.getAll(e);
 | 
					 | 
				
			||||||
			boolean enablePick = (boolean) delta[0];
 | 
					 | 
				
			||||||
			for (Player p : ps) {
 | 
					 | 
				
			||||||
				if (enablePick) {
 | 
					 | 
				
			||||||
					we.getSession(p).enableSuperPickAxe();
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					we.getSession(p).disableSuperPickAxe();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,82 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer.ChangeMode;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.SkStuff;
 | 
					 | 
				
			||||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprTagOf extends SimpleExpression<Object> {
 | 
					 | 
				
			||||||
	private Expression<String> string;
 | 
					 | 
				
			||||||
	private Expression<Object> compound;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Object> getReturnType() {
 | 
					 | 
				
			||||||
		return Object.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int arg1, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		string = (Expression<String>) expr[0];
 | 
					 | 
				
			||||||
		compound = (Expression<Object>) expr[1];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "the tag " + string.toString(e, debug) + " of " + compound.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Object[] get(Event e) {
 | 
					 | 
				
			||||||
		Object NBT = compound.getSingle(e);
 | 
					 | 
				
			||||||
		if (NBT == null || NBT.toString().equals("{}")) { // "{}" is an empty compound.
 | 
					 | 
				
			||||||
			return null; //The NBT can be empty/inexistant for items
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		String stringTag = string.getSingle(e);
 | 
					 | 
				
			||||||
		Object tag = SkStuff.getNMSMethods().getNBTTag(NBT, stringTag);
 | 
					 | 
				
			||||||
		if (tag == null) {
 | 
					 | 
				
			||||||
			return null; //The tag doesn't exist? Return <none>.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		byte id = SkStuff.getNMSMethods().getTypeId(tag);
 | 
					 | 
				
			||||||
		return new Object[] { SkStuff.getNMSMethods().getNBTTagValue(NBT, stringTag, id) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		Object NBT = compound.getSingle(e);
 | 
					 | 
				
			||||||
		if (NBT == null) {
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		String stringTag = string.getSingle(e);
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET) {
 | 
					 | 
				
			||||||
			Object newValue = delta[0];
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().setNBTTag(NBT, stringTag, newValue);
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
 | 
					 | 
				
			||||||
			SkStuff.getNMSMethods().removeNBTTag(NBT, stringTag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(Number.class, String.class, nbtBaseClass);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,48 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
import org.bukkit.plugin.Plugin;
 | 
					 | 
				
			||||||
import org.kitteh.vanish.VanishPlugin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.Expression;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.util.SimpleExpression;
 | 
					 | 
				
			||||||
import ch.njol.util.Kleenean;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprVanishState extends SimpleExpression<Boolean> {
 | 
					 | 
				
			||||||
	private Expression<Player> player;
 | 
					 | 
				
			||||||
	private Plugin vanishPlugin = Bukkit.getPluginManager().getPlugin("VanishNoPacket");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends Boolean> getReturnType() {
 | 
					 | 
				
			||||||
		return Boolean.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult arg3) {
 | 
					 | 
				
			||||||
		player = (Expression<Player>) expr[0];
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		return "vanish state of " + player.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected Boolean[] get(Event e) {
 | 
					 | 
				
			||||||
		Player p = player.getSingle(e);
 | 
					 | 
				
			||||||
		return new Boolean[] { ((VanishPlugin) vanishPlugin).getManager().isVanished(p) };
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,111 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.expressions;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.Arrays;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
import java.util.UUID;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.OfflinePlayer;
 | 
					 | 
				
			||||||
import org.bukkit.event.Event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.domains.DefaultDomain;
 | 
					 | 
				
			||||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExprWGMemberOwner extends SimpleExpression<OfflinePlayer> {
 | 
					 | 
				
			||||||
	private Expression<ProtectedRegion> region;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private int mark;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean isSingle() {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Class<? extends OfflinePlayer> getReturnType() {
 | 
					 | 
				
			||||||
		return OfflinePlayer.class;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean isDelayed, ParseResult result) {
 | 
					 | 
				
			||||||
		region = (Expression<ProtectedRegion>) expr[0];
 | 
					 | 
				
			||||||
		mark = result.mark;
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public String toString(@Nullable Event e, boolean debug) {
 | 
					 | 
				
			||||||
		String markString = mark == 0 ? "members" : "owners";
 | 
					 | 
				
			||||||
		return "the " + markString + " of the worldguard region " + region.toString(e, debug);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	protected OfflinePlayer[] get(Event e) {
 | 
					 | 
				
			||||||
		ProtectedRegion reg = region.getSingle(e);
 | 
					 | 
				
			||||||
		Set<UUID> uuids;
 | 
					 | 
				
			||||||
		if (mark == 0) {
 | 
					 | 
				
			||||||
			uuids = reg.getMembers().getUniqueIds();
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			uuids = reg.getOwners().getUniqueIds();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (uuids.isEmpty()) {
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		OfflinePlayer[] offPlayers = new OfflinePlayer[uuids.size()];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (UUID uuid : uuids) {
 | 
					 | 
				
			||||||
			offPlayers[i] = Bukkit.getOfflinePlayer(uuid);
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return offPlayers;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	@Nullable
 | 
					 | 
				
			||||||
	public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
			return CollectionUtils.array(OfflinePlayer[].class);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
		ProtectedRegion reg = region.getSingle(e);
 | 
					 | 
				
			||||||
		if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
			OfflinePlayer[] toAdd = Arrays.copyOf(delta, delta.length, OfflinePlayer[].class);
 | 
					 | 
				
			||||||
			for (OfflinePlayer offPlayer : toAdd) {
 | 
					 | 
				
			||||||
				DefaultDomain domain;
 | 
					 | 
				
			||||||
				if (mark == 0) {
 | 
					 | 
				
			||||||
					domain = reg.getMembers();
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					domain = reg.getOwners();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				domain.addPlayer(offPlayer.getUniqueId());
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
			OfflinePlayer[] toRemove = Arrays.copyOf(delta, delta.length, OfflinePlayer[].class);
 | 
					 | 
				
			||||||
			for (OfflinePlayer offPlayer : toRemove) {
 | 
					 | 
				
			||||||
				DefaultDomain domain;
 | 
					 | 
				
			||||||
				if (mark == 0) {
 | 
					 | 
				
			||||||
					domain = reg.getMembers();
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					domain = reg.getOwners();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				domain.removePlayer(offPlayer.getUniqueId());
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,75 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.pathfinders;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.Entity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.EntityCreature;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.EntityLiving;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.PathfinderGoal;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class PathfinderGoalFollow_v1_8_R3 extends PathfinderGoal {
 | 
					 | 
				
			||||||
	private EntityCreature follower;
 | 
					 | 
				
			||||||
	private EntityLiving followed;
 | 
					 | 
				
			||||||
	private Class<?> followedClass;
 | 
					 | 
				
			||||||
	private float radius;
 | 
					 | 
				
			||||||
	private double speed;
 | 
					 | 
				
			||||||
	private boolean isByName;
 | 
					 | 
				
			||||||
	private String customName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public PathfinderGoalFollow_v1_8_R3(EntityCreature follower, Class<?> followedClass, float radius, double speed, boolean isByName, String customName) {
 | 
					 | 
				
			||||||
		this.follower = follower;
 | 
					 | 
				
			||||||
		this.followedClass = followedClass;
 | 
					 | 
				
			||||||
		this.radius = radius;
 | 
					 | 
				
			||||||
		this.speed = speed;
 | 
					 | 
				
			||||||
		this.isByName = isByName;
 | 
					 | 
				
			||||||
		this.customName = customName;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// a() is shouldExecute()
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean a() {
 | 
					 | 
				
			||||||
		if (followed == null) {
 | 
					 | 
				
			||||||
			List<?> list = follower.world.a((Class<? extends Entity>) followedClass, follower.getBoundingBox().grow(radius, 4.0D, radius));
 | 
					 | 
				
			||||||
			if (list.isEmpty()) {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if (isByName) {
 | 
					 | 
				
			||||||
				for (Object entity : list) {
 | 
					 | 
				
			||||||
					if (((EntityLiving) entity).getCustomName().equals(customName)) {
 | 
					 | 
				
			||||||
						followed = (EntityLiving) entity;
 | 
					 | 
				
			||||||
						return true;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				followed = (EntityLiving) list.get(0);
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// b() is shouldContinueExecuting()
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean b() {
 | 
					 | 
				
			||||||
		if (followed.dead) {
 | 
					 | 
				
			||||||
			followed = null;
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		} else if (followed.h(follower) < 9.0D || followed.h(follower) > Math.pow(radius, 2)) {  // h() = distanceSquaredFrom()
 | 
					 | 
				
			||||||
			return false; // if 3 blocks away or not in radius, stop moving.
 | 
					 | 
				
			||||||
			//Maybe I'll add a teleport feature later.
 | 
					 | 
				
			||||||
		} else if (isByName) {
 | 
					 | 
				
			||||||
			if (!followed.getCustomName().equals(customName)) {
 | 
					 | 
				
			||||||
				followed = null;
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return follower.getNavigation().m(); // m() means hasNoPath()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// c() is execute()
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void c() {
 | 
					 | 
				
			||||||
		follower.getNavigation().a(followed, speed); // a() means moveTo()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,77 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.pathfinders;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.Entity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.EntityCreature;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.EntityLiving;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.PathfinderGoal;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class PathfinderGoalFollow_v1_9_R1 extends PathfinderGoal {
 | 
					 | 
				
			||||||
	private EntityCreature follower;
 | 
					 | 
				
			||||||
	private EntityLiving followed;
 | 
					 | 
				
			||||||
	private Class<?> followedClass;
 | 
					 | 
				
			||||||
	private float radius;
 | 
					 | 
				
			||||||
	private double speed;
 | 
					 | 
				
			||||||
	private boolean isByName;
 | 
					 | 
				
			||||||
	private String customName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public PathfinderGoalFollow_v1_9_R1(EntityCreature follower, Class<?> followedClass, float radius, double speed, boolean isByName, String customName) {
 | 
					 | 
				
			||||||
		this.follower = follower;
 | 
					 | 
				
			||||||
		this.followedClass = followedClass;
 | 
					 | 
				
			||||||
		this.radius = radius;
 | 
					 | 
				
			||||||
		this.speed = speed;
 | 
					 | 
				
			||||||
		this.isByName = isByName;
 | 
					 | 
				
			||||||
		this.customName = customName;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// a() is shouldExecute()
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean a() {
 | 
					 | 
				
			||||||
		if (followed == null) {
 | 
					 | 
				
			||||||
			List<?> list = follower.world.a((Class<? extends Entity>) followedClass, follower.getBoundingBox().grow(radius, 4.0D, radius));
 | 
					 | 
				
			||||||
			if (list.isEmpty()) {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if (isByName) {
 | 
					 | 
				
			||||||
				for (Object entity : list) {
 | 
					 | 
				
			||||||
					if (((EntityLiving) entity).getCustomName().equals(customName)) {
 | 
					 | 
				
			||||||
						followed = (EntityLiving) entity;
 | 
					 | 
				
			||||||
						return true;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				followed = (EntityLiving) list.get(0);
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// b() is shouldContinueExecuting()
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean b() {
 | 
					 | 
				
			||||||
		if (followed.dead) {
 | 
					 | 
				
			||||||
			followed = null;
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		} else if (followed.h(follower) < 9.0D || followed.h(follower) > Math.pow(radius, 2)) {  // h() = distanceSquaredFrom()
 | 
					 | 
				
			||||||
			return false; // if 3 blocks away or not in radius, stop moving.
 | 
					 | 
				
			||||||
			//Maybe I'll add a teleport feature later.
 | 
					 | 
				
			||||||
		} else if (isByName) {
 | 
					 | 
				
			||||||
			if (!followed.getCustomName().equals(customName)) {
 | 
					 | 
				
			||||||
				followed = null;
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return follower.getNavigation().n(); // n() means hasNoPath()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// c() is execute()
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void c() {
 | 
					 | 
				
			||||||
		follower.getNavigation().a(followed, speed); // a() means moveTo()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,732 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_10_R1.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftLivingEntity;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import ch.njol.yggdrasil.Fields;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.BlockPosition;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.EntityInsentient;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.IBlockData;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.Item;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.MinecraftKey;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.MojangsonParseException;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.MojangsonParser;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTBase;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTCompressedStreamTools;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagByte;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagCompound;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagDouble;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagFloat;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagInt;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagList;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagLong;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagShort;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.NBTTagString;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.PathfinderGoal;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.PathfinderGoalSelector;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.TileEntity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.World;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_10_R1.EntityLiving;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_10_R1 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 @Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
			case 1:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
			case 2:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
			case 3:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
			case 4:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
			case 5:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
			case 6:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
			case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case 8:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
			case 9:
 | 
					 | 
				
			||||||
				int i;
 | 
					 | 
				
			||||||
				NBTTagList list = null;
 | 
					 | 
				
			||||||
				for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
					//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
					list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
					if (!list.isEmpty()) { //If list is not empty.
 | 
					 | 
				
			||||||
						break; //Stop loop.
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return list; //May be null
 | 
					 | 
				
			||||||
			case 10:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
			case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
			default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).a((NBTTagCompound) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			parsedNBT = MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		} catch (MojangsonParseException ex) {
 | 
					 | 
				
			||||||
			Skript.warning("Error when parsing NBT - " + ex.getMessage());
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).remove(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, (NBTBase) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((Number) toSet));
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((String) toSet));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			NBTBase value = ((NBTTagList) nbtList).h(index);
 | 
					 | 
				
			||||||
			if (value instanceof NBTTagByte) {
 | 
					 | 
				
			||||||
				return ((NBTTagByte) value).g(); //Byte stored inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagShort) {
 | 
					 | 
				
			||||||
				return ((NBTTagShort) value).f(); //Short inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagInt) {
 | 
					 | 
				
			||||||
				return ((NBTTagInt) value).e(); //Integer inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagLong) {
 | 
					 | 
				
			||||||
				return ((NBTTagLong) value).d(); //Long inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagFloat) {
 | 
					 | 
				
			||||||
				return ((NBTTagFloat) value).i(); //Float inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagDouble) {
 | 
					 | 
				
			||||||
				return ((NBTTagDouble) value).h(); //Double inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagString) {
 | 
					 | 
				
			||||||
				return ((NBTTagString) value).c_(); //String inside the NBTTagString
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTBase) {
 | 
					 | 
				
			||||||
				return value; //No need to convert this
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient) {
 | 
					 | 
				
			||||||
			((EntityInsentient) entity).setGoalTarget(null);
 | 
					 | 
				
			||||||
			if (isTargetSelector) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient && goal instanceof PathfinderGoal) {
 | 
					 | 
				
			||||||
			if (isTargetSelector)
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).targetSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).goalSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
				if (compound == null) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT from a variable: " + raw);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.e(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.save(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			IBlockData tileEntType = nmsWorld.getType(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.getPosition(), tileEntType, tileEntType, 3);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Nothing.
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			OutputStream os = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
			} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore, just end of the file
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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 String getMCId(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = Item.REGISTRY.b(nmsItem.getItem());
 | 
					 | 
				
			||||||
		return mcKey.toString();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = new MinecraftKey(mcId);
 | 
					 | 
				
			||||||
		Item nmsItem = (Item) Item.REGISTRY.get(mcKey);
 | 
					 | 
				
			||||||
		return CraftItemStack.asNewCraftStack(nmsItem);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.noclip = noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isFireProof();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack[] getEndermanBlocks(Entity enderman) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_10_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_10_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		ItemStack[] items = new ItemStack[nmsBlocks.size()];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (net.minecraft.server.v1_10_R1.Block nmsBlock : nmsBlocks) {
 | 
					 | 
				
			||||||
			IBlockData nmsBlockData = nmsBlock.getBlockData();
 | 
					 | 
				
			||||||
			int dataValue = nmsBlock.toLegacyData(nmsBlockData);
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_10_R1.ItemStack nmsItem = new net.minecraft.server.v1_10_R1.ItemStack(nmsBlock, 1, dataValue);
 | 
					 | 
				
			||||||
			ItemStack bukkitItem = CraftItemStack.asCraftMirror(nmsItem);
 | 
					 | 
				
			||||||
			items[i] = bukkitItem;
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return items;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEndermanBlocks(Entity enderman, ItemStack... blocks) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_10_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_10_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		for (ItemStack block : blocks) {
 | 
					 | 
				
			||||||
			if (!block.getType().isBlock())
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			// TODO Figure out how to get a Blocks from a Bukkit ItemStack
 | 
					 | 
				
			||||||
			// Blocks.class has a PRIVATE method to get from a MC id.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.M, nmsEntity.N, nmsEntity.O);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.P;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.P = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.getFlag(7);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setFlag(7, glide);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isNoGravity();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_10_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setNoGravity(noGravity);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,732 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftLivingEntity;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import ch.njol.yggdrasil.Fields;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.BlockPosition;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.EntityInsentient;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.IBlockData;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.Item;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.MinecraftKey;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.MojangsonParseException;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.MojangsonParser;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTBase;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTCompressedStreamTools;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagByte;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagCompound;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagDouble;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagFloat;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagInt;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagList;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagLong;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagShort;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.NBTTagString;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.PathfinderGoal;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.PathfinderGoalSelector;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.TileEntity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.World;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_11_R1.EntityLiving;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_11_R1 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 @Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
			case 1:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
			case 2:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
			case 3:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
			case 4:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
			case 5:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
			case 6:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
			case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case 8:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
			case 9:
 | 
					 | 
				
			||||||
				int i;
 | 
					 | 
				
			||||||
				NBTTagList list = null;
 | 
					 | 
				
			||||||
				for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
					//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
					list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
					if (!list.isEmpty()) { //If list is not empty.
 | 
					 | 
				
			||||||
						break; //Stop loop.
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return list; //May be null
 | 
					 | 
				
			||||||
			case 10:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
			case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
			default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).a((NBTTagCompound) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			parsedNBT = MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		} catch (MojangsonParseException ex) {
 | 
					 | 
				
			||||||
			Skript.warning("Error when parsing NBT - " + ex.getMessage());
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).remove(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, (NBTBase) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((Number) toSet));
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((String) toSet));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			NBTBase value = ((NBTTagList) nbtList).h(index);
 | 
					 | 
				
			||||||
			if (value instanceof NBTTagByte) {
 | 
					 | 
				
			||||||
				return ((NBTTagByte) value).g(); //Byte stored inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagShort) {
 | 
					 | 
				
			||||||
				return ((NBTTagShort) value).f(); //Short inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagInt) {
 | 
					 | 
				
			||||||
				return ((NBTTagInt) value).e(); //Integer inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagLong) {
 | 
					 | 
				
			||||||
				return ((NBTTagLong) value).d(); //Long inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagFloat) {
 | 
					 | 
				
			||||||
				return ((NBTTagFloat) value).i(); //Float inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagDouble) {
 | 
					 | 
				
			||||||
				return ((NBTTagDouble) value).asDouble(); //Double inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagString) {
 | 
					 | 
				
			||||||
				return ((NBTTagString) value).c_(); //String inside the NBTTagString
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTBase) {
 | 
					 | 
				
			||||||
				return value; //No need to convert this
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient) {
 | 
					 | 
				
			||||||
			((EntityInsentient) entity).setGoalTarget(null);
 | 
					 | 
				
			||||||
			if (isTargetSelector) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient && goal instanceof PathfinderGoal) {
 | 
					 | 
				
			||||||
			if (isTargetSelector)
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).targetSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).goalSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
				if (compound == null) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT from a variable: " + raw);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.e(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.save(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			IBlockData tileEntType = nmsWorld.getType(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.getPosition(), tileEntType, tileEntType, 3);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Nothing.
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			OutputStream os = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
			} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore, just end of the file
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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 String getMCId(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = Item.REGISTRY.b(nmsItem.getItem());
 | 
					 | 
				
			||||||
		return mcKey.toString();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = new MinecraftKey(mcId);
 | 
					 | 
				
			||||||
		Item nmsItem = (Item) Item.REGISTRY.get(mcKey);
 | 
					 | 
				
			||||||
		return CraftItemStack.asNewCraftStack(nmsItem);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.noclip = noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isFireProof();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack[] getEndermanBlocks(Entity enderman) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_11_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_11_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		ItemStack[] items = new ItemStack[nmsBlocks.size()];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (net.minecraft.server.v1_11_R1.Block nmsBlock : nmsBlocks) {
 | 
					 | 
				
			||||||
			IBlockData nmsBlockData = nmsBlock.getBlockData();
 | 
					 | 
				
			||||||
			int dataValue = nmsBlock.toLegacyData(nmsBlockData);
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_11_R1.ItemStack nmsItem = new net.minecraft.server.v1_11_R1.ItemStack(nmsBlock, 1, dataValue);
 | 
					 | 
				
			||||||
			ItemStack bukkitItem = CraftItemStack.asCraftMirror(nmsItem);
 | 
					 | 
				
			||||||
			items[i] = bukkitItem;
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return items;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEndermanBlocks(Entity enderman, ItemStack... blocks) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_11_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_11_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		for (ItemStack block : blocks) {
 | 
					 | 
				
			||||||
			if (!block.getType().isBlock())
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			// TODO Figure out how to get a Blocks from a Bukkit ItemStack
 | 
					 | 
				
			||||||
			// Blocks.class has a PRIVATE method to get from a MC id.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.M, nmsEntity.N, nmsEntity.O);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.P;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.P = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.getFlag(7);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setFlag(7, glide);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isNoGravity();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setNoGravity(noGravity);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,732 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftLivingEntity;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import ch.njol.yggdrasil.Fields;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.BlockPosition;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.EntityInsentient;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.IBlockData;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.Item;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.MinecraftKey;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.MojangsonParseException;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.MojangsonParser;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTBase;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTCompressedStreamTools;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagByte;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagCompound;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagDouble;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagFloat;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagInt;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagList;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagLong;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagShort;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.NBTTagString;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.PathfinderGoal;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.PathfinderGoalSelector;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.TileEntity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.World;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_12_R1.EntityLiving;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_12_R1 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
				case 1:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
				case 2:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
				case 3:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
				case 4:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
				case 5:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
				case 6:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
				case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
				case 8:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
				case 9:
 | 
					 | 
				
			||||||
					int i;
 | 
					 | 
				
			||||||
					NBTTagList list = null;
 | 
					 | 
				
			||||||
					for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
						//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
						list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
						if (!list.isEmpty()) { //If list is not empty.
 | 
					 | 
				
			||||||
							break; //Stop loop.
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					return list; //May be null
 | 
					 | 
				
			||||||
				case 10:
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
				case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
					return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
				default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).a((NBTTagCompound) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			parsedNBT = MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		} catch (MojangsonParseException ex) {
 | 
					 | 
				
			||||||
			Skript.warning("Error when parsing NBT - " + ex.getMessage());
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).remove(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, (NBTBase) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((Number) toSet));
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((String) toSet));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			NBTBase value = ((NBTTagList) nbtList).i(index);
 | 
					 | 
				
			||||||
			if (value instanceof NBTTagByte) {
 | 
					 | 
				
			||||||
				return ((NBTTagByte) value).g(); //Byte stored inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagShort) {
 | 
					 | 
				
			||||||
				return ((NBTTagShort) value).f(); //Short inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagInt) {
 | 
					 | 
				
			||||||
				return ((NBTTagInt) value).e(); //Integer inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagLong) {
 | 
					 | 
				
			||||||
				return ((NBTTagLong) value).d(); //Long inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagFloat) {
 | 
					 | 
				
			||||||
				return ((NBTTagFloat) value).i(); //Float inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagDouble) {
 | 
					 | 
				
			||||||
				return ((NBTTagDouble) value).asDouble(); //Double inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagString) {
 | 
					 | 
				
			||||||
				return ((NBTTagString) value).c_(); //String inside the NBTTagString
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTBase) {
 | 
					 | 
				
			||||||
				return value; //No need to convert this
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient) {
 | 
					 | 
				
			||||||
			((EntityInsentient) entity).setGoalTarget(null);
 | 
					 | 
				
			||||||
			if (isTargetSelector) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient && goal instanceof PathfinderGoal) {
 | 
					 | 
				
			||||||
			if (isTargetSelector)
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).targetSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).goalSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
				if (compound == null) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT from a variable: " + raw);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.save(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.save(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			IBlockData tileEntType = nmsWorld.getType(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.getPosition(), tileEntType, tileEntType, 3);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Nothing.
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			OutputStream os = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
			} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore, just end of the file
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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 String getMCId(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = Item.REGISTRY.b(nmsItem.getItem());
 | 
					 | 
				
			||||||
		return mcKey.toString();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = new MinecraftKey(mcId);
 | 
					 | 
				
			||||||
		Item nmsItem = (Item) Item.REGISTRY.get(mcKey);
 | 
					 | 
				
			||||||
		return CraftItemStack.asNewCraftStack(nmsItem);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.noclip = noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isFireProof();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack[] getEndermanBlocks(Entity enderman) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_12_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_12_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		ItemStack[] items = new ItemStack[nmsBlocks.size()];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (net.minecraft.server.v1_12_R1.Block nmsBlock : nmsBlocks) {
 | 
					 | 
				
			||||||
			IBlockData nmsBlockData = nmsBlock.getBlockData();
 | 
					 | 
				
			||||||
			int dataValue = nmsBlock.toLegacyData(nmsBlockData);
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_12_R1.ItemStack nmsItem = new net.minecraft.server.v1_12_R1.ItemStack(nmsBlock, 1, dataValue);
 | 
					 | 
				
			||||||
			ItemStack bukkitItem = CraftItemStack.asCraftMirror(nmsItem);
 | 
					 | 
				
			||||||
			items[i] = bukkitItem;
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return items;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEndermanBlocks(Entity enderman, ItemStack... blocks) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_12_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_12_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		for (ItemStack block : blocks) {
 | 
					 | 
				
			||||||
			if (!block.getType().isBlock())
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			// TODO Figure out how to get a Blocks from a Bukkit ItemStack
 | 
					 | 
				
			||||||
			// Blocks.class has a PRIVATE method to get from a MC id.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.M, nmsEntity.N, nmsEntity.O);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.P;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.P = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.getFlag(7);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setFlag(7, glide);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isNoGravity();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setNoGravity(noGravity);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,684 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.HashMap;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_7_R4.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import ch.njol.yggdrasil.Fields;
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_7_R4 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 @Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
			case 1:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
			case 2:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
			case 3:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
			case 4:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
			case 5:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
			case 6:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
			case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case 8:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
			case 9:
 | 
					 | 
				
			||||||
				int i;
 | 
					 | 
				
			||||||
				NBTTagList list = null;
 | 
					 | 
				
			||||||
				for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
					//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
					list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
					if (!list.toString().equals("[]")) { //If list is not empty.
 | 
					 | 
				
			||||||
						break; //Stop loop.
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return list; //May be null
 | 
					 | 
				
			||||||
			case 10:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
			case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
			default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			HashMap<String, Object> map = (HashMap<String, Object>) ReflectionUtils.getField("map", NBTTagCompound.class, toAdd);
 | 
					 | 
				
			||||||
			Set<String> keySet = ((NBTTagCompound) toAdd).c();
 | 
					 | 
				
			||||||
			Iterator<String> iterator = keySet.iterator();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			while(iterator.hasNext()) {
 | 
					 | 
				
			||||||
				String string = (String) iterator.next();
 | 
					 | 
				
			||||||
				NBTBase base = (NBTBase) map.get(string);
 | 
					 | 
				
			||||||
				if(base.getTypeId() == 10) {
 | 
					 | 
				
			||||||
					if(((NBTTagCompound) compound).hasKeyOfType(string, 10)) {
 | 
					 | 
				
			||||||
						NBTTagCompound localNBT = ((NBTTagCompound) compound).getCompound(string);
 | 
					 | 
				
			||||||
						addToCompound(localNBT, (NBTTagCompound) base);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						((NBTTagCompound) compound).set(string, base.clone());
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					((NBTTagCompound) compound).set(string, base.clone());
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		parsedNBT = (NBTTagCompound) MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			List<Object> actualList = null;
 | 
					 | 
				
			||||||
			actualList = (List<Object>) ReflectionUtils.getField("list", NBTTagList.class, nbtList);
 | 
					 | 
				
			||||||
			actualList.remove(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			int typeId = ((NBTTagList) nbtList).d(); //Contents ID
 | 
					 | 
				
			||||||
			NBTBase toSetNBT = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase)
 | 
					 | 
				
			||||||
				toSetNBT = (NBTBase) toSet;
 | 
					 | 
				
			||||||
			else if (toSet instanceof Number)
 | 
					 | 
				
			||||||
				toSetNBT = (NBTBase) convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			else if (toSet instanceof String)
 | 
					 | 
				
			||||||
				toSetNBT = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			int toSetId = (toSetNBT).getTypeId();
 | 
					 | 
				
			||||||
			if (typeId == 0) {
 | 
					 | 
				
			||||||
				ReflectionUtils.setField("type", NBTTagList.class, nbtList, toSetId);
 | 
					 | 
				
			||||||
			} else if (typeId != toSetId) {
 | 
					 | 
				
			||||||
				Skript.warning("Adding mismatching tag types to NBT list");
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			List<Object> actualList = (List<Object>) ReflectionUtils.getField("list", NBTTagList.class, nbtList);
 | 
					 | 
				
			||||||
			actualList.set(index, toSetNBT);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			List<NBTBase> actualList = null;
 | 
					 | 
				
			||||||
			actualList = (List<NBTBase>) ReflectionUtils.getField("list", NBTTagList.class, nbtList);
 | 
					 | 
				
			||||||
			NBTBase value = (NBTBase) actualList.get(index);
 | 
					 | 
				
			||||||
			return value;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void clearPathfinderGoals(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Sorry, Pathfinder Goal are only supported in 1.8 and above");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Sorry, Pathfinder Goals are only supported in 1.8 and above");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Sorry, Pathfinder Goals are only supported in 1.8 and above");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				@Override
 | 
					 | 
				
			||||||
				public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
					Fields f = new Fields();
 | 
					 | 
				
			||||||
					f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
					return f;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				@Override
 | 
					 | 
				
			||||||
				public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
					assert false;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				@Override
 | 
					 | 
				
			||||||
				protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
					return false;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				@Override
 | 
					 | 
				
			||||||
				protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
					String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
					NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
					if (compound == null) {
 | 
					 | 
				
			||||||
						throw new StreamCorruptedException("Unable to parse NBT compound from a variable: " + raw);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					return compound;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				@Override
 | 
					 | 
				
			||||||
				@Nullable
 | 
					 | 
				
			||||||
				public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
					NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
					return compound;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				@Override
 | 
					 | 
				
			||||||
				public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
					return true;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					return CollectionUtils.array(Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, String.class, NBTBase.class);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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 NBTBase) {
 | 
					 | 
				
			||||||
					addToList(nbtList, delta[0]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.e(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(block.getX(), block.getY(), block.getZ());
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.b(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(block.getX(), block.getY(), block.getZ());
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.x, tileEntity.y, tileEntity.z);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			ex.printStackTrace();
 | 
					 | 
				
			||||||
		} finally {
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				fis.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		OutputStream os = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			ex.printStackTrace();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
			os.close();
 | 
					 | 
				
			||||||
		} catch (Exception ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Ignore, just end of the file
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} finally {
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (Exception ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore.
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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 String getMCId(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		String test = Item.REGISTRY.c(nmsItem.getItem());
 | 
					 | 
				
			||||||
		return test;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		return null; //Not supported in 1.7
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		return false; //Not supported in 1.7
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		return; //Not supported in 1.7
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return (boolean) ReflectionUtils.getField("fireProof", nmsEntity.getClass(), nmsEntity);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.S, nmsEntity.T, nmsEntity.U);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.V;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.V = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Get elytra glide state\" code on 1.7! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Set elytra glide state\" code on 1.7! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Get no gravity state of entity\" code on 1.7! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Set no gravity state of entity\" code on 1.7! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,693 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_8_R3.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import ch.njol.yggdrasil.Fields;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.BlockPosition;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.EntityInsentient;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.Item;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.MinecraftKey;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.MojangsonParseException;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.MojangsonParser;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTBase;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTCompressedStreamTools;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagByte;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagCompound;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagDouble;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagFloat;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagInt;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagList;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagLong;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagShort;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_8_R3.NBTTagString;
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_8_R3 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
			case 1:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
			case 2:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
			case 3:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
			case 4:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
			case 5:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
			case 6:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
			case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case 8:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
			case 9:
 | 
					 | 
				
			||||||
				int i;
 | 
					 | 
				
			||||||
				NBTTagList list = null;
 | 
					 | 
				
			||||||
				for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
					//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
					list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
					if (!list.isEmpty()) { //If list is not empty.
 | 
					 | 
				
			||||||
						break; //Stop loop.
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return list; //May be null
 | 
					 | 
				
			||||||
			case 10:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
			case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
			default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).a((NBTTagCompound) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			parsedNBT = MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		} catch (MojangsonParseException ex) {
 | 
					 | 
				
			||||||
			Skript.warning("Error when parsing NBT - " + ex.getMessage());
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).a(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, (NBTBase) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((Number) toSet));
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((String) toSet));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			NBTBase value = ((NBTTagList) nbtList).g(index);
 | 
					 | 
				
			||||||
			if (value instanceof NBTTagByte) {
 | 
					 | 
				
			||||||
				return ((NBTTagByte) value).f(); //Byte stored inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagShort) {
 | 
					 | 
				
			||||||
				return ((NBTTagShort) value).e(); //Short inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagInt) {
 | 
					 | 
				
			||||||
				return ((NBTTagInt) value).d(); //Integer inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagLong) {
 | 
					 | 
				
			||||||
				return ((NBTTagLong) value).c(); //Long inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagFloat) {
 | 
					 | 
				
			||||||
				return ((NBTTagFloat) value).h(); //Float inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagDouble) {
 | 
					 | 
				
			||||||
				return ((NBTTagDouble) value).g(); //Double inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagString) {
 | 
					 | 
				
			||||||
				return ((NBTTagString) value).a_(); //String inside the NBTTagString
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTBase) {
 | 
					 | 
				
			||||||
				return value; //No need to convert this.
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient) {
 | 
					 | 
				
			||||||
			((EntityInsentient) entity).setGoalTarget(null);
 | 
					 | 
				
			||||||
			if (isTargetSelector) {
 | 
					 | 
				
			||||||
				Iterator<?> goals = ((List<?>) 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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				Iterator<?> goals = ((List<?>) 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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient && goal instanceof PathfinderGoal) {
 | 
					 | 
				
			||||||
			if (isTargetSelector)
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).targetSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).goalSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
				if (compound == null) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT from a variable: " + raw);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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 NBTBase) {
 | 
					 | 
				
			||||||
					addToList(nbtList, delta[0]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.e(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.b(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.getPosition());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Nothing.
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			OutputStream os = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
			} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore, just end of the file
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	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();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = new MinecraftKey(mcId);
 | 
					 | 
				
			||||||
		Item nmsItem = (Item) Item.REGISTRY.get(mcKey);
 | 
					 | 
				
			||||||
		return CraftItemStack.asNewCraftStack(nmsItem);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.noclip = noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isFireProof();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.P, nmsEntity.Q, nmsEntity.R);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.S;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.S = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Elytra Glide State\" code on 1.8! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Elytra Glide State\" code on 1.8! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Get no gravity state of entity\" code on 1.8! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Set no gravity state of entity\" code on 1.8! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,732 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R1.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftLivingEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
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.EntityLiving;
 | 
					 | 
				
			||||||
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;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTCompressedStreamTools;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagByte;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagCompound;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagDouble;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagFloat;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagInt;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagList;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagLong;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagShort;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.NBTTagString;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.PathfinderGoal;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.PathfinderGoalSelector;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.TileEntity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R1.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_9_R1 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 @Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
			case 1:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
			case 2:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
			case 3:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
			case 4:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
			case 5:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
			case 6:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
			case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case 8:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
			case 9:
 | 
					 | 
				
			||||||
				int i;
 | 
					 | 
				
			||||||
				NBTTagList list = null;
 | 
					 | 
				
			||||||
				for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
					//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
					list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
					if (!list.isEmpty()) { //If list is not empty.
 | 
					 | 
				
			||||||
						break; //Stop loop.
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return list; //May be null
 | 
					 | 
				
			||||||
			case 10:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
			case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
			default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).a((NBTTagCompound) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			parsedNBT = MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		} catch (MojangsonParseException ex) {
 | 
					 | 
				
			||||||
			Skript.warning("Error when parsing NBT - " + ex.getMessage());
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).remove(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, (NBTBase) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((Number) toSet));
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((String) toSet));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			NBTBase value = ((NBTTagList) nbtList).h(index);
 | 
					 | 
				
			||||||
			if (value instanceof NBTTagByte) {
 | 
					 | 
				
			||||||
				return ((NBTTagByte) value).f(); //Byte stored inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagShort) {
 | 
					 | 
				
			||||||
				return ((NBTTagShort) value).e(); //Short inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagInt) {
 | 
					 | 
				
			||||||
				return ((NBTTagInt) value).d(); //Integer inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagLong) {
 | 
					 | 
				
			||||||
				return ((NBTTagLong) value).c(); //Long inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagFloat) {
 | 
					 | 
				
			||||||
				return ((NBTTagFloat) value).h(); //Float inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagDouble) {
 | 
					 | 
				
			||||||
				return ((NBTTagDouble) value).g(); //Double inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagString) {
 | 
					 | 
				
			||||||
				return ((NBTTagString) value).a_(); //String inside the NBTTagString
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTBase) {
 | 
					 | 
				
			||||||
				return value; //No need to convert this
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient) {
 | 
					 | 
				
			||||||
			((EntityInsentient) entity).setGoalTarget(null);
 | 
					 | 
				
			||||||
			if (isTargetSelector) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient && goal instanceof PathfinderGoal) {
 | 
					 | 
				
			||||||
			if (isTargetSelector)
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).targetSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).goalSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
				if (compound == null) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT from a variable: " + raw);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.e(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.save(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			IBlockData tileEntType = nmsWorld.getType(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.getPosition(), tileEntType, tileEntType, 3);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Nothing.
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			OutputStream os = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
			} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore, just end of the file
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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 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();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = new MinecraftKey(mcId);
 | 
					 | 
				
			||||||
		Item nmsItem = (Item) Item.REGISTRY.get(mcKey);
 | 
					 | 
				
			||||||
		return CraftItemStack.asNewCraftStack(nmsItem);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.noclip = noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isFireProof();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack[] getEndermanBlocks(Entity enderman) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_9_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_9_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		ItemStack[] items = new ItemStack[nmsBlocks.size()];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (net.minecraft.server.v1_9_R1.Block nmsBlock : nmsBlocks) {
 | 
					 | 
				
			||||||
			IBlockData nmsBlockData = nmsBlock.getBlockData();
 | 
					 | 
				
			||||||
			int dataValue = nmsBlock.toLegacyData(nmsBlockData);
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_9_R1.ItemStack nmsItem = new net.minecraft.server.v1_9_R1.ItemStack(nmsBlock, 1, dataValue);
 | 
					 | 
				
			||||||
			ItemStack bukkitItem = CraftItemStack.asCraftMirror(nmsItem);
 | 
					 | 
				
			||||||
			items[i] = bukkitItem;
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return items;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEndermanBlocks(Entity enderman, ItemStack... blocks) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_9_R1.Block> nmsBlocks = (Set<net.minecraft.server.v1_9_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		for (ItemStack block : blocks) {
 | 
					 | 
				
			||||||
			if (!block.getType().isBlock())
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			// TODO Figure out how to get a Blocks from a Bukkit ItemStack
 | 
					 | 
				
			||||||
			// Blocks.class has a PRIVATE method to get from a MC id.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.M, nmsEntity.N, nmsEntity.O);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.P;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.P = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.getFlag(7);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setFlag(7, glide);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Get no gravity state of entity\" code on 1.9! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Set no gravity state of entity\" code on 1.9! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,732 +0,0 @@
 | 
				
			|||||||
package me.TheBukor.SkStuff.util;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.EOFException;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
import java.io.FileOutputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.NotSerializableException;
 | 
					 | 
				
			||||||
import java.io.OutputStream;
 | 
					 | 
				
			||||||
import java.io.StreamCorruptedException;
 | 
					 | 
				
			||||||
import java.util.Iterator;
 | 
					 | 
				
			||||||
import java.util.LinkedHashSet;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.annotation.Nullable;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
import org.bukkit.Material;
 | 
					 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftLivingEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R2.CraftWorld;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftEntity;
 | 
					 | 
				
			||||||
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack;
 | 
					 | 
				
			||||||
import org.bukkit.entity.Entity;
 | 
					 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ch.njol.skript.Skript;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Changer;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.ClassInfo;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Parser;
 | 
					 | 
				
			||||||
import ch.njol.skript.classes.Serializer;
 | 
					 | 
				
			||||||
import ch.njol.skript.lang.ParseContext;
 | 
					 | 
				
			||||||
import ch.njol.skript.registrations.Classes;
 | 
					 | 
				
			||||||
import ch.njol.util.coll.CollectionUtils;
 | 
					 | 
				
			||||||
import ch.njol.yggdrasil.Fields;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.EntityLiving;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.BlockPosition;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.EntityInsentient;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.IBlockData;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.Item;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.MinecraftKey;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.MojangsonParseException;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.MojangsonParser;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTBase;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTCompressedStreamTools;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagByte;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagCompound;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagDouble;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagFloat;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagInt;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagList;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagLong;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagShort;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.NBTTagString;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.PathfinderGoal;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.PathfinderGoalSelector;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.TileEntity;
 | 
					 | 
				
			||||||
import net.minecraft.server.v1_9_R2.World;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class NMS_v1_9_R2 implements NMSInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			return ((NBTTagCompound) compound).get(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNBTTag(Object compound, String tag, Object toSet) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && (toSet instanceof NBTBase || toSet instanceof Number || toSet instanceof String)) {
 | 
					 | 
				
			||||||
			NBTBase converted = null;
 | 
					 | 
				
			||||||
			if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((Number) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				converted = convertToNBT((String) toSet);
 | 
					 | 
				
			||||||
			} else { //Already an NBTBase
 | 
					 | 
				
			||||||
				converted = (NBTBase) toSet; //No need to convert anything
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).set(tag, converted);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeNBTTag(Object compound, String tag) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).remove(tag);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public byte getTypeId(Object nbtBase) {
 | 
					 | 
				
			||||||
		if (nbtBase instanceof NBTBase) {
 | 
					 | 
				
			||||||
			return ((NBTBase) nbtBase).getTypeId();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 @Override
 | 
					 | 
				
			||||||
	public Object getNBTTagValue(Object compound, String tag, byte typeId) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			switch (typeId) {
 | 
					 | 
				
			||||||
			case 1:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getByte(tag);
 | 
					 | 
				
			||||||
			case 2:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getShort(tag);
 | 
					 | 
				
			||||||
			case 3:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getInt(tag);
 | 
					 | 
				
			||||||
			case 4:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getLong(tag);
 | 
					 | 
				
			||||||
			case 5:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getFloat(tag);
 | 
					 | 
				
			||||||
			case 6:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getDouble(tag);
 | 
					 | 
				
			||||||
			case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case 8:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getString(tag);
 | 
					 | 
				
			||||||
			case 9:
 | 
					 | 
				
			||||||
				int i;
 | 
					 | 
				
			||||||
				NBTTagList list = null;
 | 
					 | 
				
			||||||
				for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
 | 
					 | 
				
			||||||
					//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
 | 
					 | 
				
			||||||
					list = ((NBTTagCompound) compound).getList(tag, i); //Try to get the list with the ID "loop-number".
 | 
					 | 
				
			||||||
					if (!list.isEmpty()) { //If list is not empty.
 | 
					 | 
				
			||||||
						break; //Stop loop.
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return list; //May be null
 | 
					 | 
				
			||||||
			case 10:
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getCompound(tag);
 | 
					 | 
				
			||||||
			case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
 | 
					 | 
				
			||||||
				return ((NBTTagCompound) compound).getIntArray(tag);
 | 
					 | 
				
			||||||
			default: //This should never happen, but it's better to have this just in case it spills errors everywhere.
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToCompound(Object compound, Object toAdd) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && toAdd instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			((NBTTagCompound) compound).a((NBTTagCompound) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromCompound(Object compound, String ... toRemove) {
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			for (String s : toRemove) {
 | 
					 | 
				
			||||||
				((NBTTagCompound) compound).remove(s);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound parseRawNBT(String rawNBT) {
 | 
					 | 
				
			||||||
		NBTTagCompound parsedNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			parsedNBT = MojangsonParser.parse(rawNBT);
 | 
					 | 
				
			||||||
		} catch (MojangsonParseException ex) {
 | 
					 | 
				
			||||||
			Skript.warning("Error when parsing NBT - " + ex.getMessage());
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return parsedNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object[] getContents(Object nbtList) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList) {
 | 
					 | 
				
			||||||
			Object[] contents = new Object[((NBTTagList) nbtList).size()];
 | 
					 | 
				
			||||||
			for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
 | 
					 | 
				
			||||||
				if (getIndex(nbtList, i) != null) {
 | 
					 | 
				
			||||||
					contents[i] = getIndex(nbtList, i);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return contents;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addToList(Object nbtList, Object toAdd) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && toAdd instanceof NBTBase) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).add((NBTBase) toAdd);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void removeFromList(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			((NBTTagList) nbtList).remove(index);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setIndex(Object nbtList, int index, Object toSet) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			if (toSet instanceof NBTBase) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, (NBTBase) toSet);
 | 
					 | 
				
			||||||
			} else if (toSet instanceof Number) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((Number) toSet));
 | 
					 | 
				
			||||||
			} else if (toSet instanceof String) {
 | 
					 | 
				
			||||||
				((NBTTagList) nbtList).a(index, convertToNBT((String) toSet));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Object getIndex(Object nbtList, int index) {
 | 
					 | 
				
			||||||
		if (nbtList instanceof NBTTagList && index >= 0 && index < ((NBTTagList) nbtList).size()) {
 | 
					 | 
				
			||||||
			NBTBase value = ((NBTTagList) nbtList).h(index);
 | 
					 | 
				
			||||||
			if (value instanceof NBTTagByte) {
 | 
					 | 
				
			||||||
				return ((NBTTagByte) value).f(); //Byte stored inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagShort) {
 | 
					 | 
				
			||||||
				return ((NBTTagShort) value).e(); //Short inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagInt) {
 | 
					 | 
				
			||||||
				return ((NBTTagInt) value).d(); //Integer inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagLong) {
 | 
					 | 
				
			||||||
				return ((NBTTagLong) value).c(); //Long inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagFloat) {
 | 
					 | 
				
			||||||
				return ((NBTTagFloat) value).h(); //Float inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagDouble) {
 | 
					 | 
				
			||||||
				return ((NBTTagDouble) value).g(); //Double inside a NBTNumber
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTTagString) {
 | 
					 | 
				
			||||||
				return ((NBTTagString) value).a_(); //String inside the NBTTagString
 | 
					 | 
				
			||||||
			} else if (value instanceof NBTBase) {
 | 
					 | 
				
			||||||
				return value; //No need to convert this
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
	public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient) {
 | 
					 | 
				
			||||||
			((EntityInsentient) entity).setGoalTarget(null);
 | 
					 | 
				
			||||||
			if (isTargetSelector) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
						goals.remove();
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector) {
 | 
					 | 
				
			||||||
		if (entity instanceof EntityInsentient && goal instanceof PathfinderGoal) {
 | 
					 | 
				
			||||||
			if (isTargetSelector)
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).targetSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				((EntityInsentient) entity).goalSelector.a(priority, (PathfinderGoal) goal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerCompoundClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagCompound>(NBTTagCompound.class, "compound").user("((nbt)?( ?tag)?) ?compounds?").name("NBT Compound").changer(new Changer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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) {
 | 
					 | 
				
			||||||
				if (mode == ChangeMode.ADD) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof String) {
 | 
					 | 
				
			||||||
						NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], parsedNBT);
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						addToCompound(NBT[0], delta[0]);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else if (mode == ChangeMode.REMOVE) {
 | 
					 | 
				
			||||||
					if (delta[0] instanceof NBTTagCompound)
 | 
					 | 
				
			||||||
						return;
 | 
					 | 
				
			||||||
					for (Object s : delta) {
 | 
					 | 
				
			||||||
						NBT[0].remove((String) s);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound parse(String rawNBT, ParseContext context) {
 | 
					 | 
				
			||||||
				if (rawNBT.startsWith("nbt:{") && rawNBT.endsWith("}")) {
 | 
					 | 
				
			||||||
					NBTTagCompound NBT = parseRawNBT(rawNBT.substring(4));
 | 
					 | 
				
			||||||
					return NBT;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagCompound compound, int arg1) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagCompound compound) {
 | 
					 | 
				
			||||||
				return compound.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagCompound>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagCompound compound) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", compound.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagCompound compound, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagCompound deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String raw = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(raw);
 | 
					 | 
				
			||||||
				if (compound == null) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT from a variable: " + raw);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagCompound deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound compound =  parseRawNBT(s);
 | 
					 | 
				
			||||||
				return compound;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void registerNBTListClassInfo() {
 | 
					 | 
				
			||||||
		Classes.registerClass(new ClassInfo<NBTTagList>(NBTTagList.class, "nbtlist").user("nbt ?list ?(tag)?").name("NBT List").changer(new Changer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public Class<?>[] acceptChange(ChangeMode mode) {
 | 
					 | 
				
			||||||
				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;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
 | 
					 | 
				
			||||||
				if (delta.length == 0)
 | 
					 | 
				
			||||||
					return;
 | 
					 | 
				
			||||||
				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]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).parser(new Parser<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String getVariableNamePattern() {
 | 
					 | 
				
			||||||
				return ".+";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList parse(String listString, ParseContext context) {
 | 
					 | 
				
			||||||
				if ((listString.startsWith("nbt:[") || listString.startsWith("nbtlist:[")) && listString.endsWith("]")) {
 | 
					 | 
				
			||||||
					int substring;
 | 
					 | 
				
			||||||
					if (listString.startsWith("nbt:[")) {
 | 
					 | 
				
			||||||
						substring = 4;
 | 
					 | 
				
			||||||
					} else { // "nbtlist:[WHATEVER]"
 | 
					 | 
				
			||||||
						substring = 8;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					NBTTagCompound tempNBT =  parseRawNBT("{temp:" + listString.substring(substring) + "}");
 | 
					 | 
				
			||||||
					NBTTagList parsedList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
					return parsedList;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toString(NBTTagList nbtList, int arg1) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public String toVariableNameString(NBTTagList nbtList) {
 | 
					 | 
				
			||||||
				return nbtList.toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}).serializer(new Serializer<NBTTagList>() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public Fields serialize(NBTTagList nbtList) throws NotSerializableException {
 | 
					 | 
				
			||||||
				Fields f = new Fields();
 | 
					 | 
				
			||||||
				f.putObject("asString", nbtList.toString());
 | 
					 | 
				
			||||||
				return f;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public void deserialize(NBTTagList nbtList, Fields f) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				assert false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected boolean canBeInstantiated() {
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			protected NBTTagList deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException {
 | 
					 | 
				
			||||||
				String s = fields.getObject("asString", String.class);
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				if (tempNBT == null || !tempNBT.hasKey("temp")) {
 | 
					 | 
				
			||||||
					throw new StreamCorruptedException("Unable to parse NBT list from a variable: " + s);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			@Nullable
 | 
					 | 
				
			||||||
			public NBTTagList deserialize(String s) {
 | 
					 | 
				
			||||||
				NBTTagCompound tempNBT =  parseRawNBT("{temp:" + s + "}");
 | 
					 | 
				
			||||||
				NBTTagList nbtList = (NBTTagList) tempNBT.get("temp");
 | 
					 | 
				
			||||||
				return nbtList;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			@Override
 | 
					 | 
				
			||||||
			public boolean mustSyncDeserialization() {
 | 
					 | 
				
			||||||
				return true;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getEntityNBT(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		nmsEntity.e(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getTileNBT(Block block) {
 | 
					 | 
				
			||||||
		NBTTagCompound NBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
		TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
		if (tileEntity == null)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		tileEntity.save(NBT);
 | 
					 | 
				
			||||||
		return NBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getItemNBT(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		if (itemStack == null || itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
			return null;
 | 
					 | 
				
			||||||
		NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
 | 
					 | 
				
			||||||
		if (itemNBT == null)
 | 
					 | 
				
			||||||
			itemNBT = new NBTTagCompound();
 | 
					 | 
				
			||||||
		return itemNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityNBT(Entity entity, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
			nmsEntity.f((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setTileNBT(Block block, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			World nmsWorld = ((CraftWorld) block.getWorld()).getHandle();
 | 
					 | 
				
			||||||
			TileEntity tileEntity = nmsWorld.getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			if (tileEntity == null)
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			tileEntity.a((NBTTagCompound) newCompound);
 | 
					 | 
				
			||||||
			tileEntity.update();
 | 
					 | 
				
			||||||
			IBlockData tileEntType = nmsWorld.getType(new BlockPosition(block.getX(), block.getY(), block.getZ()));
 | 
					 | 
				
			||||||
			nmsWorld.notify(tileEntity.getPosition(), tileEntType, tileEntType, 3);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		if (compound instanceof NBTTagCompound && itemStack != null) {
 | 
					 | 
				
			||||||
			if (itemStack.getType() == Material.AIR)
 | 
					 | 
				
			||||||
				return null;
 | 
					 | 
				
			||||||
			if (((NBTTagCompound) compound).isEmpty())
 | 
					 | 
				
			||||||
				return itemStack;
 | 
					 | 
				
			||||||
			nmsItem.setTag((NBTTagCompound) compound);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		} else if (compound == null) {
 | 
					 | 
				
			||||||
			nmsItem.setTag(null);
 | 
					 | 
				
			||||||
			ItemStack newItem = CraftItemStack.asBukkitCopy(nmsItem);
 | 
					 | 
				
			||||||
			return newItem;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return itemStack;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public NBTTagCompound getFileNBT(File file) {
 | 
					 | 
				
			||||||
		FileInputStream fis = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
		} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
			return null; //File doesn't exist.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		NBTTagCompound fileNBT = null;
 | 
					 | 
				
			||||||
		try {
 | 
					 | 
				
			||||||
			fileNBT = NBTCompressedStreamTools.a(fis);
 | 
					 | 
				
			||||||
			fis.close();
 | 
					 | 
				
			||||||
		} catch (IOException ex) {
 | 
					 | 
				
			||||||
			if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
				; //Nothing.
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return fileNBT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFileNBT(File file, Object newCompound) {
 | 
					 | 
				
			||||||
		if (newCompound instanceof NBTTagCompound) {
 | 
					 | 
				
			||||||
			OutputStream os = null;
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				os = new FileOutputStream(file);
 | 
					 | 
				
			||||||
			} catch (FileNotFoundException ex) {
 | 
					 | 
				
			||||||
				ex.printStackTrace();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			try {
 | 
					 | 
				
			||||||
				NBTCompressedStreamTools.a((NBTTagCompound) newCompound, os);
 | 
					 | 
				
			||||||
				os.close();
 | 
					 | 
				
			||||||
			} catch (IOException ex) {
 | 
					 | 
				
			||||||
				if (ex instanceof EOFException) {
 | 
					 | 
				
			||||||
					; //Ignore, just end of the file
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					ex.printStackTrace();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@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 String getMCId(ItemStack itemStack) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = Item.REGISTRY.b(nmsItem.getItem());
 | 
					 | 
				
			||||||
		return mcKey.toString();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack getItemFromMcId(String mcId) {
 | 
					 | 
				
			||||||
		MinecraftKey mcKey = new MinecraftKey(mcId);
 | 
					 | 
				
			||||||
		Item nmsItem = (Item) Item.REGISTRY.get(mcKey);
 | 
					 | 
				
			||||||
		return CraftItemStack.asNewCraftStack(nmsItem);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getNoClip(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setNoClip(Entity entity, boolean noclip) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.noclip = noclip;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getFireProof(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.isFireProof();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setFireProof(Entity entity, boolean fireProof) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		ReflectionUtils.setField("fireProof", nmsEntity.getClass(), nmsEntity, fireProof);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public ItemStack[] getEndermanBlocks(Entity enderman) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_9_R2.Block> nmsBlocks = (Set<net.minecraft.server.v1_9_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		ItemStack[] items = new ItemStack[nmsBlocks.size()];
 | 
					 | 
				
			||||||
		int i = 0;
 | 
					 | 
				
			||||||
		for (net.minecraft.server.v1_9_R2.Block nmsBlock : nmsBlocks) {
 | 
					 | 
				
			||||||
			IBlockData nmsBlockData = nmsBlock.getBlockData();
 | 
					 | 
				
			||||||
			int dataValue = nmsBlock.toLegacyData(nmsBlockData);
 | 
					 | 
				
			||||||
			net.minecraft.server.v1_9_R2.ItemStack nmsItem = new net.minecraft.server.v1_9_R1.ItemStack(nmsBlock, 1, dataValue);
 | 
					 | 
				
			||||||
			ItemStack bukkitItem = CraftItemStack.asCraftMirror(nmsItem);
 | 
					 | 
				
			||||||
			items[i] = bukkitItem;
 | 
					 | 
				
			||||||
			i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return items;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@SuppressWarnings("unchecked")
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEndermanBlocks(Entity enderman, ItemStack... blocks) {
 | 
					 | 
				
			||||||
		EntityEnderman nmsEnder = ((CraftEnderman) enderman).getHandle();
 | 
					 | 
				
			||||||
		Set<net.minecraft.server.v1_9_R2.Block> nmsBlocks = (Set<net.minecraft.server.v1_9_R1.Block>) ReflectionUtils.getField("c", EntityEnderman.class, nmsEnder);
 | 
					 | 
				
			||||||
		for (ItemStack block : blocks) {
 | 
					 | 
				
			||||||
			if (!block.getType().isBlock())
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			// TODO Figure out how to get a Blocks from a Bukkit ItemStack
 | 
					 | 
				
			||||||
			// Blocks.class has a PRIVATE method to get from a MC id.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public Location getLastLocation(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		org.bukkit.World world = nmsEntity.world.getWorld();
 | 
					 | 
				
			||||||
		Location lastEntLoc = new Location(world, nmsEntity.M, nmsEntity.N, nmsEntity.O);
 | 
					 | 
				
			||||||
		return lastEntLoc;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public float getEntityStepLength(Entity entity) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.P;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void setEntityStepLength(Entity entity, float length) {
 | 
					 | 
				
			||||||
		net.minecraft.server.v1_9_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.P = length;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public boolean getElytraGlideState(Entity entity) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		return nmsEntity.getFlag(7);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setElytraGlideState(Entity entity, boolean glide) {
 | 
					 | 
				
			||||||
		EntityLiving nmsEntity = ((CraftLivingEntity) entity).getHandle();
 | 
					 | 
				
			||||||
		nmsEntity.setFlag(7, glide);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean getNoGravity(Entity entity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Get no gravity state of entity\" code on 1.9! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setNoGravity(Entity entity, boolean noGravity) {
 | 
					 | 
				
			||||||
		Bukkit.getLogger().warning("Executed \"Set no gravity state of entity\" code on 1.9! How the hell did this even happen!!");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user