Hopefuly should work fine.
Updated to 1.9, moving from Reflection to a new method using and Interface with useful NMS methods (some expressions are still using Reflection).
This commit is contained in:
parent
f3fcb59fa1
commit
b0aa11475e
27
.classpath
27
.classpath
@ -1,13 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/Server - Survival - 1.8/plugins/Skript.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/Server - Survival - 1.8/plugins/WorldEdit.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.7.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/VanishNoPacket.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.7.10.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.3.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/Server - Survival - 1.8/plugins/Skript.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/Server - Survival - 1.8/plugins/WorldEdit.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.7.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/VanishNoPacket.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.7.10.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.3.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.8.jar"/>
|
||||
<classpathentry kind="lib" path="C:/Users/Rubi/AppData/Roaming/.minecraft/workspace/Spigot 1.8, 1.8.3/1.9.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
|
10
plugin.yml
10
plugin.yml
@ -1,6 +1,6 @@
|
||||
name: SkStuff
|
||||
author: TheBukor
|
||||
description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support.
|
||||
version: 1.5.1
|
||||
main: me.TheBukor.SkStuff.SkStuff
|
||||
name: SkStuff
|
||||
author: TheBukor
|
||||
description: A Skript addon which adds extra functionalities such as NBT and extended WorldEdit support.
|
||||
version: 1.6
|
||||
main: me.TheBukor.SkStuff.SkStuff
|
||||
softdepend: [Skript, WorldEdit]
|
@ -1,219 +1,217 @@
|
||||
package me.TheBukor.SkStuff;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
|
||||
import ch.njol.skript.Skript;
|
||||
import ch.njol.skript.classes.ClassInfo;
|
||||
import ch.njol.skript.lang.ExpressionType;
|
||||
import ch.njol.skript.lang.util.SimpleEvent;
|
||||
import ch.njol.skript.registrations.Classes;
|
||||
import ch.njol.skript.registrations.EventValues;
|
||||
import ch.njol.skript.util.Getter;
|
||||
import me.TheBukor.SkStuff.conditions.CondSelectionContains;
|
||||
import me.TheBukor.SkStuff.effects.EffClearPathGoals;
|
||||
import me.TheBukor.SkStuff.effects.EffDrainLiquid;
|
||||
import me.TheBukor.SkStuff.effects.EffDrawLineWE;
|
||||
import me.TheBukor.SkStuff.effects.EffGZipFile;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeCylinder;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeJump;
|
||||
import me.TheBukor.SkStuff.effects.EffMakePyramid;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeSphere;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeWalls;
|
||||
import me.TheBukor.SkStuff.effects.EffNaturalize;
|
||||
import me.TheBukor.SkStuff.effects.EffPasteSchematic;
|
||||
import me.TheBukor.SkStuff.effects.EffRememberChanges;
|
||||
import me.TheBukor.SkStuff.effects.EffRemovePathGoal;
|
||||
import me.TheBukor.SkStuff.effects.EffReplaceBlocksWE;
|
||||
import me.TheBukor.SkStuff.effects.EffSetBlocksWE;
|
||||
import me.TheBukor.SkStuff.effects.EffSetPathGoal;
|
||||
import me.TheBukor.SkStuff.effects.EffShowEntityEffect;
|
||||
import me.TheBukor.SkStuff.effects.EffSimulateSnow;
|
||||
import me.TheBukor.SkStuff.effects.EffToggleVanish;
|
||||
import me.TheBukor.SkStuff.effects.EffUndoRedoSession;
|
||||
import me.TheBukor.SkStuff.events.EvtWorldEditChange;
|
||||
import me.TheBukor.SkStuff.events.WorldEditChangeHandler;
|
||||
import me.TheBukor.SkStuff.expressions.ExprChangedBlocksSession;
|
||||
import me.TheBukor.SkStuff.expressions.ExprClickedInventory;
|
||||
import me.TheBukor.SkStuff.expressions.ExprEditSessionLimit;
|
||||
import me.TheBukor.SkStuff.expressions.ExprEndermanBlocks;
|
||||
import me.TheBukor.SkStuff.expressions.ExprFileNBT;
|
||||
import me.TheBukor.SkStuff.expressions.ExprFireProof;
|
||||
import me.TheBukor.SkStuff.expressions.ExprItemNBT;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNBTListContents;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNBTListIndex;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNBTOf;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNewEditSession;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNoClip;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSchematicArea;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSelectionArea;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSelectionOfPlayer;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSelectionPos;
|
||||
import me.TheBukor.SkStuff.expressions.ExprTagOf;
|
||||
import me.TheBukor.SkStuff.expressions.ExprTimespanToNumber;
|
||||
import me.TheBukor.SkStuff.expressions.ExprToLowerCase;
|
||||
import me.TheBukor.SkStuff.expressions.ExprToUpperCase;
|
||||
import me.TheBukor.SkStuff.expressions.ExprVanishState;
|
||||
import me.TheBukor.SkStuff.expressions.ExprWordsToUpperCase;
|
||||
import me.TheBukor.SkStuff.util.NMSInterface;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_7_R4;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_8_R1;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_8_R2;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_8_R3;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class SkStuff extends JavaPlugin {
|
||||
private int condAmount = 0;
|
||||
private int effAmount = 0;
|
||||
private int evtAmount = 0;
|
||||
private int exprAmount = 0;
|
||||
private int typeAmount = 0;
|
||||
|
||||
public static SkStuff instance;
|
||||
|
||||
private static NMSInterface nmsMethods;
|
||||
|
||||
public void onEnable() {
|
||||
if (Bukkit.getPluginManager().getPlugin("Skript") != null && Skript.isAcceptRegistrations()) {
|
||||
Skript.registerAddon(this);
|
||||
getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully enabled!");
|
||||
|
||||
getLogger().info("Registering general non version specific stuff...");
|
||||
Skript.registerEffect(EffShowEntityEffect.class, "(display|play|show) entity effect (0¦firework[s] explo(de|sion)|1¦hurt|2¦[[iron] golem] (give|offer) (rose|poppy)|3¦[sheep] eat grass|4¦wolf shake) at %entity%");
|
||||
Skript.registerExpression(ExprToUpperCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] (cap[ital]s|upper[ ]case)", "convert %string% to [all] (cap[ital]s|upper[ ]case)", "capitalize [all] [char[acter]s (of|in)] %string%");
|
||||
Skript.registerExpression(ExprToLowerCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] lower[ ]case", "convert %string% to [all] lower[ ]case", "un[( |-)]capitalize [all] [char[acter]s (of|in)] %string%");
|
||||
Skript.registerExpression(ExprWordsToUpperCase.class, String.class, ExpressionType.SIMPLE, "(first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% [converted] to (cap[ital]s|upper[ ]case) (0¦|1¦ignoring [other] upper[ ]case [(char[acter]s|letters)])", "convert (first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% to (cap[ital]s|upper[ ]case) (0¦|1¦ignoring [other] upper[ ]case [(char[acter]s|letters)])", "capitalize (first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% (0¦|1¦ignoring [other] upper[ ]case [(char[acter]s|letters)])");
|
||||
Skript.registerExpression(ExprTimespanToNumber.class, Number.class, ExpressionType.SIMPLE, "%timespan% [converted] [in]to (0¦ticks|1¦sec[ond]s|2¦min[ute]s|3¦hours|4¦days)");
|
||||
Skript.registerExpression(ExprClickedInventory.class, Inventory.class, ExpressionType.SIMPLE, "[skstuff] clicked inventory");
|
||||
effAmount += 1;
|
||||
exprAmount += 5;
|
||||
|
||||
if (setupNMSVersion()) {
|
||||
getLogger().info("Trying to register version specific stuff...");
|
||||
Skript.registerEffect(EffClearPathGoals.class, "(clear|delete) [all] pathfind[er] goals (of|from) %livingentity%");
|
||||
Skript.registerEffect(EffRemovePathGoal.class, "remove pathfind[er] goal (0¦(avoid|run away from) entit(y|ies)|1¦break door[s]|2¦breed|3¦eat grass|4¦(flee from the sun|seek shad(e|ow))|5¦float (in[side]|on) water|6¦follow (owner|tamer)|7¦follow (adult|parent)[s]|8¦(fight back|react to|target) (damager|attacker)|9¦o(c|z)elot jump on blocks|10¦leap at target|11¦look at entit(y|ies)|12¦melee attack entit(y|ies)|13¦move to[wards] target|14¦target nearest entity|15¦o(c|z)elot attack [chicken[s]]|16¦open door[s]|17¦(panic|flee)|18¦look around randomly|19¦(walk around randomly|wander)|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦(wake other silverfish[es]|[silverfish] call (help|reinforcement|other [hidden] silverfish[es]))|26¦[enderm(a|e)n] pick[[ ]up] block[s]|27¦[enderm(a|e)n] place block[s]|28¦[enderman] attack player (staring|looking) [at eye[s]]|29¦ghast move to[wards] target|30¦ghast (idle move[ment]|wander|random fl(ight|y[ing]))|31¦(tempt to|follow players (holding|with)) [a[n]] item|32¦target [random] entity (if|when) (not tamed|untamed)|33¦guardian attack [entity]|34¦[z[ombie[ ]]pig[man]] attack [player[s]] (if|when) angry|35¦[z[ombie[ ]]pig[man]] (react to|fight back|target) (attacker|damager) (if|when) angry|36¦[rabbit] eat carrot crops|37¦[killer] rabbit [melee] attack|38¦slime [random] jump|39¦slime change (direction|facing) randomly|40¦slime (idle move[ment]|wander)) from %livingentity%");
|
||||
Skript.registerEffect(EffSetPathGoal.class, "add pathfind[er] goal [[with] priority %-integer%] (0¦(avoid|run away from) %entitydata%[, radius %-number%[, speed %-number%[, speed (if|when) (close|near) %-number%]]]|1¦break door[s]|2¦breed[,[move[ment]] speed %-number%]|3¦eat grass|4¦(flee from the sun|seek shad(e|ow))[, [move[ment]] speed %-number%]|5¦(float (in[side]|on) water|swim)|6¦follow (owner|tamer)[, speed %-number%[, min[imum] distance %-number%[, max[imum] distance %-number%]]]|7¦follow (adult|parent)[s][, [move[ment]] speed %-number%]|8¦(fight back|react to|target) (damager|attacker) [[of] type] %entitydata%[, call ([for] help|reinforcement) %-boolean%]|9¦o(c|z)elot jump on blocks[, [move[ment]] speed %-number%]|10¦leap at target[, [leap] height %-number%]|11¦look at %entitydata%[, (radius|max[imum] distance) %-number%]|12¦melee attack %entitydata%[, [move[ment]] speed %-number%[, (memorize|do('nt| not) forget) target [for [a] long[er] time] %-boolean%]]|13¦move to[wards] target[, [move[ment]] speed %-number%[, (radius|max[imum] distance) %-number%]]|14¦target nearest [entity [of] type] %entitydata%[, check sight %-boolean%]|15¦o(c|z)elot attack|16¦open door[s]|17¦(panic|flee)[, [move[ment]] speed %-number%]|18¦look around randomly|19¦(walk around randomly|wander)[, [move[ment]] speed %-number%[, min[imum] [of] %-timespan% between mov(e[ment][s]|ing)]]|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim around|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦((call|summon|wake) [other] [hidden] silverfish[es])|26¦[enderman] pick[[ ]up] block[s]|27¦[enderman] place block[s]|28¦[enderman] attack player (staring|looking) at [their] eye[s]]|29¦ghast move to[wards] target|30¦ghast (idle move[ment]|wander|random fl(ight|y[ing]))|31¦(tempt to|follow players (holding|with)) %-itemstack%[, [move[ment]] speed %number%[, scared of player movement %-boolean%]]|32¦target [random] %entitydata% (if|when) (not |un)tamed|33¦guardian attack [entities]|34¦[z[ombie[ ]]pig[man]] attack [player[s]] (if|when) angry|35¦[z[ombie[ ]]pig[man]] (react to|fight back|target) (attacker|damager) (if|when) angry|36¦[rabbit] eat carrot crops|37¦[killer] rabbit [melee] attack|38¦slime [random] jump|39¦slime change (direction|facing) randomly|40¦slime (idle move[ment]|wander)) to %livingentity%");
|
||||
Skript.registerEffect(EffMakeJump.class, "make %livingentities% jump", "force %livingentities% to jump");
|
||||
Skript.registerEffect(EffGZipFile.class, "create [a] gzip[ped] file [at] %string%");
|
||||
Skript.registerExpression(ExprNBTOf.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] of %~object%", "%~object%'s nbt[[ ]tag[s]]");
|
||||
Skript.registerExpression(ExprItemNBT.class, ItemStack.class, ExpressionType.SIMPLE, "%itemstack% with [custom] nbt[[ ]tag[s]] %string%");
|
||||
Skript.registerExpression(ExprTagOf.class, Object.class, ExpressionType.PROPERTY, "[nbt[ ]]tag %string% of [[nbt] compound] %compound%");
|
||||
Skript.registerExpression(ExprFileNBT.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] from [file] %string%");
|
||||
Skript.registerExpression(ExprNBTListIndex.class, Object.class, ExpressionType.PROPERTY, "[nbt[ ]list] %nbtlist% index %number%");
|
||||
Skript.registerExpression(ExprNBTListContents.class, Object.class, ExpressionType.PROPERTY, "[all] contents (of|from) [nbt[ ]list] %nbtlist%", "[nbt[ ]list] %nbtlist% contents");
|
||||
Skript.registerExpression(ExprNoClip.class, Boolean.class, ExpressionType.PROPERTY, "no[( |-)]clip (state|mode) of %entities%", "%entities%'s no[( |-)]clip (state|mode)");
|
||||
Skript.registerExpression(ExprFireProof.class, Boolean.class, ExpressionType.PROPERTY, "fire[ ]proof (state|mode) of %entities%", "%entities%'s fire[ ]proof (state|mode)");
|
||||
Skript.registerExpression(ExprEndermanBlocks.class, ItemStack.class, ExpressionType.PROPERTY, "blocks that %entity% can (carry|hold|grab|steal)");
|
||||
nmsMethods.registerCompoundClassInfo();
|
||||
nmsMethods.registerNBTListClassInfo();
|
||||
effAmount += 5;
|
||||
exprAmount += 9;
|
||||
typeAmount += 2;
|
||||
}
|
||||
if (Bukkit.getPluginManager().getPlugin("WorldEdit") != null) {
|
||||
getLogger().info("WorldEdit found! Registering WorldEdit stuff...");
|
||||
Skript.registerCondition(CondSelectionContains.class, "[(world[ ]edit|we)] selection of %player% (contains|has) %location%", "%player%'s [(world[ ]edit|we)] selection (contains|has) %location%", "[(world[ ]edit|we)] selection of %player% does(n't| not) (contain|have) %location%", "%player%'s [(world[ ]edit|we)] selection does(n't| not) (contain|have) %location%");
|
||||
Skript.registerEffect(EffDrawLineWE.class, "(create|draw|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) line from %location% to %location% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks% [with] thick[ness] %double%");
|
||||
Skript.registerEffect(EffUndoRedoSession.class, "(0¦undo|1¦redo) (change|edit)s (of|from) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffRememberChanges.class, "make %player% (remember|be able to undo) changes (of|from) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakeSphere.class, "(create|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) (ellipsoid|sphere) [centered] at %location% [with] radius [of] %double%,[ ]%double%(,[ ]| and )%double% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffSimulateSnow.class, "(simulate snow at|place snow over) %location% (in|within) [a] radius [of] %double% (using|with) [edit[ ]session] %editsession%", "make %location% snowy (in|within) [a] radius [of] %double% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakePyramid.class, "(create|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) pyramid at %location% [with] radius [of] %integer% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffDrainLiquid.class, "(drain|remove) [all] liquid[s] at %location% (in|within) [a] radius [of] %double% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffNaturalize.class, "naturalize ([cuboid] region|[all] blocks) (from|between) %location% (to|and) %location% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakeWalls.class, "(create|make) wall[s] from %location% to %location% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffSetBlocksWE.class, "set [all] blocks (from|between) %location% (to|and) %location% to %itemstacks% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakeCylinder.class, "(create|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) cylinder at %location% [with] radius [of] %double%,[ ]%integer%(,[ ]| and )%double% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffReplaceBlocksWE.class, "replace [all] %itemstacks% (from|between) %location% (to|and) %location% with %itemstacks% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffPasteSchematic.class, "paste schem[atic] %string% at %location% using [edit[ ]session] %editsession% (0¦|1¦(ignor(e|ing)|without|[with] no) air)");
|
||||
Skript.registerExpression(ExprEditSessionLimit.class, Integer.class, ExpressionType.PROPERTY, "[block] limit [change] of [edit[ ]session] %editsession%");
|
||||
Skript.registerExpression(ExprChangedBlocksSession.class, Integer.class, ExpressionType.PROPERTY, "number of [all] changed blocks (in|of) [edit[ ]session] %editsession%");
|
||||
Skript.registerExpression(ExprNewEditSession.class, EditSession.class, ExpressionType.PROPERTY, "[new] edit[ ]session in [world] %world% [with] [max[imum]] [block] limit [change] [of] %integer%");
|
||||
Skript.registerExpression(ExprSelectionOfPlayer.class, Location.class, ExpressionType.PROPERTY, "[(world[ ]edit|we)] selection of %player%", "%player%'s [(world[ ]edit|we)] selection");
|
||||
Skript.registerExpression(ExprSelectionPos.class, Location.class, ExpressionType.PROPERTY, "[(world[ ]edit|we)] po(s|int)[ ](0¦1|1¦2) of %player%", "%player%'s [(world[ ]edit|we)] po(s|int)[ ](0¦1|1¦2)");
|
||||
Skript.registerExpression(ExprSelectionArea.class, Integer.class, ExpressionType.SIMPLE, "(0¦volume|1¦(x( |-)size|width)|2¦(y( |-)size|height)|3¦(z( |-)size|length)|4¦area) of [(world[ ]edit|we)] selection of %player%", "%player%'s [(world[ ]edit|we)] selection (0¦volume|1¦(x( |-)size|width)|2¦(y( |-)size|height)|3¦(z( |-)size|length)|4¦area)");
|
||||
Skript.registerExpression(ExprSchematicArea.class, Integer.class, ExpressionType.SIMPLE, "(0¦volume|1¦(x( |-)size|width)|2¦(y( |-)size|height)|3¦(z( |-)size|length)|4¦area) of schem[atic] [from] %string%");
|
||||
Classes.registerClass(new ClassInfo<EditSession>(EditSession.class, "editsession").name("Edit Session").user("edit ?sessions?"));
|
||||
try {
|
||||
Class.forName("com.sk89q.worldedit.extent.logging.AbstractLoggingExtent");
|
||||
new WorldEditChangeHandler();
|
||||
Skript.registerEvent("WorldEdit block change", SimpleEvent.class, EvtWorldEditChange.class, "world[ ]edit [block] (chang(e|ing)|edit[ing])");
|
||||
EventValues.registerEventValue(EvtWorldEditChange.class, Player.class, new Getter<Player, EvtWorldEditChange>() {
|
||||
@Override
|
||||
@Nullable
|
||||
public Player get(EvtWorldEditChange e) {
|
||||
return EvtWorldEditChange.getPlayer();
|
||||
}
|
||||
}, 0);
|
||||
EventValues.registerEventValue(EvtWorldEditChange.class, Block.class, new Getter<Block, EvtWorldEditChange>() {
|
||||
@Override
|
||||
@Nullable
|
||||
public Block get(EvtWorldEditChange e) {
|
||||
return EvtWorldEditChange.getBlock();
|
||||
}
|
||||
}, 0);
|
||||
evtAmount += 1;
|
||||
} catch (ClassNotFoundException ex) {
|
||||
Skript.error("Unable to register \"On WorldEdit block change\" event! You will need to upgrade to WorldEdit 6.0");
|
||||
return;
|
||||
}
|
||||
condAmount += 1;
|
||||
effAmount += 13;
|
||||
exprAmount += 7;
|
||||
typeAmount += 1;
|
||||
}
|
||||
if (Bukkit.getPluginManager().getPlugin("VanishNoPacket") != null) {
|
||||
getLogger().info("VanishNoPacket was found! Registering vanishing features...");
|
||||
Skript.registerEffect(EffToggleVanish.class, "toggle vanish (state|mode) of %player% (0¦|1¦(silently|quietly))", "toggle %player%'s vanish (state|mode) (0¦|1¦(silently|quietly))");
|
||||
Skript.registerExpression(ExprVanishState.class, Boolean.class, ExpressionType.PROPERTY, "vanish (state|mode) of %player%", "%player%'s vanish (state|mode)");
|
||||
effAmount += 1;
|
||||
exprAmount += 1;
|
||||
}
|
||||
getLogger().info("Everything ready! Loaded a total of " + condAmount + " conditions, " + effAmount + " effects, " + evtAmount + "events, " + exprAmount + " expressions and " + typeAmount + " types!");
|
||||
} else {
|
||||
getLogger().info("Unable to find Skript or Skript isn't accepting registrations, disabling SkStuff...");
|
||||
Bukkit.getPluginManager().disablePlugin(this);;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean setupNMSVersion() {
|
||||
String version = ReflectionUtils.getVersion();
|
||||
if (version.equals("v1_7_R4.")) {
|
||||
nmsMethods = new NMS_v1_7_R4();
|
||||
getLogger().info("It looks like you're running 1.7.10!");
|
||||
} else if (version.equals("v1_8_R1.")) {
|
||||
nmsMethods = new NMS_v1_8_R1();
|
||||
getLogger().info("It looks like you're running 1.8.0!");
|
||||
} else if (version.equals("v1_8_R2.")) {
|
||||
nmsMethods = new NMS_v1_8_R2();
|
||||
getLogger().info("It looks like you're running 1.8.3!");
|
||||
} else if (version.equals("v1_8_R3.")) {
|
||||
nmsMethods = new NMS_v1_8_R3();
|
||||
getLogger().info("It looks like you're either running 1.8.7, 1.8.8 or 1.8.9!");
|
||||
} else {
|
||||
getLogger().warning("It looks like you're running an unsupported server version, some features will not be available :(");
|
||||
}
|
||||
return nmsMethods != null;
|
||||
}
|
||||
|
||||
public static SkStuff getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static NMSInterface getNMSMethods() {
|
||||
return nmsMethods;
|
||||
}
|
||||
|
||||
public void onDisable() {
|
||||
getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully disabled.");
|
||||
}
|
||||
package me.TheBukor.SkStuff;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
|
||||
import ch.njol.skript.Skript;
|
||||
import ch.njol.skript.classes.ClassInfo;
|
||||
import ch.njol.skript.lang.ExpressionType;
|
||||
import ch.njol.skript.lang.util.SimpleEvent;
|
||||
import ch.njol.skript.registrations.Classes;
|
||||
import ch.njol.skript.registrations.EventValues;
|
||||
import ch.njol.skript.util.Getter;
|
||||
import me.TheBukor.SkStuff.conditions.CondSelectionContains;
|
||||
import me.TheBukor.SkStuff.effects.EffClearPathGoals;
|
||||
import me.TheBukor.SkStuff.effects.EffDrainLiquid;
|
||||
import me.TheBukor.SkStuff.effects.EffDrawLineWE;
|
||||
import me.TheBukor.SkStuff.effects.EffGZipFile;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeCylinder;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeJump;
|
||||
import me.TheBukor.SkStuff.effects.EffMakePyramid;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeSphere;
|
||||
import me.TheBukor.SkStuff.effects.EffMakeWalls;
|
||||
import me.TheBukor.SkStuff.effects.EffNaturalize;
|
||||
import me.TheBukor.SkStuff.effects.EffPasteSchematic;
|
||||
import me.TheBukor.SkStuff.effects.EffRememberChanges;
|
||||
import me.TheBukor.SkStuff.effects.EffRemovePathGoal;
|
||||
import me.TheBukor.SkStuff.effects.EffReplaceBlocksWE;
|
||||
import me.TheBukor.SkStuff.effects.EffSetBlocksWE;
|
||||
import me.TheBukor.SkStuff.effects.EffSetPathGoal;
|
||||
import me.TheBukor.SkStuff.effects.EffShowEntityEffect;
|
||||
import me.TheBukor.SkStuff.effects.EffSimulateSnow;
|
||||
import me.TheBukor.SkStuff.effects.EffToggleVanish;
|
||||
import me.TheBukor.SkStuff.effects.EffUndoRedoSession;
|
||||
import me.TheBukor.SkStuff.events.EvtWorldEditChange;
|
||||
import me.TheBukor.SkStuff.events.WorldEditChangeHandler;
|
||||
import me.TheBukor.SkStuff.expressions.ExprChangedBlocksSession;
|
||||
import me.TheBukor.SkStuff.expressions.ExprClickedInventory;
|
||||
import me.TheBukor.SkStuff.expressions.ExprEditSessionLimit;
|
||||
import me.TheBukor.SkStuff.expressions.ExprEndermanBlocks;
|
||||
import me.TheBukor.SkStuff.expressions.ExprFileNBT;
|
||||
import me.TheBukor.SkStuff.expressions.ExprFireProof;
|
||||
import me.TheBukor.SkStuff.expressions.ExprItemNBT;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNBTListContents;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNBTListIndex;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNBTOf;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNewEditSession;
|
||||
import me.TheBukor.SkStuff.expressions.ExprNoClip;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSchematicArea;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSelectionArea;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSelectionOfPlayer;
|
||||
import me.TheBukor.SkStuff.expressions.ExprSelectionPos;
|
||||
import me.TheBukor.SkStuff.expressions.ExprTagOf;
|
||||
import me.TheBukor.SkStuff.expressions.ExprTimespanToNumber;
|
||||
import me.TheBukor.SkStuff.expressions.ExprToLowerCase;
|
||||
import me.TheBukor.SkStuff.expressions.ExprToUpperCase;
|
||||
import me.TheBukor.SkStuff.expressions.ExprVanishState;
|
||||
import me.TheBukor.SkStuff.expressions.ExprWordsToUpperCase;
|
||||
import me.TheBukor.SkStuff.util.NMSInterface;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_7_R4;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_8_R1;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_8_R2;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_8_R3;
|
||||
import me.TheBukor.SkStuff.util.NMS_v1_9_R1;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class SkStuff extends JavaPlugin {
|
||||
private int condAmount = 0;
|
||||
private int effAmount = 0;
|
||||
private int evtAmount = 0;
|
||||
private int exprAmount = 0;
|
||||
private int typeAmount = 0;
|
||||
|
||||
private static NMSInterface nmsMethods;
|
||||
|
||||
public void onEnable() {
|
||||
if (Bukkit.getPluginManager().getPlugin("Skript") != null && Skript.isAcceptRegistrations()) {
|
||||
Skript.registerAddon(this);
|
||||
getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully enabled!");
|
||||
|
||||
getLogger().info("Registering general non version specific stuff...");
|
||||
Skript.registerEffect(EffShowEntityEffect.class, "(display|play|show) entity effect (0¦firework[s] explo(de|sion)|1¦hurt|2¦[[iron] golem] (give|offer) (rose|poppy)|3¦[sheep] eat grass|4¦wolf shake) at %entity%");
|
||||
Skript.registerExpression(ExprToUpperCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] (cap[ital]s|upper[ ]case)", "convert %string% to [all] (cap[ital]s|upper[ ]case)", "capitalize [all] [char[acter]s (of|in)] %string%");
|
||||
Skript.registerExpression(ExprToLowerCase.class, String.class, ExpressionType.SIMPLE, "%string% [converted] to [all] lower[ ]case", "convert %string% to [all] lower[ ]case", "un[( |-)]capitalize [all] [char[acter]s (of|in)] %string%");
|
||||
Skript.registerExpression(ExprWordsToUpperCase.class, String.class, ExpressionType.SIMPLE, "(first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% [converted] to (cap[ital]s|upper[ ]case) (0¦|1¦ignoring [other] upper[ ]case [(char[acter]s|letters)])", "convert (first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% to (cap[ital]s|upper[ ]case) (0¦|1¦ignoring [other] upper[ ]case [(char[acter]s|letters)])", "capitalize (first|1st) (letter|char[acter]) (of|in) (each word|[all] words) (of|in) %string% (0¦|1¦ignoring [other] upper[ ]case [(char[acter]s|letters)])");
|
||||
Skript.registerExpression(ExprTimespanToNumber.class, Number.class, ExpressionType.SIMPLE, "%timespan% [converted] [in]to (0¦ticks|1¦sec[ond]s|2¦min[ute]s|3¦hours|4¦days)");
|
||||
Skript.registerExpression(ExprClickedInventory.class, Inventory.class, ExpressionType.SIMPLE, "[skstuff] clicked inventory");
|
||||
effAmount += 1;
|
||||
exprAmount += 5;
|
||||
|
||||
if (setupNMSVersion()) {
|
||||
getLogger().info("Trying to register version specific stuff...");
|
||||
Skript.registerEffect(EffClearPathGoals.class, "(clear|delete) [all] pathfind[er] goals (of|from) %livingentity%");
|
||||
Skript.registerEffect(EffRemovePathGoal.class, "remove pathfind[er] goal (0¦(avoid|run away from) entit(y|ies)|1¦break door[s]|2¦breed|3¦eat grass|4¦(flee from the sun|seek shad(e|ow))|5¦float (in[side]|on) water|6¦follow (owner|tamer)|7¦follow (adult|parent)[s]|8¦(fight back|react to|target) (damager|attacker)|9¦o(c|z)elot jump on blocks|10¦leap at target|11¦look at entit(y|ies)|12¦melee attack entit(y|ies)|13¦move to[wards] target|14¦target nearest entity|15¦o(c|z)elot attack [chicken[s]]|16¦open door[s]|17¦(panic|flee)|18¦look around randomly|19¦(walk around randomly|wander)|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦(wake other silverfish[es]|[silverfish] call (help|reinforcement|other [hidden] silverfish[es]))|26¦[enderm(a|e)n] pick[[ ]up] block[s]|27¦[enderm(a|e)n] place block[s]|28¦[enderman] attack player (staring|looking) [at eye[s]]|29¦ghast move to[wards] target|30¦ghast (idle move[ment]|wander|random fl(ight|y[ing]))|31¦(tempt to|follow players (holding|with)) [a[n]] item|32¦target [random] entity (if|when) (not tamed|untamed)|33¦guardian attack [entity]|34¦[z[ombie[ ]]pig[man]] attack [player[s]] (if|when) angry|35¦[z[ombie[ ]]pig[man]] (react to|fight back|target) (attacker|damager) (if|when) angry|36¦[rabbit] eat carrot crops|37¦[killer] rabbit [melee] attack|38¦slime [random] jump|39¦slime change (direction|facing) randomly|40¦slime (idle move[ment]|wander)) from %livingentity%");
|
||||
Skript.registerEffect(EffSetPathGoal.class, "add pathfind[er] goal [[with] priority %-integer%] (0¦(avoid|run away from) %entitydata%[, radius %-number%[, speed %-number%[, speed (if|when) (close|near) %-number%]]]|1¦break door[s]|2¦breed[,[move[ment]] speed %-number%]|3¦eat grass|4¦(flee from the sun|seek shad(e|ow))[, [move[ment]] speed %-number%]|5¦(float (in[side]|on) water|swim)|6¦follow (owner|tamer)[, speed %-number%[, min[imum] distance %-number%[, max[imum] distance %-number%]]]|7¦follow (adult|parent)[s][, [move[ment]] speed %-number%]|8¦(fight back|react to|target) (damager|attacker) [[of] type] %entitydata%[, call ([for] help|reinforcement) %-boolean%]|9¦o(c|z)elot jump on blocks[, [move[ment]] speed %-number%]|10¦leap at target[, [leap] height %-number%]|11¦look at %entitydata%[, (radius|max[imum] distance) %-number%]|12¦melee attack %entitydata%[, [move[ment]] speed %-number%[, (memorize|do('nt| not) forget) target [for [a] long[er] time] %-boolean%]]|13¦move to[wards] target[, [move[ment]] speed %-number%[, (radius|max[imum] distance) %-number%]]|14¦target nearest [entity [of] type] %entitydata%[, check sight %-boolean%]|15¦o(c|z)elot attack|16¦open door[s]|17¦(panic|flee)[, [move[ment]] speed %-number%]|18¦look around randomly|19¦(walk around randomly|wander)[, [move[ment]] speed %-number%[, min[imum] [of] %-timespan% between mov(e[ment][s]|ing)]]|20¦sit|21¦[creeper] (explode|inflate|swell)|22¦squid (swim around|wander)|23¦shoot fireball[s]|24¦[silverfish] hide (in[side]|on) block[s]|25¦((call|summon|wake) [other] [hidden] silverfish[es])|26¦[enderman] pick[[ ]up] block[s]|27¦[enderman] place block[s]|28¦[enderman] attack player (staring|looking) at [their] eye[s]]|29¦ghast move to[wards] target|30¦ghast (idle move[ment]|wander|random fl(ight|y[ing]))|31¦(tempt to|follow players (holding|with)) %-itemstack%[, [move[ment]] speed %number%[, scared of player movement %-boolean%]]|32¦target [random] %entitydata% (if|when) (not |un)tamed|33¦guardian attack [entities]|34¦[z[ombie[ ]]pig[man]] attack [player[s]] (if|when) angry|35¦[z[ombie[ ]]pig[man]] (react to|fight back|target) (attacker|damager) (if|when) angry|36¦[rabbit] eat carrot crops|37¦[killer] rabbit [melee] attack|38¦slime [random] jump|39¦slime change (direction|facing) randomly|40¦slime (idle move[ment]|wander)) to %livingentity%");
|
||||
Skript.registerEffect(EffMakeJump.class, "make %livingentities% jump", "force %livingentities% to jump");
|
||||
Skript.registerEffect(EffGZipFile.class, "create [a] gzip[ped] file [at] [path] %string%");
|
||||
Skript.registerExpression(ExprNBTOf.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] of %~object%", "%~object%'s nbt[[ ]tag[s]]");
|
||||
Skript.registerExpression(ExprItemNBT.class, ItemStack.class, ExpressionType.SIMPLE, "%itemstack% with [custom] nbt[[ ]tag[s]] %string%");
|
||||
Skript.registerExpression(ExprTagOf.class, Object.class, ExpressionType.PROPERTY, "[nbt[ ]]tag %string% of [[nbt] compound] %compound%");
|
||||
Skript.registerExpression(ExprFileNBT.class, Object.class, ExpressionType.PROPERTY, "nbt[[ ]tag[s]] from [file] %string%");
|
||||
Skript.registerExpression(ExprNBTListIndex.class, Object.class, ExpressionType.PROPERTY, "[nbt[ ]list] %nbtlist% index %number%");
|
||||
Skript.registerExpression(ExprNBTListContents.class, Object.class, ExpressionType.PROPERTY, "[all] contents (of|from) [nbt[ ]list] %nbtlist%", "[nbt[ ]list] %nbtlist% contents");
|
||||
Skript.registerExpression(ExprNoClip.class, Boolean.class, ExpressionType.PROPERTY, "no[( |-)]clip (state|mode) of %entities%", "%entities%'s no[( |-)]clip (state|mode)");
|
||||
Skript.registerExpression(ExprFireProof.class, Boolean.class, ExpressionType.PROPERTY, "fire[ ]proof (state|mode) of %entities%", "%entities%'s fire[ ]proof (state|mode)");
|
||||
Skript.registerExpression(ExprEndermanBlocks.class, ItemStack.class, ExpressionType.PROPERTY, "blocks that %entity% can (carry|hold|grab|steal)");
|
||||
nmsMethods.registerCompoundClassInfo();
|
||||
nmsMethods.registerNBTListClassInfo();
|
||||
effAmount += 5;
|
||||
exprAmount += 9;
|
||||
typeAmount += 2;
|
||||
}
|
||||
if (Bukkit.getPluginManager().getPlugin("WorldEdit") != null) {
|
||||
getLogger().info("WorldEdit found! Registering WorldEdit stuff...");
|
||||
Skript.registerCondition(CondSelectionContains.class, "[(world[ ]edit|we)] selection of %player% (contains|has) %location%", "%player%'s [(world[ ]edit|we)] selection (contains|has) %location%", "[(world[ ]edit|we)] selection of %player% does(n't| not) (contain|have) %location%", "%player%'s [(world[ ]edit|we)] selection does(n't| not) (contain|have) %location%");
|
||||
Skript.registerEffect(EffDrawLineWE.class, "(create|draw|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) line from %location% to %location% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks% [with] thick[ness] %double%");
|
||||
Skript.registerEffect(EffUndoRedoSession.class, "(0¦undo|1¦redo) (change|edit)s (of|from) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffRememberChanges.class, "make %player% (remember|be able to undo) changes (of|from) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakeSphere.class, "(create|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) (ellipsoid|sphere) [centered] at %location% [with] radius [of] %double%,[ ]%double%(,[ ]| and )%double% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffSimulateSnow.class, "(simulate snow at|place snow over) %location% (in|within) [a] radius [of] %double% (using|with) [edit[ ]session] %editsession%", "make %location% snowy (in|within) [a] radius [of] %double% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakePyramid.class, "(create|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) pyramid at %location% [with] radius [of] %integer% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffDrainLiquid.class, "(drain|remove) [all] liquid[s] at %location% (in|within) [a] radius [of] %double% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffNaturalize.class, "naturalize ([cuboid] region|[all] blocks) (from|between) %location% (to|and) %location% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakeWalls.class, "(create|make) wall[s] from %location% to %location% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffSetBlocksWE.class, "set [all] blocks (from|between) %location% (to|and) %location% to %itemstacks% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffMakeCylinder.class, "(create|make) [a[n]] (0¦(no(n|t)(-| )hollow|filled|)|1¦hollow) cylinder at %location% [with] radius [of] %double%,[ ]%integer%(,[ ]| and )%double% (using|with) [edit[ ]session] %editsession% (using|with) [block[s]] %itemstacks%");
|
||||
Skript.registerEffect(EffReplaceBlocksWE.class, "replace [all] %itemstacks% (from|between) %location% (to|and) %location% with %itemstacks% (using|with) [edit[ ]session] %editsession%");
|
||||
Skript.registerEffect(EffPasteSchematic.class, "paste schem[atic] %string% at %location% using [edit[ ]session] %editsession% (0¦|1¦(ignor(e|ing)|without|[with] no) air)");
|
||||
Skript.registerExpression(ExprEditSessionLimit.class, Integer.class, ExpressionType.PROPERTY, "[block] limit [change] of [edit[ ]session] %editsession%");
|
||||
Skript.registerExpression(ExprChangedBlocksSession.class, Integer.class, ExpressionType.PROPERTY, "number of [all] changed blocks (in|of) [edit[ ]session] %editsession%");
|
||||
Skript.registerExpression(ExprNewEditSession.class, EditSession.class, ExpressionType.PROPERTY, "[new] edit[ ]session in [world] %world% [with] [max[imum]] [block] limit [change] [of] %integer%");
|
||||
Skript.registerExpression(ExprSelectionOfPlayer.class, Location.class, ExpressionType.PROPERTY, "[(world[ ]edit|we)] selection of %player%", "%player%'s [(world[ ]edit|we)] selection");
|
||||
Skript.registerExpression(ExprSelectionPos.class, Location.class, ExpressionType.PROPERTY, "[(world[ ]edit|we)] po(s|int)[ ](0¦1|1¦2) of %player%", "%player%'s [(world[ ]edit|we)] po(s|int)[ ](0¦1|1¦2)");
|
||||
Skript.registerExpression(ExprSelectionArea.class, Integer.class, ExpressionType.SIMPLE, "(0¦volume|1¦(x( |-)size|width)|2¦(y( |-)size|height)|3¦(z( |-)size|length)|4¦area) of [(world[ ]edit|we)] selection of %player%", "%player%'s [(world[ ]edit|we)] selection (0¦volume|1¦(x( |-)size|width)|2¦(y( |-)size|height)|3¦(z( |-)size|length)|4¦area)");
|
||||
Skript.registerExpression(ExprSchematicArea.class, Integer.class, ExpressionType.SIMPLE, "(0¦volume|1¦(x( |-)size|width)|2¦(y( |-)size|height)|3¦(z( |-)size|length)|4¦area) of schem[atic] [from] %string%");
|
||||
Classes.registerClass(new ClassInfo<EditSession>(EditSession.class, "editsession").name("Edit Session").user("edit ?sessions?"));
|
||||
try {
|
||||
Class.forName("com.sk89q.worldedit.extent.logging.AbstractLoggingExtent");
|
||||
new WorldEditChangeHandler();
|
||||
Skript.registerEvent("WorldEdit block change", SimpleEvent.class, EvtWorldEditChange.class, "world[ ]edit [block] (chang(e|ing)|edit[ing])");
|
||||
EventValues.registerEventValue(EvtWorldEditChange.class, Player.class, new Getter<Player, EvtWorldEditChange>() {
|
||||
@Override
|
||||
@Nullable
|
||||
public Player get(EvtWorldEditChange e) {
|
||||
return EvtWorldEditChange.getPlayer();
|
||||
}
|
||||
}, 0);
|
||||
EventValues.registerEventValue(EvtWorldEditChange.class, Block.class, new Getter<Block, EvtWorldEditChange>() {
|
||||
@Override
|
||||
@Nullable
|
||||
public Block get(EvtWorldEditChange e) {
|
||||
return EvtWorldEditChange.getBlock();
|
||||
}
|
||||
}, 0);
|
||||
evtAmount += 1;
|
||||
} catch (ClassNotFoundException ex) {
|
||||
Skript.error("Unable to register \"On WorldEdit block change\" event! You will need to upgrade to WorldEdit 6.0");
|
||||
return;
|
||||
}
|
||||
condAmount += 1;
|
||||
effAmount += 13;
|
||||
exprAmount += 7;
|
||||
typeAmount += 1;
|
||||
}
|
||||
if (Bukkit.getPluginManager().getPlugin("VanishNoPacket") != null) {
|
||||
getLogger().info("VanishNoPacket was found! Registering vanishing features...");
|
||||
Skript.registerEffect(EffToggleVanish.class, "toggle vanish (state|mode) of %player% (0¦|1¦(silently|quietly))", "toggle %player%'s vanish (state|mode) (0¦|1¦(silently|quietly))");
|
||||
Skript.registerExpression(ExprVanishState.class, Boolean.class, ExpressionType.PROPERTY, "vanish (state|mode) of %player%", "%player%'s vanish (state|mode)");
|
||||
effAmount += 1;
|
||||
exprAmount += 1;
|
||||
}
|
||||
getLogger().info("Everything ready! Loaded a total of " + condAmount + " conditions, " + effAmount + " effects, " + evtAmount + "events, " + exprAmount + " expressions and " + typeAmount + " types!");
|
||||
} else {
|
||||
getLogger().info("Unable to find Skript or Skript isn't accepting registrations, disabling SkStuff...");
|
||||
Bukkit.getPluginManager().disablePlugin(this);;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean setupNMSVersion() {
|
||||
String version = ReflectionUtils.getVersion();
|
||||
if (version.equals("v1_7_R4.")) {
|
||||
nmsMethods = new NMS_v1_7_R4();
|
||||
getLogger().info("It looks like you're running 1.7.10!");
|
||||
} else if (version.equals("v1_8_R1.")) {
|
||||
nmsMethods = new NMS_v1_8_R1();
|
||||
getLogger().info("It looks like you're running 1.8.0!");
|
||||
} else if (version.equals("v1_8_R2.")) {
|
||||
nmsMethods = new NMS_v1_8_R2();
|
||||
getLogger().info("It looks like you're running 1.8.3!");
|
||||
} else if (version.equals("v1_8_R3.")) {
|
||||
nmsMethods = new NMS_v1_8_R3();
|
||||
getLogger().info("It looks like you're either running 1.8.7, 1.8.8 or 1.8.9!");
|
||||
} else if (version.equals("v1_9_R1.")) {
|
||||
nmsMethods = new NMS_v1_9_R1();
|
||||
getLogger().info("It looks like you're running 1.9.0!");
|
||||
} else {
|
||||
getLogger().warning("It looks like you're running an unsupported server version, some features will not be available :(");
|
||||
}
|
||||
return nmsMethods != null;
|
||||
}
|
||||
|
||||
public static NMSInterface getNMSMethods() {
|
||||
return nmsMethods;
|
||||
}
|
||||
|
||||
public void onDisable() {
|
||||
getLogger().info("SkStuff " + this.getDescription().getVersion() + " has been successfully disabled.");
|
||||
}
|
||||
}
|
@ -1,54 +1,54 @@
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class EffClearPathGoals extends Effect {
|
||||
private Expression<LivingEntity> entity;
|
||||
|
||||
private Class<?> goalSelectorClass = ReflectionUtils.getNMSClass("PathfinderGoalSelector", false);
|
||||
private Class<?> insentientEnt = ReflectionUtils.getNMSClass("EntityInsentient", false);
|
||||
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
entity = (Expression<LivingEntity>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "clear all pathfinder goals from " + entity.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
LivingEntity ent = entity.getSingle(e);
|
||||
if (ent instanceof Player || ent == null)
|
||||
return;
|
||||
Object obcEnt = craftLivEnt.cast(ent);
|
||||
try {
|
||||
Object nmsEnt = insentientEnt.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
|
||||
Object goalSelector = ReflectionUtils.getField("goalSelector", insentientEnt, nmsEnt);
|
||||
Object targetSelector = ReflectionUtils.getField("targetSelector", insentientEnt, nmsEnt);
|
||||
((List<?>) ReflectionUtils.getField("b", goalSelectorClass, goalSelector)).clear();
|
||||
((List<?>) ReflectionUtils.getField("c", goalSelectorClass, goalSelector)).clear();
|
||||
((List<?>) ReflectionUtils.getField("b", goalSelectorClass, targetSelector)).clear();
|
||||
((List<?>) ReflectionUtils.getField("c", goalSelectorClass, targetSelector)).clear();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class EffClearPathGoals extends Effect {
|
||||
private Expression<LivingEntity> entity;
|
||||
|
||||
private Class<?> goalSelectorClass = ReflectionUtils.getNMSClass("PathfinderGoalSelector");
|
||||
private Class<?> insentientEnt = ReflectionUtils.getNMSClass("EntityInsentient");
|
||||
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
entity = (Expression<LivingEntity>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "clear all pathfinder goals from " + entity.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
LivingEntity ent = entity.getSingle(e);
|
||||
if (ent instanceof Player || ent == null)
|
||||
return;
|
||||
Object obcEnt = craftLivEnt.cast(ent);
|
||||
try {
|
||||
Object nmsEnt = insentientEnt.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
|
||||
Object goalSelector = ReflectionUtils.getField("goalSelector", insentientEnt, nmsEnt);
|
||||
Object targetSelector = ReflectionUtils.getField("targetSelector", insentientEnt, nmsEnt);
|
||||
((List<?>) ReflectionUtils.getField("b", goalSelectorClass, goalSelector)).clear();
|
||||
((List<?>) ReflectionUtils.getField("c", goalSelectorClass, goalSelector)).clear();
|
||||
((List<?>) ReflectionUtils.getField("b", goalSelectorClass, targetSelector)).clear();
|
||||
((List<?>) ReflectionUtils.getField("c", goalSelectorClass, targetSelector)).clear();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,56 +1,49 @@
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
|
||||
public class EffGZipFile extends Effect {
|
||||
private Expression<String> filePath;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
filePath = (Expression<String>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "create GZipped file at " + filePath.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
File newFile = new File(filePath.getSingle(e));
|
||||
/*
|
||||
if (!newFile.exists()) {
|
||||
try {
|
||||
newFile.createNewFile();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
*/
|
||||
try {
|
||||
new GZIPOutputStream(new FileOutputStream(newFile)).close();
|
||||
} catch (FileNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
} catch (IOException ex) {
|
||||
if (!(ex instanceof EOFException)) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
|
||||
public class EffGZipFile extends Effect {
|
||||
private Expression<String> filePath;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
filePath = (Expression<String>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "create GZipped file at path " + filePath.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
File newFile = new File(filePath.getSingle(e));
|
||||
if (!newFile.exists()) {
|
||||
try {
|
||||
new GZIPOutputStream(new FileOutputStream(newFile)).close();
|
||||
} catch (FileNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
} catch (IOException ex) {
|
||||
if (!(ex instanceof EOFException)) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,51 +1,51 @@
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class EffMakeJump extends Effect {
|
||||
private Expression<LivingEntity> entities;
|
||||
|
||||
private Class<?> entInsent = ReflectionUtils.getNMSClass("EntityInsentient", false);
|
||||
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
entities = (Expression<LivingEntity>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "make " + entities.toString(e, debug) + " jump";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
LivingEntity[] ents = entities.getAll(e);
|
||||
for (Entity ent : ents) {
|
||||
if (ent == null || ent instanceof Player || ent instanceof ArmorStand)
|
||||
continue;
|
||||
Object obcEnt = craftLivEnt.cast(ent);
|
||||
try {
|
||||
Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
|
||||
Object controllerJump = nmsEnt.getClass().getMethod("getControllerJump").invoke(nmsEnt);
|
||||
controllerJump.getClass().getMethod("a").invoke(controllerJump);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class EffMakeJump extends Effect {
|
||||
private Expression<LivingEntity> entities;
|
||||
|
||||
private Class<?> entInsent = ReflectionUtils.getNMSClass("EntityInsentient");
|
||||
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
entities = (Expression<LivingEntity>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "make " + entities.toString(e, debug) + " jump";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
LivingEntity[] ents = entities.getAll(e);
|
||||
for (Entity ent : ents) {
|
||||
if (ent == null || ent instanceof Player || ent instanceof ArmorStand)
|
||||
continue;
|
||||
Object obcEnt = craftLivEnt.cast(ent);
|
||||
try {
|
||||
Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
|
||||
Object controllerJump = nmsEnt.getClass().getMethod("getControllerJump").invoke(nmsEnt);
|
||||
controllerJump.getClass().getMethod("a").invoke(controllerJump);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,256 +1,235 @@
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.Blaze;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.Ghast;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Rabbit;
|
||||
import org.bukkit.entity.Spider;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class EffRemovePathGoal extends Effect {
|
||||
private Expression<LivingEntity> entity;
|
||||
|
||||
private int mark;
|
||||
|
||||
private Class<?> entInsent = ReflectionUtils.getNMSClass("EntityInsentient", false);
|
||||
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
mark = result.mark;
|
||||
entity = (Expression<LivingEntity>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "remove pathfinder goal from " + entity.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
LivingEntity ent = entity.getSingle(e);
|
||||
if (ent instanceof Player || ent == null)
|
||||
return;
|
||||
Object obcEnt = craftLivEnt.cast(ent);
|
||||
try {
|
||||
Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
|
||||
Object goalSelector = ReflectionUtils.getField("goalSelector", entInsent, nmsEnt);
|
||||
Object targetSelector = ReflectionUtils.getField("targetSelector", entInsent, nmsEnt);
|
||||
Object toRemove = null;
|
||||
boolean target = false;
|
||||
boolean resetGoalTarget = false;
|
||||
if (mark == 0) {
|
||||
if (ent instanceof Rabbit) {
|
||||
Class<?> goalRabbitAvoid = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitAvoidTarget", false);
|
||||
toRemove = goalRabbitAvoid;
|
||||
} else {
|
||||
Class<?> goalAvoid = ReflectionUtils.getNMSClass("PathfinderGoalAvoidTarget", false);
|
||||
toRemove = goalAvoid;
|
||||
}
|
||||
} else if (mark == 1) {
|
||||
Class<?> goalBreakDoor = ReflectionUtils.getNMSClass("PathfinderGoalBreakDoor", false);
|
||||
toRemove = goalBreakDoor;
|
||||
} else if (mark == 2) {
|
||||
Class<?> goalBreed = ReflectionUtils.getNMSClass("PathfinderGoalBreed", false);
|
||||
toRemove = goalBreed;
|
||||
} else if (mark == 3) {
|
||||
Class<?> goalEatGrass = ReflectionUtils.getNMSClass("PathfinderGoalEatTile", false);
|
||||
toRemove = goalEatGrass;
|
||||
} else if (mark == 4) {
|
||||
Class<?> goalFleeSun = ReflectionUtils.getNMSClass("PathfinderGoalFleeSun", false);
|
||||
toRemove = goalFleeSun;
|
||||
} else if (mark == 5) {
|
||||
Class<?> goalFloat = ReflectionUtils.getNMSClass("PathfinderGoalFloat", false);
|
||||
toRemove = goalFloat;
|
||||
} else if (mark == 6) {
|
||||
Class<?> goalFollowOwner = ReflectionUtils.getNMSClass("PathfinderGoalFollowOwner", false);
|
||||
toRemove = goalFollowOwner;
|
||||
} else if (mark == 7) {
|
||||
Class<?> goalFollowAdults = ReflectionUtils.getNMSClass("PathfinderGoalFollowParent", false);
|
||||
toRemove = goalFollowAdults;
|
||||
} else if (mark == 8) {
|
||||
target = true;
|
||||
Class<?> goalReactAttack = ReflectionUtils.getNMSClass("PathfinderGoalHurtByTarget", false);
|
||||
toRemove = goalReactAttack;
|
||||
} else if (mark == 9) {
|
||||
Class<?> goalJumpOnBlock = ReflectionUtils.getNMSClass("PathfinderGoalJumpOnBlock", false);
|
||||
toRemove = goalJumpOnBlock;
|
||||
} else if (mark == 10) {
|
||||
Class<?> goalLeapTarget = ReflectionUtils.getNMSClass("PathfinderGoalLeapAtTarget", false);
|
||||
toRemove = goalLeapTarget;
|
||||
} else if (mark == 11) {
|
||||
Class<?> goalLookEntities = ReflectionUtils.getNMSClass("PathfinderGoalLookAtPlayer", false);
|
||||
toRemove = goalLookEntities;
|
||||
} else if (mark == 12) {
|
||||
if (ent instanceof Spider) {
|
||||
Class<?> goalSpiderMelee = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderMeleeAttack", false);
|
||||
toRemove = goalSpiderMelee;
|
||||
} else {
|
||||
Class<?> goalMeleeAttack = ReflectionUtils.getNMSClass("PathfinderGoalMeleeAttack", false);
|
||||
toRemove = goalMeleeAttack;
|
||||
}
|
||||
} else if (mark == 13) {
|
||||
if (ent instanceof Ghast) {
|
||||
Class<?> goalGhastGotoTarget = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalMoveTowardsTarget", false);
|
||||
toRemove = goalGhastGotoTarget;
|
||||
} else {
|
||||
Class<?> goalGotoTarget = ReflectionUtils.getNMSClass("PathfinderGoalMoveTowardsTarget", false);
|
||||
toRemove = goalGotoTarget;
|
||||
}
|
||||
} else if (mark == 14) {
|
||||
target = true;
|
||||
if (ent instanceof Spider) {
|
||||
Class<?> goalSpiderNearTarget = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderNearestAttackableTarget", false);
|
||||
toRemove = goalSpiderNearTarget;
|
||||
} else {
|
||||
Class<?> goalNearTarget = ReflectionUtils.getNMSClass("PathfinderGoalNearestAttackableTarget", false);
|
||||
toRemove = goalNearTarget;
|
||||
}
|
||||
} else if (mark == 15) {
|
||||
Class<?> goalOcelotAttack = ReflectionUtils.getNMSClass("PathfinderGoalOcelotAttack", false);
|
||||
toRemove = goalOcelotAttack;
|
||||
} else if (mark == 16) {
|
||||
Class<?> goalOpenDoors = ReflectionUtils.getNMSClass("PathfinderGoalOpenDoor", false);
|
||||
toRemove = goalOpenDoors;
|
||||
} else if (mark == 17) {
|
||||
if (ent instanceof Rabbit) {
|
||||
Class<?> goalRabbitPanic = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitPanic", false);
|
||||
toRemove = goalRabbitPanic;
|
||||
} else {
|
||||
Class<?> goalPanic = ReflectionUtils.getNMSClass("PathfinderGoalPanic", false);
|
||||
toRemove = goalPanic;
|
||||
}
|
||||
} else if (mark == 18) {
|
||||
Class<?> goalRandomLook = ReflectionUtils.getNMSClass("PathfinderGoalRandomLookaround", false);
|
||||
toRemove = goalRandomLook;
|
||||
} else if (mark == 19) {
|
||||
Class<?> goalWander = ReflectionUtils.getNMSClass("PathfinderGoalRandomStroll", false);
|
||||
toRemove = goalWander;
|
||||
} else if (mark == 20) {
|
||||
Class<?> goalSit = ReflectionUtils.getNMSClass("PathfinderGoalSit", false);
|
||||
toRemove = goalSit;
|
||||
} else if (mark == 21) {
|
||||
Class<?> goalSwell = ReflectionUtils.getNMSClass("PathfinderGoalSwell", false);
|
||||
toRemove = goalSwell;
|
||||
} else if (mark == 22) {
|
||||
Class<?> goalSquid = ReflectionUtils.getNMSClass("EntitySquid$PathfinderGoalSquid", false);
|
||||
toRemove = goalSquid;
|
||||
} else if (mark == 23) {
|
||||
resetGoalTarget = true;
|
||||
if (ent instanceof Blaze) {
|
||||
Class<?> goalBlazeFireball = ReflectionUtils.getNMSClass("EntityBlaze$PathfinderGoalBlazeFireball", false);
|
||||
toRemove = goalBlazeFireball;
|
||||
} else if (ent instanceof Ghast) {
|
||||
Class<?> goalGhastFireball = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastAttackTarget", false);
|
||||
toRemove = goalGhastFireball;
|
||||
}
|
||||
} else if (mark == 24) {
|
||||
Class<?> goalHideInBlock = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishHideInBlock", false);
|
||||
toRemove = goalHideInBlock;
|
||||
} else if (mark == 25) {
|
||||
Class<?> goalWakeSilverfish = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishWakeOthers", false);
|
||||
toRemove = goalWakeSilverfish;
|
||||
} else if (mark == 26) {
|
||||
Class<?> goalPickBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPickupBlock", false);
|
||||
toRemove = goalPickBlocks;
|
||||
} else if (mark == 27) {
|
||||
Class<?> goalPlaceBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPlaceBlock", false);
|
||||
toRemove = goalPlaceBlocks;
|
||||
} else if (mark == 28) {
|
||||
target = true;
|
||||
Class<?> goalAttackLooker = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalPlayerWhoLookedAtTarget", false);
|
||||
toRemove = goalAttackLooker;
|
||||
} else if (mark == 29) {
|
||||
Class<?> goalGhastMoveTarget = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastMoveTowardsTarget", false);
|
||||
toRemove = goalGhastMoveTarget;
|
||||
} else if (mark == 30) {
|
||||
Class<?> goalGhastIdleMove = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastIdleMove", false);
|
||||
toRemove = goalGhastIdleMove;
|
||||
} else if (mark == 31) {
|
||||
Class<?> goalTempt = ReflectionUtils.getNMSClass("PathfinderGoalTempt", false);
|
||||
toRemove = goalTempt;
|
||||
} else if (mark == 32) {
|
||||
target = true;
|
||||
Class<?> goalTargetNonTamed = ReflectionUtils.getNMSClass("PathfinderGoalRandomTargetNonTamed", false);
|
||||
toRemove = goalTargetNonTamed;
|
||||
} else if (mark == 33) {
|
||||
resetGoalTarget = true;
|
||||
Class<?> goalGuardianAttack = ReflectionUtils.getNMSClass("EntityGuardian$PathfinderGoalGuardianAttack", false);
|
||||
toRemove = goalGuardianAttack;
|
||||
} else if (mark == 34) {
|
||||
target = true;
|
||||
Class<?> goalAnger = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAnger", false);
|
||||
toRemove = goalAnger;
|
||||
} else if (mark == 35) {
|
||||
target = true;
|
||||
Class<?> goalAngerOther = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAngerOther", false);
|
||||
toRemove = goalAngerOther;
|
||||
} else if (mark == 36) {
|
||||
Class<?> goalEatCarrots = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalEatCarrots", false);
|
||||
toRemove = goalEatCarrots;
|
||||
} else if (mark == 37) {
|
||||
Class<?> goalRabbitAttack = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalKillerRabbitMeleeAttack", false);
|
||||
toRemove = goalRabbitAttack;
|
||||
} else if (mark == 38) {
|
||||
Class<?> goalJump = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomJump", false);
|
||||
toRemove = goalJump;
|
||||
} else if (mark == 39) {
|
||||
Class<?> goalRandomDir = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomDirection", false);
|
||||
toRemove = goalRandomDir;
|
||||
} else if (mark == 40) {
|
||||
Class<?> goalSlimeWander = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeIdle", false);
|
||||
toRemove = goalSlimeWander;
|
||||
}
|
||||
if (toRemove == null)
|
||||
return;
|
||||
|
||||
/* "Hey, why are you setting the entity's target to null?!"
|
||||
*
|
||||
* For some goals (Blaze/Ghast fireball and Guardian attack), if you remove the goal while the entity is attacking, it will not stop attacking imediatelly, it will keep attacking its target.
|
||||
* So there's a "bug" with this behavior, as soon as the entity's target resets (null, A.K.A <none>) the server crashes. Because we messed with the entity's "attack target" goal, the game
|
||||
* still thinks it needs to get the target's location for some reason, and since the target is null... It throws an unhandled NPE (it never happens in Vanilla behavior), crashing the server.
|
||||
* So I'm just setting the target to null before removing the goal, so it stops attacking properly, and also prevents the said crash.
|
||||
*/
|
||||
|
||||
if (resetGoalTarget) {
|
||||
((Creature) entity.getSingle(e)).setTarget(null);
|
||||
}
|
||||
|
||||
Class<?> goalSelectorClass = ReflectionUtils.getNMSClass("PathfinderGoalSelector", false);
|
||||
if (target) { //Target Selector
|
||||
Iterator<?> targets = ((List<?>) ReflectionUtils.getField("b", goalSelectorClass, targetSelector)).iterator();
|
||||
while (targets.hasNext()) {
|
||||
Object o = targets.next();
|
||||
if (ReflectionUtils.getField("a", o.getClass(), o).getClass() == toRemove) {
|
||||
targets.remove();
|
||||
}
|
||||
}
|
||||
} else { //Goal Selector
|
||||
Iterator<?> goals = ((List<?>) ReflectionUtils.getField("b", goalSelectorClass, goalSelector)).iterator();
|
||||
while (goals.hasNext()) {
|
||||
Object o = goals.next();
|
||||
if (ReflectionUtils.getField("a", o.getClass(), o).getClass() == toRemove) {
|
||||
goals.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
package me.TheBukor.SkStuff.effects;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.entity.Blaze;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.Ghast;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Rabbit;
|
||||
import org.bukkit.entity.Spider;
|
||||
import org.bukkit.event.Event;
|
||||
|
||||
import ch.njol.skript.lang.Effect;
|
||||
import ch.njol.skript.lang.Expression;
|
||||
import ch.njol.skript.lang.SkriptParser.ParseResult;
|
||||
import ch.njol.util.Kleenean;
|
||||
import me.TheBukor.SkStuff.SkStuff;
|
||||
import me.TheBukor.SkStuff.util.ReflectionUtils;
|
||||
|
||||
public class EffRemovePathGoal extends Effect {
|
||||
private Expression<LivingEntity> entity;
|
||||
|
||||
private int mark;
|
||||
|
||||
private Class<?> entInsent = ReflectionUtils.getNMSClass("EntityInsentient");
|
||||
private Class<?> craftLivEnt = ReflectionUtils.getOBCClass("entity.CraftLivingEntity");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
mark = result.mark;
|
||||
entity = (Expression<LivingEntity>) expr[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "remove pathfinder goal from " + entity.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(Event e) {
|
||||
LivingEntity ent = entity.getSingle(e);
|
||||
if (ent instanceof Player || ent == null)
|
||||
return;
|
||||
Object obcEnt = craftLivEnt.cast(ent);
|
||||
try {
|
||||
Object nmsEnt = entInsent.cast(obcEnt.getClass().getMethod("getHandle").invoke(obcEnt));
|
||||
Class<?> toRemove = null;
|
||||
boolean target = false;
|
||||
boolean resetGoalTarget = false;
|
||||
if (mark == 0) {
|
||||
if (ent instanceof Rabbit) {
|
||||
Class<?> goalRabbitAvoid = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitAvoidTarget");
|
||||
toRemove = goalRabbitAvoid;
|
||||
} else {
|
||||
Class<?> goalAvoid = ReflectionUtils.getNMSClass("PathfinderGoalAvoidTarget");
|
||||
toRemove = goalAvoid;
|
||||
}
|
||||
} else if (mark == 1) {
|
||||
Class<?> goalBreakDoor = ReflectionUtils.getNMSClass("PathfinderGoalBreakDoor");
|
||||
toRemove = goalBreakDoor;
|
||||
} else if (mark == 2) {
|
||||
Class<?> goalBreed = ReflectionUtils.getNMSClass("PathfinderGoalBreed");
|
||||
toRemove = goalBreed;
|
||||
} else if (mark == 3) {
|
||||
Class<?> goalEatGrass = ReflectionUtils.getNMSClass("PathfinderGoalEatTile");
|
||||
toRemove = goalEatGrass;
|
||||
} else if (mark == 4) {
|
||||
Class<?> goalFleeSun = ReflectionUtils.getNMSClass("PathfinderGoalFleeSun");
|
||||
toRemove = goalFleeSun;
|
||||
} else if (mark == 5) {
|
||||
Class<?> goalFloat = ReflectionUtils.getNMSClass("PathfinderGoalFloat");
|
||||
toRemove = goalFloat;
|
||||
} else if (mark == 6) {
|
||||
Class<?> goalFollowOwner = ReflectionUtils.getNMSClass("PathfinderGoalFollowOwner");
|
||||
toRemove = goalFollowOwner;
|
||||
} else if (mark == 7) {
|
||||
Class<?> goalFollowAdults = ReflectionUtils.getNMSClass("PathfinderGoalFollowParent");
|
||||
toRemove = goalFollowAdults;
|
||||
} else if (mark == 8) {
|
||||
target = true;
|
||||
Class<?> goalReactAttack = ReflectionUtils.getNMSClass("PathfinderGoalHurtByTarget");
|
||||
toRemove = goalReactAttack;
|
||||
} else if (mark == 9) {
|
||||
Class<?> goalJumpOnBlock = ReflectionUtils.getNMSClass("PathfinderGoalJumpOnBlock");
|
||||
toRemove = goalJumpOnBlock;
|
||||
} else if (mark == 10) {
|
||||
Class<?> goalLeapTarget = ReflectionUtils.getNMSClass("PathfinderGoalLeapAtTarget");
|
||||
toRemove = goalLeapTarget;
|
||||
} else if (mark == 11) {
|
||||
Class<?> goalLookEntities = ReflectionUtils.getNMSClass("PathfinderGoalLookAtPlayer");
|
||||
toRemove = goalLookEntities;
|
||||
} else if (mark == 12) {
|
||||
if (ent instanceof Spider) {
|
||||
Class<?> goalSpiderMelee = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderMeleeAttack");
|
||||
toRemove = goalSpiderMelee;
|
||||
} else {
|
||||
Class<?> goalMeleeAttack = ReflectionUtils.getNMSClass("PathfinderGoalMeleeAttack");
|
||||
toRemove = goalMeleeAttack;
|
||||
}
|
||||
} else if (mark == 13) {
|
||||
if (ent instanceof Ghast) {
|
||||
Class<?> goalGhastGotoTarget = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalMoveTowardsTarget");
|
||||
toRemove = goalGhastGotoTarget;
|
||||
} else {
|
||||
Class<?> goalGotoTarget = ReflectionUtils.getNMSClass("PathfinderGoalMoveTowardsTarget");
|
||||
toRemove = goalGotoTarget;
|
||||
}
|
||||
} else if (mark == 14) {
|
||||
target = true;
|
||||
if (ent instanceof Spider) {
|
||||
Class<?> goalSpiderNearTarget = ReflectionUtils.getNMSClass("EntitySpider$PathfinderGoalSpiderNearestAttackableTarget");
|
||||
toRemove = goalSpiderNearTarget;
|
||||
} else {
|
||||
Class<?> goalNearTarget = ReflectionUtils.getNMSClass("PathfinderGoalNearestAttackableTarget");
|
||||
toRemove = goalNearTarget;
|
||||
}
|
||||
} else if (mark == 15) {
|
||||
Class<?> goalOcelotAttack = ReflectionUtils.getNMSClass("PathfinderGoalOcelotAttack");
|
||||
toRemove = goalOcelotAttack;
|
||||
} else if (mark == 16) {
|
||||
Class<?> goalOpenDoors = ReflectionUtils.getNMSClass("PathfinderGoalOpenDoor");
|
||||
toRemove = goalOpenDoors;
|
||||
} else if (mark == 17) {
|
||||
if (ent instanceof Rabbit) {
|
||||
Class<?> goalRabbitPanic = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalRabbitPanic");
|
||||
toRemove = goalRabbitPanic;
|
||||
} else {
|
||||
Class<?> goalPanic = ReflectionUtils.getNMSClass("PathfinderGoalPanic");
|
||||
toRemove = goalPanic;
|
||||
}
|
||||
} else if (mark == 18) {
|
||||
Class<?> goalRandomLook = ReflectionUtils.getNMSClass("PathfinderGoalRandomLookaround");
|
||||
toRemove = goalRandomLook;
|
||||
} else if (mark == 19) {
|
||||
Class<?> goalWander = ReflectionUtils.getNMSClass("PathfinderGoalRandomStroll");
|
||||
toRemove = goalWander;
|
||||
} else if (mark == 20) {
|
||||
Class<?> goalSit = ReflectionUtils.getNMSClass("PathfinderGoalSit");
|
||||
toRemove = goalSit;
|
||||
} else if (mark == 21) {
|
||||
Class<?> goalSwell = ReflectionUtils.getNMSClass("PathfinderGoalSwell");
|
||||
toRemove = goalSwell;
|
||||
} else if (mark == 22) {
|
||||
Class<?> goalSquid = ReflectionUtils.getNMSClass("EntitySquid$PathfinderGoalSquid");
|
||||
toRemove = goalSquid;
|
||||
} else if (mark == 23) {
|
||||
resetGoalTarget = true;
|
||||
if (ent instanceof Blaze) {
|
||||
Class<?> goalBlazeFireball = ReflectionUtils.getNMSClass("EntityBlaze$PathfinderGoalBlazeFireball");
|
||||
toRemove = goalBlazeFireball;
|
||||
} else if (ent instanceof Ghast) {
|
||||
Class<?> goalGhastFireball = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastAttackTarget");
|
||||
toRemove = goalGhastFireball;
|
||||
}
|
||||
} else if (mark == 24) {
|
||||
Class<?> goalHideInBlock = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishHideInBlock");
|
||||
toRemove = goalHideInBlock;
|
||||
} else if (mark == 25) {
|
||||
Class<?> goalWakeSilverfish = ReflectionUtils.getNMSClass("EntitySilverfish$PathfinderGoalSilverfishWakeOthers");
|
||||
toRemove = goalWakeSilverfish;
|
||||
} else if (mark == 26) {
|
||||
Class<?> goalPickBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPickupBlock");
|
||||
toRemove = goalPickBlocks;
|
||||
} else if (mark == 27) {
|
||||
Class<?> goalPlaceBlocks = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalEndermanPlaceBlock");
|
||||
toRemove = goalPlaceBlocks;
|
||||
} else if (mark == 28) {
|
||||
target = true;
|
||||
Class<?> goalAttackLooker = ReflectionUtils.getNMSClass("EntityEnderman$PathfinderGoalPlayerWhoLookedAtTarget");
|
||||
toRemove = goalAttackLooker;
|
||||
} else if (mark == 29) {
|
||||
Class<?> goalGhastMoveTarget = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastMoveTowardsTarget");
|
||||
toRemove = goalGhastMoveTarget;
|
||||
} else if (mark == 30) {
|
||||
Class<?> goalGhastIdleMove = ReflectionUtils.getNMSClass("EntityGhast$PathfinderGoalGhastIdleMove");
|
||||
toRemove = goalGhastIdleMove;
|
||||
} else if (mark == 31) {
|
||||
Class<?> goalTempt = ReflectionUtils.getNMSClass("PathfinderGoalTempt");
|
||||
toRemove = goalTempt;
|
||||
} else if (mark == 32) {
|
||||
target = true;
|
||||
Class<?> goalTargetNonTamed = ReflectionUtils.getNMSClass("PathfinderGoalRandomTargetNonTamed");
|
||||
toRemove = goalTargetNonTamed;
|
||||
} else if (mark == 33) {
|
||||
resetGoalTarget = true;
|
||||
Class<?> goalGuardianAttack = ReflectionUtils.getNMSClass("EntityGuardian$PathfinderGoalGuardianAttack");
|
||||
toRemove = goalGuardianAttack;
|
||||
} else if (mark == 34) {
|
||||
target = true;
|
||||
Class<?> goalAnger = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAnger");
|
||||
toRemove = goalAnger;
|
||||
} else if (mark == 35) {
|
||||
target = true;
|
||||
Class<?> goalAngerOther = ReflectionUtils.getNMSClass("EntityPigZombie$PathfinderGoalAngerOther");
|
||||
toRemove = goalAngerOther;
|
||||
} else if (mark == 36) {
|
||||
Class<?> goalEatCarrots = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalEatCarrots");
|
||||
toRemove = goalEatCarrots;
|
||||
} else if (mark == 37) {
|
||||
Class<?> goalRabbitAttack = ReflectionUtils.getNMSClass("EntityRabbit$PathfinderGoalKillerRabbitMeleeAttack");
|
||||
toRemove = goalRabbitAttack;
|
||||
} else if (mark == 38) {
|
||||
Class<?> goalJump = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomJump");
|
||||
toRemove = goalJump;
|
||||
} else if (mark == 39) {
|
||||
Class<?> goalRandomDir = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeRandomDirection");
|
||||
toRemove = goalRandomDir;
|
||||
} else if (mark == 40) {
|
||||
Class<?> goalSlimeWander = ReflectionUtils.getNMSClass("EntitySlime$PathfinderGoalSlimeIdle");
|
||||
toRemove = goalSlimeWander;
|
||||
}
|
||||
if (toRemove == null)
|
||||
return;
|
||||
|
||||
/* "Hey, why are you setting the entity's target to null?!"
|
||||
*
|
||||
* For some goals (Blaze/Ghast fireball and Guardian attack), if you remove the goal while the entity is attacking, it will not stop attacking imediatelly, it will keep attacking its target.
|
||||
* So there's a "bug" with this behavior, as soon as the entity's target resets (null, A.K.A <none>) the server crashes. Because we messed with the entity's "attack target" goal, the game
|
||||
* still thinks it needs to get the target's location for some reason, and since the target is null... It throws an unhandled NPE (it never happens in Vanilla behavior), crashing the server.
|
||||
* So I'm just setting the target to null before removing the goal, so it stops attacking properly, and also prevents the said crash.
|
||||
*/
|
||||
|
||||
if (resetGoalTarget) {
|
||||
((Creature) entity.getSingle(e)).setTarget(null);
|
||||
}
|
||||
|
||||
SkStuff.getNMSMethods().removePathfinderGoal(nmsEnt, toRemove, target);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,163 +1,163 @@
|
||||
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", false);
|
||||
private Class<?> endermanClass = ReflectionUtils.getNMSClass("EntityEnderman", false);
|
||||
private Class<?> nmsIBlockData = ReflectionUtils.getNMSClass("IBlockData", false);
|
||||
private Class<?> nmsItemClass = ReflectionUtils.getNMSClass("ItemStack", false);
|
||||
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;
|
||||
}
|
||||
}
|
||||
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,85 +1,86 @@
|
||||
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", false);
|
||||
|
||||
@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 (mode == ChangeMode.ADD) {
|
||||
Object 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;
|
||||
}
|
||||
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 (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,55 +1,56 @@
|
||||
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 = SkStuff.getNMSMethods().parseRawNBT(newTags);
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT(item, parsedNBT);
|
||||
return new ItemStack[] { newItem };
|
||||
}
|
||||
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,77 +1,69 @@
|
||||
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<?> nbtListClass = ReflectionUtils.getNMSClass("NBTTagList", false);
|
||||
//private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound", false);
|
||||
|
||||
@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 false;
|
||||
}
|
||||
|
||||
@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);
|
||||
SkStuff.getNMSMethods().getContents(list);
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
@Override
|
||||
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
|
||||
Object list = nbtList.getSingle(e);
|
||||
if (mode == ChangeMode.ADD) {
|
||||
if (!(delta[0] instanceof Number || delta[0] instanceof String || nbtListClass.isAssignableFrom(delta[0].getClass()) || nbtClass.isAssignableFrom(delta[0].getClass())))
|
||||
return; //NBT can only store numbers, strings, lists or compounds.
|
||||
SkStuff.getNMSMethods().addToList(list, delta[0]);
|
||||
} else if (mode == ChangeMode.REMOVE) {
|
||||
// TODO A method to remove a specific object from a NBT List
|
||||
} else if (mode == ChangeMode.REMOVE_ALL) {
|
||||
// TODO A method to remove all objects of some type from a NBT List
|
||||
}
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
*/
|
||||
}
|
||||
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 (!(delta[0] instanceof Number || delta[0] instanceof String || nbtBaseClass.isAssignableFrom(delta[0].getClass())))
|
||||
return; //NBT can only store numbers, strings, lists or compounds.
|
||||
SkStuff.getNMSMethods().addToList(list, delta[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@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,77 +1,76 @@
|
||||
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", false);
|
||||
|
||||
@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];
|
||||
index = (Expression<Number>) expr[1];
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "NBT list" + nbtList.toString(e, debug) + " index " + index.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
protected Object[] get(Event e) {
|
||||
int i = index.getSingle(e).intValue();
|
||||
Object list = nbtList.getSingle(e);
|
||||
SkStuff.getNMSMethods().getIndex(list, i);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int i = index.getSingle(e).intValue();
|
||||
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;
|
||||
}
|
||||
}
|
||||
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 false;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean arg2, ParseResult result) {
|
||||
nbtList = (Expression<Object>) expr[0];
|
||||
index = (Expression<Number>) expr[1];
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(@Nullable Event e, boolean debug) {
|
||||
return "NBT list" + nbtList.toString(e, debug) + " index " + index.toString(e, debug);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
protected Object[] get(Event e) {
|
||||
int i = index.getSingle(e).intValue();
|
||||
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();
|
||||
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,145 +1,156 @@
|
||||
package me.TheBukor.SkStuff.expressions;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import ch.njol.skript.ScriptLoader;
|
||||
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", false);
|
||||
|
||||
@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();
|
||||
Class<? extends Event>[] evts = ScriptLoader.getCurrentEvents();
|
||||
for (int i = 0; i < evts.length; i++) {
|
||||
Bukkit.broadcastMessage("Event #" + i + ": \u00A7b" + evts[i].getSimpleName());
|
||||
}
|
||||
Bukkit.broadcastMessage("Object type: \u00A79" + type.getSimpleName());
|
||||
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) };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(Event e, Object[] delta, ChangeMode mode) {
|
||||
Object tar = target.getSingle(e);
|
||||
if (tar instanceof Entity) {
|
||||
Object entNBT = SkStuff.getNMSMethods().getEntityNBT((Entity) tar);
|
||||
if (mode == ChangeMode.ADD) {
|
||||
Object parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]);
|
||||
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) {
|
||||
Object parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]);
|
||||
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) {
|
||||
Object itemNBT = SkStuff.getNMSMethods().getItemNBT((ItemStack) tar);
|
||||
if (mode == ChangeMode.ADD) {
|
||||
Object parsedNBT = SkStuff.getNMSMethods().parseRawNBT((String) delta[0]);
|
||||
SkStuff.getNMSMethods().addToCompound(itemNBT, parsedNBT);
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT((ItemStack) tar, itemNBT);
|
||||
Object slot = target.getSource().getSingle(e);
|
||||
if (slot instanceof Slot) {
|
||||
((Slot) slot).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((ItemStack) tar, itemNBT);
|
||||
Object slot = target.getSource().getSingle(e);
|
||||
if (slot instanceof Slot) {
|
||||
((Slot) slot).setItem(newItem);
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT((ItemStack) tar, null);
|
||||
Object slot = target.getSource().getSingle(e);
|
||||
if (slot instanceof Slot) {
|
||||
((Slot) slot).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;
|
||||
}
|
||||
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) {
|
||||
Object itemNBT = SkStuff.getNMSMethods().getItemNBT((ItemStack) tar);
|
||||
if (mode == ChangeMode.ADD) {
|
||||
SkStuff.getNMSMethods().addToCompound(itemNBT, parsedNBT);
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT((ItemStack) tar, itemNBT);
|
||||
Object slot = target.getSource().getSingle(e);
|
||||
if (slot instanceof Slot) {
|
||||
((Slot) slot).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((ItemStack) tar, itemNBT);
|
||||
Object slot = target.getSource().getSingle(e);
|
||||
if (slot instanceof Slot) {
|
||||
((Slot) slot).setItem(newItem);
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT((ItemStack) tar, null);
|
||||
Object slot = target.getSource().getSingle(e);
|
||||
if (slot instanceof Slot) {
|
||||
((Slot) slot).setItem(newItem);
|
||||
}
|
||||
}
|
||||
} else if (tar instanceof Slot) {
|
||||
Object itemNBT = SkStuff.getNMSMethods().getItemNBT(((Slot) tar).getItem());
|
||||
if (mode == ChangeMode.ADD) {
|
||||
SkStuff.getNMSMethods().addToCompound(itemNBT, parsedNBT);
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT((ItemStack) tar, 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((ItemStack) tar, itemNBT);
|
||||
((Slot) tar).setItem(newItem);
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
ItemStack newItem = SkStuff.getNMSMethods().getItemWithNBT((ItemStack) tar, 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,194 +1,194 @@
|
||||
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.util.ReflectionUtils;
|
||||
|
||||
public class ExprTagOf extends SimpleExpression<Object> {
|
||||
private Expression<String> string;
|
||||
private Expression<Object> compound;
|
||||
|
||||
private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound", false);
|
||||
private Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase", false);
|
||||
|
||||
@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";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
protected Object[] get(Event e) {
|
||||
Object NBT = compound.getSingle(e);
|
||||
if (NBT == null || NBT.toString().equals("{}")) return null; //The NBT can be empty/inexistant for items ("{}" is an empty compound).
|
||||
String stringTag = string.getSingle(e);
|
||||
Object tag = null;
|
||||
try {
|
||||
tag = nbtClass.getMethod("get", String.class).invoke(NBT, stringTag);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
if (tag == null)
|
||||
return null; //The tag doesn't exist? Return <none>.
|
||||
Byte id = null;
|
||||
try {
|
||||
id = (Byte) tag.getClass().getMethod("getTypeId").invoke(tag);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
try {
|
||||
switch (id) {
|
||||
case 1:
|
||||
return new Byte[] { Byte.valueOf(nbtClass.getMethod("getByte", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 2:
|
||||
return new Short[] { Short.valueOf(nbtClass.getMethod("getShort", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 3:
|
||||
return new Integer[] { Integer.valueOf(nbtClass.getMethod("getInt", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 4:
|
||||
return new Long[] { Long.valueOf(nbtClass.getMethod("getLong", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 5:
|
||||
return new Float[] { Float.valueOf(nbtClass.getMethod("getFloat", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 6:
|
||||
return new Double[] { Double.valueOf(nbtClass.getMethod("getDouble", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
|
||||
break;
|
||||
case 8:
|
||||
return new String[] { nbtClass.getMethod("getString", String.class).invoke(NBT, stringTag).toString() };
|
||||
case 9:
|
||||
int i;
|
||||
Object[] list = new Object[] { new Object() };
|
||||
for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
|
||||
//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
|
||||
list[0] = nbtClass.getMethod("getList", String.class, int.class).invoke(NBT, stringTag, i); //Try to get the list with the ID "loop-number".
|
||||
if (!list[0].toString().equals("[]")) { //If list is not empty.
|
||||
break; //Stop loop.
|
||||
}
|
||||
}
|
||||
return list;
|
||||
/*
|
||||
REMOVED TEMPORARILY, HOPEFULLY THE NEW IMPLEMENTATION SHOULD WORK BETTER
|
||||
int i;
|
||||
Object list = null;
|
||||
for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
|
||||
//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
|
||||
list = nbtClass.getMethod("getList", String.class, int.class).invoke(NBT, stringTag, i); //Try to get the list with the ID "loop-number".
|
||||
if (!list.toString().equals("[]")) { //If list is not empty.
|
||||
break; //Stop loop.
|
||||
}
|
||||
}
|
||||
String methodName = null;
|
||||
switch (NBTUtil.getContentsId(list)) {
|
||||
case 5: //Float
|
||||
methodName = "e"; //list.e(int) = get float from the specified index.
|
||||
break;
|
||||
case 6: //Double
|
||||
methodName = "d"; //list.d(int) = get double from the specified index.
|
||||
break;
|
||||
case 8: //String
|
||||
methodName = "getString"; //Self-explanatory, I guess.
|
||||
break;
|
||||
case 10: //Compound
|
||||
methodName = "get"; //list.get(int) = get compound at the specified index.
|
||||
break;
|
||||
case 11: //Integer array
|
||||
methodName = "c"; //Not sure if ever used, but meh.
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
int listSize = (int) list.getClass().getMethod("size").invoke(list);
|
||||
Object[] tags = new Object[listSize];
|
||||
for (i = 0; i < listSize; i++) {
|
||||
Object gottenTag = list.getClass().getMethod(methodName, int.class).invoke(list, i);
|
||||
tags[i] = gottenTag;
|
||||
}
|
||||
return tags;
|
||||
*/
|
||||
case 10:
|
||||
return new Object[] { nbtClass.getMethod("getCompound", String.class).invoke(NBT, stringTag) };
|
||||
case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
|
||||
return new Object[] { nbtClass.getMethod("getIntArray", String.class).invoke(NBT, stringTag).toString() };
|
||||
default: //This shouldn't happen, but it's better to have this just in case it spills errors everywhere.
|
||||
break;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
|
||||
Object NBT = compound.getSingle(e);
|
||||
if (NBT == null)
|
||||
try {
|
||||
NBT = nbtClass.newInstance(); //If the NBT isn't set, create an empty one
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
String stringTag = string.getSingle(e);
|
||||
if (mode == ChangeMode.SET) {
|
||||
Object newValue = delta[0];
|
||||
try {
|
||||
if (newValue instanceof Byte) {
|
||||
nbtClass.getMethod("setByte", String.class, byte.class).invoke(NBT, stringTag, ((Byte) newValue).byteValue());
|
||||
} else if (newValue instanceof Short) {
|
||||
nbtClass.getMethod("setShort", String.class, short.class).invoke(NBT, stringTag, ((Short) newValue).shortValue());
|
||||
} else if (newValue instanceof Integer) {
|
||||
nbtClass.getMethod("setInt", String.class, int.class).invoke(NBT, stringTag, ((Integer) newValue).intValue());
|
||||
} else if (newValue instanceof Long) {
|
||||
nbtClass.getMethod("setLong", String.class, long.class).invoke(NBT, stringTag, ((Long) newValue).longValue());
|
||||
} else if (newValue instanceof Float) {
|
||||
nbtClass.getMethod("setFloat", String.class, float.class).invoke(NBT, stringTag, ((Float) newValue).floatValue());
|
||||
} else if (newValue instanceof Double) {
|
||||
nbtClass.getMethod("setDouble", String.class, double.class).invoke(NBT, stringTag, ((Double) newValue).doubleValue());
|
||||
} else if (newValue instanceof String) {
|
||||
nbtClass.getMethod("setString", String.class, String.class).invoke(NBT, stringTag, String.valueOf(newValue));
|
||||
} else {
|
||||
return; //Something else like a list or entire compound.
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} else if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
|
||||
try {
|
||||
nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(NBT, stringTag, nbtBaseClass.newInstance());
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Nullable
|
||||
public Class<?>[] acceptChange(ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Object.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
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.util.ReflectionUtils;
|
||||
|
||||
public class ExprTagOf extends SimpleExpression<Object> {
|
||||
private Expression<String> string;
|
||||
private Expression<Object> compound;
|
||||
|
||||
private Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound");
|
||||
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";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
protected Object[] get(Event e) {
|
||||
Object NBT = compound.getSingle(e);
|
||||
if (NBT == null || NBT.toString().equals("{}")) return null; //The NBT can be empty/inexistant for items ("{}" is an empty compound).
|
||||
String stringTag = string.getSingle(e);
|
||||
Object tag = null;
|
||||
try {
|
||||
tag = nbtClass.getMethod("get", String.class).invoke(NBT, stringTag);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
if (tag == null)
|
||||
return null; //The tag doesn't exist? Return <none>.
|
||||
Byte id = null;
|
||||
try {
|
||||
id = (Byte) tag.getClass().getMethod("getTypeId").invoke(tag);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
try {
|
||||
switch (id) {
|
||||
case 1:
|
||||
return new Byte[] { Byte.valueOf(nbtClass.getMethod("getByte", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 2:
|
||||
return new Short[] { Short.valueOf(nbtClass.getMethod("getShort", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 3:
|
||||
return new Integer[] { Integer.valueOf(nbtClass.getMethod("getInt", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 4:
|
||||
return new Long[] { Long.valueOf(nbtClass.getMethod("getLong", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 5:
|
||||
return new Float[] { Float.valueOf(nbtClass.getMethod("getFloat", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 6:
|
||||
return new Double[] { Double.valueOf(nbtClass.getMethod("getDouble", String.class).invoke(NBT, stringTag).toString()) };
|
||||
case 7: //Byte array, only used in chunk files. Also doesn't have support for the MojangsonParser.
|
||||
break;
|
||||
case 8:
|
||||
return new String[] { nbtClass.getMethod("getString", String.class).invoke(NBT, stringTag).toString() };
|
||||
case 9:
|
||||
int i;
|
||||
Object[] list = new Object[] { new Object() };
|
||||
for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
|
||||
//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
|
||||
list[0] = nbtClass.getMethod("getList", String.class, int.class).invoke(NBT, stringTag, i); //Try to get the list with the ID "loop-number".
|
||||
if (!list[0].toString().equals("[]")) { //If list is not empty.
|
||||
break; //Stop loop.
|
||||
}
|
||||
}
|
||||
return list;
|
||||
/*
|
||||
REMOVED TEMPORARILY, HOPEFULLY THE NEW IMPLEMENTATION SHOULD WORK BETTER
|
||||
int i;
|
||||
Object list = null;
|
||||
for (i = 1; i <= 11; i++) { //To get a list I need to know the type of the tags it contains inside,
|
||||
//since I can't predict what type the list will have, I just loop all of the IDs until I find a non-empty list.
|
||||
list = nbtClass.getMethod("getList", String.class, int.class).invoke(NBT, stringTag, i); //Try to get the list with the ID "loop-number".
|
||||
if (!list.toString().equals("[]")) { //If list is not empty.
|
||||
break; //Stop loop.
|
||||
}
|
||||
}
|
||||
String methodName = null;
|
||||
switch (NBTUtil.getContentsId(list)) {
|
||||
case 5: //Float
|
||||
methodName = "e"; //list.e(int) = get float from the specified index.
|
||||
break;
|
||||
case 6: //Double
|
||||
methodName = "d"; //list.d(int) = get double from the specified index.
|
||||
break;
|
||||
case 8: //String
|
||||
methodName = "getString"; //Self-explanatory, I guess.
|
||||
break;
|
||||
case 10: //Compound
|
||||
methodName = "get"; //list.get(int) = get compound at the specified index.
|
||||
break;
|
||||
case 11: //Integer array
|
||||
methodName = "c"; //Not sure if ever used, but meh.
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
int listSize = (int) list.getClass().getMethod("size").invoke(list);
|
||||
Object[] tags = new Object[listSize];
|
||||
for (i = 0; i < listSize; i++) {
|
||||
Object gottenTag = list.getClass().getMethod(methodName, int.class).invoke(list, i);
|
||||
tags[i] = gottenTag;
|
||||
}
|
||||
return tags;
|
||||
*/
|
||||
case 10:
|
||||
return new Object[] { nbtClass.getMethod("getCompound", String.class).invoke(NBT, stringTag) };
|
||||
case 11: //Integer array, this one is only used on the chunk files (and maybe schematic files?).
|
||||
return new Object[] { nbtClass.getMethod("getIntArray", String.class).invoke(NBT, stringTag).toString() };
|
||||
default: //This shouldn't happen, but it's better to have this just in case it spills errors everywhere.
|
||||
break;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
|
||||
Object NBT = compound.getSingle(e);
|
||||
if (NBT == null)
|
||||
try {
|
||||
NBT = nbtClass.newInstance(); //If the NBT isn't set, create an empty one
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
String stringTag = string.getSingle(e);
|
||||
if (mode == ChangeMode.SET) {
|
||||
Object newValue = delta[0];
|
||||
try {
|
||||
if (newValue instanceof Byte) {
|
||||
nbtClass.getMethod("setByte", String.class, byte.class).invoke(NBT, stringTag, ((Byte) newValue).byteValue());
|
||||
} else if (newValue instanceof Short) {
|
||||
nbtClass.getMethod("setShort", String.class, short.class).invoke(NBT, stringTag, ((Short) newValue).shortValue());
|
||||
} else if (newValue instanceof Integer) {
|
||||
nbtClass.getMethod("setInt", String.class, int.class).invoke(NBT, stringTag, ((Integer) newValue).intValue());
|
||||
} else if (newValue instanceof Long) {
|
||||
nbtClass.getMethod("setLong", String.class, long.class).invoke(NBT, stringTag, ((Long) newValue).longValue());
|
||||
} else if (newValue instanceof Float) {
|
||||
nbtClass.getMethod("setFloat", String.class, float.class).invoke(NBT, stringTag, ((Float) newValue).floatValue());
|
||||
} else if (newValue instanceof Double) {
|
||||
nbtClass.getMethod("setDouble", String.class, double.class).invoke(NBT, stringTag, ((Double) newValue).doubleValue());
|
||||
} else if (newValue instanceof String) {
|
||||
nbtClass.getMethod("setString", String.class, String.class).invoke(NBT, stringTag, String.valueOf(newValue));
|
||||
} else {
|
||||
return; //Something else like a list or entire compound.
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} else if (mode == ChangeMode.RESET || mode == ChangeMode.DELETE) {
|
||||
try {
|
||||
nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(NBT, stringTag, nbtBaseClass.newInstance());
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Nullable
|
||||
public Class<?>[] acceptChange(ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Object.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,179 +0,0 @@
|
||||
package me.TheBukor.SkStuff.util;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.fusesource.jansi.Ansi;
|
||||
|
||||
import ch.njol.skript.Skript;
|
||||
|
||||
public class NBTUtil {
|
||||
private static Class<?> nbtBaseClass = ReflectionUtils.getNMSClass("NBTBase", false);
|
||||
private static Class<?> nbtClass = ReflectionUtils.getNMSClass("NBTTagCompound", false);
|
||||
private static Class<?> nbtListClass = ReflectionUtils.getNMSClass("NBTTagList", false);
|
||||
|
||||
/**
|
||||
* This is actually a copy of the "a(NBTTagCompound)" method in the NBTTagCompound class.
|
||||
* I needed to add this because the 1.7 and before versions of the NBTTagCompound class didn't have this method,
|
||||
* so there wasn't actually a reliable way to multiple tags at once into a compound.
|
||||
* For the original code for the method, check https://github.com/linouxis9/mc-dev-1.8.7/blob/master/net/minecraft/server/NBTTagCompound.java#L348
|
||||
*
|
||||
* Please note that I adapted it to work using reflection.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void addCompound(Object NBT, Object toAdd) {
|
||||
if (NBT.getClass() == nbtClass && toAdd.getClass() == nbtClass) {
|
||||
try {
|
||||
HashMap<String, Object> map = (HashMap<String, Object>) ReflectionUtils.getField("map", nbtClass, toAdd);
|
||||
Set<String> keySet = (Set<String>) nbtClass.getMethod("c").invoke(toAdd);
|
||||
Iterator<String> iterator = keySet.iterator();
|
||||
|
||||
while(iterator.hasNext()) {
|
||||
String string = (String) iterator.next();
|
||||
Object base = nbtBaseClass.cast(map.get(string));
|
||||
if((byte) nbtBaseClass.getMethod("getTypeId").invoke(base) == 10) {
|
||||
if((boolean) nbtClass.getMethod("hasKeyOfType", String.class, int.class).invoke(NBT, string, 10)) {
|
||||
Object localNBT = null;
|
||||
localNBT = nbtClass.getMethod("getCompound", String.class).invoke(localNBT, string);
|
||||
NBTUtil.addCompound(localNBT, nbtBaseClass.cast(nbtClass));
|
||||
} else {
|
||||
nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(NBT, string, base.getClass().getMethod("clone").invoke(base));
|
||||
}
|
||||
} else {
|
||||
nbtClass.getMethod("set", String.class, nbtBaseClass).invoke(NBT, string, base.getClass().getMethod("clone").invoke(base));
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the ID of the contents inside a NBT List.
|
||||
* I needed to add this because the 1.7 and before versions of the NBTTagList
|
||||
* class had a different name for the method that got this value.
|
||||
* 1.8 used "f()", while 1.7 used "d()".
|
||||
*/
|
||||
public static int getContentsId(Object list) {
|
||||
if (list.getClass() == nbtListClass) {
|
||||
Field type = null;
|
||||
int result = 0;
|
||||
try {
|
||||
type = nbtListClass.getDeclaredField("type");
|
||||
type.setAccessible(true);
|
||||
result = type.getInt(list);
|
||||
type.setAccessible(false);
|
||||
return result;
|
||||
} catch (Exception ex) {
|
||||
type.setAccessible(false);
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for the "addToList()" and "setIndex()" methods if the typeId of the contents is still not defined.
|
||||
*/
|
||||
public static void setContentsId(Object list, int newId) {
|
||||
if (list.getClass() == nbtListClass) {
|
||||
Field type = null;
|
||||
try {
|
||||
type = nbtListClass.getDeclaredField("type");
|
||||
type.setAccessible(true);
|
||||
type.set(list, newId);
|
||||
type.setAccessible(false);
|
||||
} catch (Exception ex) {
|
||||
type.setAccessible(false);
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static List<Object> getContents(Object list) {
|
||||
if (list.getClass() == nbtListClass) {
|
||||
List<Object> result = null;
|
||||
result = (List<Object>) ReflectionUtils.getField("list", nbtListClass, list);
|
||||
return result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Kind of a copy of the "add()" method from the NBTTagList class.
|
||||
*/
|
||||
public static void addToList(Object list, Object[] toAdd) {
|
||||
if (list.getClass() == nbtListClass && toAdd[0].getClass() == nbtBaseClass) {
|
||||
int listTypeId = NBTUtil.getContentsId(list);
|
||||
int toAddId = 0;
|
||||
try {
|
||||
toAddId = (int) toAdd.getClass().getMethod("getTypeId").invoke(toAdd);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
if (listTypeId == 0) {
|
||||
try {
|
||||
NBTUtil.setContentsId(list, toAddId);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} else if (listTypeId != toAddId) {
|
||||
Skript.warning(Ansi.ansi().fgBright(Ansi.Color.RED) + "Adding mismatching tag types to NBT list" + Ansi.ansi().fgBright(Ansi.Color.DEFAULT));
|
||||
return;
|
||||
}
|
||||
|
||||
for (Object tag : toAdd) {
|
||||
NBTUtil.getContents(list).add(tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void removefromList(Object list, int index) {
|
||||
if (list.getClass() == nbtListClass) {
|
||||
if (index >= 0 && index < NBTUtil.getContents(list).size()) {
|
||||
NBTUtil.getContents(list).remove(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void setIndex(Object list, int index, Object toAdd) {
|
||||
if (list.getClass() == nbtListClass && toAdd.getClass() == nbtBaseClass) {
|
||||
if (index >= 0 && index < NBTUtil.getContents(list).size()) {
|
||||
int listTypeId = NBTUtil.getContentsId(list);
|
||||
int toAddId = 0;
|
||||
try {
|
||||
toAddId = (int) toAdd.getClass().getMethod("getTypeId").invoke(toAdd);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
if (listTypeId == 0) {
|
||||
try {
|
||||
NBTUtil.setContentsId(list, toAddId);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} else if (listTypeId != toAddId) {
|
||||
Skript.warning("Adding mismatching tag types to NBT list");
|
||||
return;
|
||||
}
|
||||
|
||||
NBTUtil.getContents(list).set(index, toAdd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Object getIndex(Object list, int index) {
|
||||
if (list.getClass() == nbtListClass) {
|
||||
if (index >= 0 && index < NBTUtil.getContents(list).size()) {
|
||||
NBTUtil.getContents(list).get(index);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,52 +1,56 @@
|
||||
package me.TheBukor.SkStuff.util;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public interface NMSInterface {
|
||||
|
||||
public void addToCompound(Object compound, Object toAdd);
|
||||
|
||||
public void removeFromCompound(Object compound, String ... toRemove);
|
||||
|
||||
public Object parseRawNBT(String rawNBT);
|
||||
|
||||
public int getContentsId(Object nbtList);
|
||||
|
||||
public Object[] getContents(Object nbtList);
|
||||
|
||||
public void addToList(Object nbtList, Object toAdd);
|
||||
|
||||
public void removeFromList(Object nbtList, int index);
|
||||
|
||||
public void setIndex(Object nbtList, int index, Object toSet);
|
||||
|
||||
public Object getIndex(Object nbtList, int index);
|
||||
|
||||
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector);
|
||||
|
||||
public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector);
|
||||
|
||||
public void registerCompoundClassInfo();
|
||||
|
||||
public void registerNBTListClassInfo();
|
||||
|
||||
public Object getEntityNBT(Entity entity);
|
||||
|
||||
public Object getTileNBT(Block block);
|
||||
|
||||
public Object getItemNBT(ItemStack itemStack);
|
||||
|
||||
public void setEntityNBT(Entity entity, Object newCompound);
|
||||
|
||||
public void setTileNBT(Block block, Object newCompound);
|
||||
|
||||
public ItemStack getItemWithNBT(ItemStack itemStack, Object compound);
|
||||
|
||||
public Object getFileNBT(File file);
|
||||
|
||||
public void setFileNBT(File file, Object newCompound);
|
||||
}
|
||||
package me.TheBukor.SkStuff.util;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public interface NMSInterface {
|
||||
|
||||
public void addToCompound(Object compound, Object toAdd);
|
||||
|
||||
public void removeFromCompound(Object compound, String ... toRemove);
|
||||
|
||||
public Object parseRawNBT(String rawNBT);
|
||||
|
||||
public int getContentsId(Object nbtList);
|
||||
|
||||
public Object[] getContents(Object nbtList);
|
||||
|
||||
public void addToList(Object nbtList, Object toAdd);
|
||||
|
||||
public void removeFromList(Object nbtList, int index);
|
||||
|
||||
public void setIndex(Object nbtList, int index, Object toSet);
|
||||
|
||||
public Object getIndex(Object nbtList, int index);
|
||||
|
||||
public void removePathfinderGoal(Object entity, Class<?> goalClass, boolean isTargetSelector);
|
||||
|
||||
public void addPathfinderGoal(Object entity, int priority, Object goal, boolean isTargetSelector);
|
||||
|
||||
public void registerCompoundClassInfo();
|
||||
|
||||
public void registerNBTListClassInfo();
|
||||
|
||||
public Object getEntityNBT(Entity entity);
|
||||
|
||||
public Object getTileNBT(Block block);
|
||||
|
||||
public Object getItemNBT(ItemStack itemStack);
|
||||
|
||||
public void setEntityNBT(Entity entity, Object newCompound);
|
||||
|
||||
public void setTileNBT(Block block, Object newCompound);
|
||||
|
||||
public ItemStack getItemWithNBT(ItemStack itemStack, Object compound);
|
||||
|
||||
public Object getFileNBT(File file);
|
||||
|
||||
public void setFileNBT(File file, Object newCompound);
|
||||
|
||||
public Object convertToNBT(Number number);
|
||||
|
||||
public Object convertToNBT(String string);
|
||||
}
|
||||
|
@ -1,444 +1,498 @@
|
||||
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.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
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.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.lang.ParseContext;
|
||||
import ch.njol.skript.registrations.Classes;
|
||||
import ch.njol.util.coll.CollectionUtils;
|
||||
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.NBTTagCompound;
|
||||
import net.minecraft.server.v1_7_R4.NBTTagDouble;
|
||||
import net.minecraft.server.v1_7_R4.NBTTagEnd;
|
||||
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.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 {
|
||||
|
||||
@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) {
|
||||
((NBTTagCompound) compound).remove(toRemove.toString()); //FIXME
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object parseRawNBT(String rawNBT) {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
parsedNBT = (NBTTagCompound) MojangsonParser.parse(rawNBT);
|
||||
return parsedNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).d();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getContents(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
List<Object> contents = new ArrayList<Object>();
|
||||
for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
|
||||
if (getIndex(nbtList, i) != null) {
|
||||
contents.add(getIndex(nbtList, i));
|
||||
}
|
||||
}
|
||||
return contents.toArray();
|
||||
}
|
||||
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 && toSet instanceof NBTBase && index >= 0 && index < ((NBTTagList) nbtList).size()) {
|
||||
int typeId = getContentsId(nbtList);
|
||||
int toSetId = ((NBTBase) toSet).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 = null;
|
||||
actualList = (List<Object>) ReflectionUtils.getField("list", NBTTagList.class, nbtList);
|
||||
actualList.set(index, toSet);
|
||||
}
|
||||
}
|
||||
|
||||
@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);
|
||||
if (value instanceof NBTTagEnd)
|
||||
return null;
|
||||
else
|
||||
return value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = (NBTTagCompound) parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (delta[0] instanceof String) {
|
||||
NBTTagCompound parsedNBT = (NBTTagCompound) 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("}")) {
|
||||
rawNBT.substring(4);
|
||||
NBTTagCompound NBT = (NBTTagCompound) parseRawNBT(rawNBT);
|
||||
if (NBT.toString().equals("{}")) {
|
||||
return null;
|
||||
}
|
||||
return NBT;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagCompound compound, int arg1) {
|
||||
return compound.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagCompound compound) {
|
||||
return "nbt:" + compound.toString();
|
||||
}
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 11;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (typeId == 5) {
|
||||
NBTTagFloat floatTag = new NBTTagFloat((float) delta[0]);
|
||||
addToList(nbtList[0], floatTag);
|
||||
} else if (typeId == 6) {
|
||||
NBTTagDouble doubleTag = new NBTTagDouble((double) delta[0]);
|
||||
addToList(nbtList[0], doubleTag);
|
||||
} else if (typeId == 8) {
|
||||
NBTTagString stringTag = new NBTTagString((String) delta [0]);
|
||||
addToList(nbtList[0], stringTag);
|
||||
} else if (typeId == 10) {
|
||||
addToList(nbtList[0], delta[0]);
|
||||
} else if (typeId == 11) {
|
||||
NBTTagInt intTag = new NBTTagInt((int) delta[0]);
|
||||
addToList(nbtList[0], intTag);
|
||||
}
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String ignored, ParseContext context) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagList nbtList, int arg1) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagList nbtList) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object 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 Object 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 Object getItemNBT(ItemStack itemStack) {
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound NBT = new NBTTagCompound();
|
||||
net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
NBT = nmsItem.getTag();
|
||||
if (NBT == null || NBT.toString().equals("{}")) //Null or empty.
|
||||
return null;
|
||||
return new Object[] { NBT };
|
||||
}
|
||||
|
||||
@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) {
|
||||
if (compound instanceof NBTTagCompound) {
|
||||
if (itemStack.getType() == Material.AIR || itemStack == null)
|
||||
return null;
|
||||
if (compound == null || compound.toString().equals("{}"))
|
||||
return itemStack;
|
||||
net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
nmsItem.setTag((NBTTagCompound) compound);
|
||||
ItemStack newItem = CraftItemStack.asCraftMirror(nmsItem);
|
||||
return newItem;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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.OutputStream;
|
||||
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.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.lang.ParseContext;
|
||||
import ch.njol.skript.registrations.Classes;
|
||||
import ch.njol.util.coll.CollectionUtils;
|
||||
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.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.NBTTagString;
|
||||
import net.minecraft.server.v1_7_R4.TileEntity;
|
||||
import net.minecraft.server.v1_7_R4.World;
|
||||
import net.minecraft.server.v1_8_R3.NBTTagByte;
|
||||
import net.minecraft.server.v1_8_R3.NBTTagLong;
|
||||
import net.minecraft.server.v1_8_R3.NBTTagShort;
|
||||
|
||||
public class NMS_v1_7_R4 implements NMSInterface {
|
||||
|
||||
@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 int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).d();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@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 = getContentsId(nbtList);
|
||||
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 = null;
|
||||
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 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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else 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("}")) {
|
||||
rawNBT.substring(4);
|
||||
NBTTagCompound NBT = parseRawNBT(rawNBT);
|
||||
if (NBT.toString().equals("{}")) {
|
||||
return null;
|
||||
}
|
||||
return NBT;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagCompound compound, int arg1) {
|
||||
return compound.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagCompound compound) {
|
||||
return "nbt:" + compound.toString();
|
||||
}
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 11;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (typeId == 5) {
|
||||
NBTTagFloat floatTag = new NBTTagFloat((float) delta[0]);
|
||||
addToList(nbtList[0], floatTag);
|
||||
} else if (typeId == 6) {
|
||||
NBTTagDouble doubleTag = new NBTTagDouble((double) delta[0]);
|
||||
addToList(nbtList[0], doubleTag);
|
||||
} else if (typeId == 8) {
|
||||
NBTTagString stringTag = new NBTTagString((String) delta [0]);
|
||||
addToList(nbtList[0], stringTag);
|
||||
} else if (typeId == 10) {
|
||||
addToList(nbtList[0], delta[0]);
|
||||
} else if (typeId == 11) {
|
||||
NBTTagInt intTag = new NBTTagInt((int) delta[0]);
|
||||
addToList(nbtList[0], intTag);
|
||||
}
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String ignored, ParseContext context) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagList nbtList, int arg1) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagList nbtList) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@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.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound NBT = new NBTTagCompound();
|
||||
net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
NBT = nmsItem.getTag();
|
||||
if (NBT == null || NBT.toString().equals("{}")) //Null or empty.
|
||||
return null;
|
||||
return NBT;
|
||||
}
|
||||
|
||||
@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) {
|
||||
if (compound instanceof NBTTagCompound) {
|
||||
if (itemStack.getType() == Material.AIR || itemStack == null)
|
||||
return null;
|
||||
if (compound == null || compound.toString().equals("{}"))
|
||||
return itemStack;
|
||||
net.minecraft.server.v1_7_R4.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
nmsItem.setTag((NBTTagCompound) compound);
|
||||
ItemStack newItem = CraftItemStack.asCraftMirror(nmsItem);
|
||||
return newItem;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public NBTTagByte convertToNBT(byte b) {
|
||||
return new NBTTagByte(b);
|
||||
}
|
||||
|
||||
public NBTTagShort convertToNBT(short s) {
|
||||
return new NBTTagShort(s);
|
||||
}
|
||||
|
||||
public NBTTagInt convertToNBT(int i) {
|
||||
return new NBTTagInt(i);
|
||||
}
|
||||
|
||||
public NBTTagLong convertToNBT(long l) {
|
||||
return new NBTTagLong(l);
|
||||
}
|
||||
|
||||
public NBTTagFloat convertToNBT(float f) {
|
||||
return new NBTTagFloat(f);
|
||||
}
|
||||
|
||||
public NBTTagDouble convertToNBT(double d) {
|
||||
return new NBTTagDouble(d);
|
||||
}
|
||||
|
||||
public NBTTagString convertToNBT(String string) {
|
||||
return new NBTTagString(string);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertToNBT(Number number) {
|
||||
if (number instanceof Byte)
|
||||
return convertToNBT((byte) number);
|
||||
else if (number instanceof Short)
|
||||
return convertToNBT((short) number);
|
||||
else if (number instanceof Integer)
|
||||
return convertToNBT((int) number);
|
||||
else if (number instanceof Long)
|
||||
return convertToNBT((long) number);
|
||||
else if (number instanceof Float)
|
||||
return convertToNBT((float) number);
|
||||
else if (number instanceof Double)
|
||||
return convertToNBT((double) number);
|
||||
return number;
|
||||
}
|
||||
}
|
@ -1,434 +1,554 @@
|
||||
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.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.craftbukkit.v1_8_R1.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import ch.njol.skript.classes.Changer;
|
||||
import ch.njol.skript.classes.ClassInfo;
|
||||
import ch.njol.skript.classes.Parser;
|
||||
import ch.njol.skript.lang.ParseContext;
|
||||
import ch.njol.skript.registrations.Classes;
|
||||
import ch.njol.util.coll.CollectionUtils;
|
||||
import net.minecraft.server.v1_8_R1.BlockPosition;
|
||||
import net.minecraft.server.v1_8_R1.EntityInsentient;
|
||||
import net.minecraft.server.v1_8_R1.MojangsonParser;
|
||||
import net.minecraft.server.v1_8_R1.NBTBase;
|
||||
import net.minecraft.server.v1_8_R1.NBTCompressedStreamTools;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagCompound;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagDouble;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagEnd;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagFloat;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagInt;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagList;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagString;
|
||||
import net.minecraft.server.v1_8_R1.PathfinderGoal;
|
||||
import net.minecraft.server.v1_8_R1.PathfinderGoalSelector;
|
||||
import net.minecraft.server.v1_8_R1.TileEntity;
|
||||
import net.minecraft.server.v1_8_R1.World;
|
||||
|
||||
public class NMS_v1_8_R1 implements NMSInterface {
|
||||
|
||||
@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) {
|
||||
((NBTTagCompound) compound).remove(toRemove.toString()); //FIXME
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object parseRawNBT(String rawNBT) {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
parsedNBT = MojangsonParser.parse(rawNBT);
|
||||
return parsedNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).f();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getContents(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
List<Object> contents = new ArrayList<Object>();
|
||||
for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
|
||||
if (getIndex(nbtList, i) != null) {
|
||||
contents.add(getIndex(nbtList, i));
|
||||
}
|
||||
}
|
||||
return contents.toArray();
|
||||
}
|
||||
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) {
|
||||
((NBTTagList) nbtList).a(index);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIndex(Object nbtList, int index, Object toSet) {
|
||||
if (nbtList instanceof NBTTagList && toSet instanceof NBTBase) {
|
||||
((NBTTagList) nbtList).a(index, (NBTBase) toSet);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getIndex(Object nbtList, int index) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
NBTBase value = ((NBTTagList) nbtList).g(index);
|
||||
if (value instanceof NBTTagEnd)
|
||||
return null;
|
||||
else
|
||||
return value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = (NBTTagCompound) parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (delta[0] instanceof String) {
|
||||
NBTTagCompound parsedNBT = (NBTTagCompound) 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("}")) {
|
||||
rawNBT.substring(4);
|
||||
rawNBT.substring(4);
|
||||
NBTTagCompound NBT = (NBTTagCompound) parseRawNBT(rawNBT);
|
||||
if (NBT.toString().equals("{}")) {
|
||||
return null;
|
||||
}
|
||||
return NBT;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagCompound compound, int arg1) {
|
||||
return compound.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagCompound compound) {
|
||||
return "nbt:" + compound.toString();
|
||||
}
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 11;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (typeId == 5) {
|
||||
NBTTagFloat floatTag = new NBTTagFloat((float) delta[0]);
|
||||
addToList(nbtList[0], floatTag);
|
||||
} else if (typeId == 6) {
|
||||
NBTTagDouble doubleTag = new NBTTagDouble((double) delta[0]);
|
||||
addToList(nbtList[0], doubleTag);
|
||||
} else if (typeId == 8) {
|
||||
NBTTagString stringTag = new NBTTagString((String) delta [0]);
|
||||
addToList(nbtList[0], stringTag);
|
||||
} else if (typeId == 10) {
|
||||
addToList(nbtList[0], delta[0]);
|
||||
} else if (typeId == 11) {
|
||||
NBTTagInt intTag = new NBTTagInt((int) delta[0]);
|
||||
addToList(nbtList[0], intTag);
|
||||
}
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String ignored, ParseContext context) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagList nbtList, int arg1) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagList nbtList) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getEntityNBT(Entity entity) {
|
||||
net.minecraft.server.v1_8_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
|
||||
NBTTagCompound NBT = new NBTTagCompound();
|
||||
nmsEntity.e(NBT);
|
||||
return NBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object 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 Object getItemNBT(ItemStack itemStack) {
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound NBT = new NBTTagCompound();
|
||||
net.minecraft.server.v1_8_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
NBT = nmsItem.getTag();
|
||||
if (NBT == null || NBT.toString().equals("{}")) //Null or empty.
|
||||
return null;
|
||||
return new Object[] { NBT };
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntityNBT(Entity entity, Object newCompound) {
|
||||
if (newCompound instanceof NBTTagCompound) {
|
||||
net.minecraft.server.v1_8_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();
|
||||
nmsWorld.notify(tileEntity.getPosition());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
|
||||
if (compound instanceof NBTTagCompound) {
|
||||
if (itemStack.getType() == Material.AIR || itemStack == null)
|
||||
return null;
|
||||
if (compound == null || compound.toString().equals("{}"))
|
||||
return itemStack;
|
||||
net.minecraft.server.v1_8_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
nmsItem.setTag((NBTTagCompound) compound);
|
||||
ItemStack newItem = CraftItemStack.asCraftMirror(nmsItem);
|
||||
return newItem;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.craftbukkit.v1_8_R1.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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_R1.BlockPosition;
|
||||
import net.minecraft.server.v1_8_R1.EntityInsentient;
|
||||
import net.minecraft.server.v1_8_R1.MojangsonParser;
|
||||
import net.minecraft.server.v1_8_R1.NBTBase;
|
||||
import net.minecraft.server.v1_8_R1.NBTCompressedStreamTools;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagByte;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagCompound;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagDouble;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagFloat;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagInt;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagList;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagLong;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagShort;
|
||||
import net.minecraft.server.v1_8_R1.NBTTagString;
|
||||
import net.minecraft.server.v1_8_R1.PathfinderGoal;
|
||||
import net.minecraft.server.v1_8_R1.PathfinderGoalSelector;
|
||||
import net.minecraft.server.v1_8_R1.TileEntity;
|
||||
import net.minecraft.server.v1_8_R1.World;
|
||||
|
||||
public class NMS_v1_8_R1 implements NMSInterface {
|
||||
|
||||
@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;
|
||||
parsedNBT = MojangsonParser.parse(rawNBT);
|
||||
return parsedNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).f();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@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 NBTTagList || value instanceof NBTTagCompound) {
|
||||
return value; //No need to convert anything, these are registered by the addon.
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
parsedNBT = parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (delta[0] instanceof String) {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
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 = null;
|
||||
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 "nbt:" + 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 s = fields.getObject("asString", String.class);
|
||||
NBTTagCompound compound = null;
|
||||
compound = parseRawNBT(s);
|
||||
return compound;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagCompound deserialize(String s) {
|
||||
NBTTagCompound compound = null;
|
||||
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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Byte[]) {
|
||||
typeId = 1;
|
||||
} else if (delta instanceof Short[]) {
|
||||
typeId = 2;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 3;
|
||||
} else if (delta instanceof Long[]) {
|
||||
typeId = 4;
|
||||
} else if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (delta[0] instanceof Number)
|
||||
addToList(nbtList, convertToNBT((Number) delta[0]));
|
||||
else if (delta[0] instanceof String)
|
||||
addToList(nbtList, convertToNBT((String) delta[0]));
|
||||
else if (delta[0] instanceof NBTTagCompound || delta[0] instanceof NBTTagList)
|
||||
addToList(nbtList, delta[0]);
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String listString, ParseContext context) {
|
||||
if (listString.startsWith("[") && listString.endsWith("]")) {
|
||||
NBTTagCompound tempNBT = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:[0:" + listString.substring(1) + "}");
|
||||
NBTTagList parsedList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
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 = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:" + s + "}");
|
||||
NBTTagList nbtList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
return nbtList;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList deserialize(String s) {
|
||||
NBTTagCompound tempNBT = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:" + s + "}");
|
||||
NBTTagList nbtList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
return nbtList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mustSyncDeserialization() {
|
||||
return true;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound getEntityNBT(Entity entity) {
|
||||
net.minecraft.server.v1_8_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.b(NBT);
|
||||
return NBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound getItemNBT(ItemStack itemStack) {
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
|
||||
if (String.valueOf(itemNBT).equals("{}"))
|
||||
itemNBT = null;
|
||||
return itemNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntityNBT(Entity entity, Object newCompound) {
|
||||
if (newCompound instanceof NBTTagCompound) {
|
||||
net.minecraft.server.v1_8_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();
|
||||
nmsWorld.notify(tileEntity.getPosition());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
|
||||
net.minecraft.server.v1_8_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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
@ -1,439 +1,560 @@
|
||||
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.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.craftbukkit.v1_8_R2.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_8_R2.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_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.lang.ParseContext;
|
||||
import ch.njol.skript.registrations.Classes;
|
||||
import ch.njol.util.coll.CollectionUtils;
|
||||
import net.minecraft.server.v1_8_R2.BlockPosition;
|
||||
import net.minecraft.server.v1_8_R2.EntityInsentient;
|
||||
import net.minecraft.server.v1_8_R2.MojangsonParseException;
|
||||
import net.minecraft.server.v1_8_R2.MojangsonParser;
|
||||
import net.minecraft.server.v1_8_R2.NBTBase;
|
||||
import net.minecraft.server.v1_8_R2.NBTCompressedStreamTools;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagCompound;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagDouble;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagEnd;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagFloat;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagInt;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagList;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagString;
|
||||
import net.minecraft.server.v1_8_R2.PathfinderGoal;
|
||||
import net.minecraft.server.v1_8_R2.PathfinderGoalSelector;
|
||||
import net.minecraft.server.v1_8_R2.TileEntity;
|
||||
import net.minecraft.server.v1_8_R2.World;
|
||||
|
||||
public class NMS_v1_8_R2 implements NMSInterface {
|
||||
|
||||
@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) {
|
||||
((NBTTagCompound) compound).remove(toRemove.toString()); //FIXME
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object parseRawNBT(String rawNBT) {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
try {
|
||||
parsedNBT = MojangsonParser.parse(rawNBT);
|
||||
} catch (MojangsonParseException ex) {
|
||||
Skript.warning("Error when parsing NBT - " + ex.getMessage());
|
||||
}
|
||||
return parsedNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).f();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getContents(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
List<Object> contents = new ArrayList<Object>();
|
||||
for (int i = 0; i < ((NBTTagList) nbtList).size(); i++) {
|
||||
if (getIndex(nbtList, i) != null) {
|
||||
contents.add(getIndex(nbtList, i));
|
||||
}
|
||||
}
|
||||
return contents.toArray();
|
||||
}
|
||||
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) {
|
||||
((NBTTagList) nbtList).a(index);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIndex(Object nbtList, int index, Object toSet) {
|
||||
if (nbtList instanceof NBTTagList && toSet instanceof NBTBase) {
|
||||
((NBTTagList) nbtList).a(index, (NBTBase) toSet);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getIndex(Object nbtList, int index) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
NBTBase value = ((NBTTagList) nbtList).g(index);
|
||||
if (value instanceof NBTTagEnd)
|
||||
return null;
|
||||
else
|
||||
return value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = (NBTTagCompound) parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (delta[0] instanceof String) {
|
||||
NBTTagCompound parsedNBT = (NBTTagCompound) 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("}")) {
|
||||
rawNBT.substring(4);
|
||||
NBTTagCompound NBT = (NBTTagCompound) parseRawNBT(rawNBT);
|
||||
if (NBT.toString().equals("{}")) {
|
||||
return null;
|
||||
}
|
||||
return NBT;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagCompound compound, int arg1) {
|
||||
return compound.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagCompound compound) {
|
||||
return "nbt:" + compound.toString();
|
||||
}
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 11;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (typeId == 5) {
|
||||
NBTTagFloat floatTag = new NBTTagFloat((float) delta[0]);
|
||||
addToList(nbtList[0], floatTag);
|
||||
} else if (typeId == 6) {
|
||||
NBTTagDouble doubleTag = new NBTTagDouble((double) delta[0]);
|
||||
addToList(nbtList[0], doubleTag);
|
||||
} else if (typeId == 8) {
|
||||
NBTTagString stringTag = new NBTTagString((String) delta [0]);
|
||||
addToList(nbtList[0], stringTag);
|
||||
} else if (typeId == 10) {
|
||||
addToList(nbtList[0], delta[0]);
|
||||
} else if (typeId == 11) {
|
||||
NBTTagInt intTag = new NBTTagInt((int) delta[0]);
|
||||
addToList(nbtList[0], intTag);
|
||||
}
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String ignored, ParseContext context) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(NBTTagList nbtList, int arg1) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toVariableNameString(NBTTagList nbtList) {
|
||||
return nbtList.toString();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getEntityNBT(Entity entity) {
|
||||
net.minecraft.server.v1_8_R2.Entity nmsEntity = ((CraftEntity) entity).getHandle();
|
||||
NBTTagCompound NBT = new NBTTagCompound();
|
||||
nmsEntity.e(NBT);
|
||||
return NBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object 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 Object getItemNBT(ItemStack itemStack) {
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound NBT = new NBTTagCompound();
|
||||
net.minecraft.server.v1_8_R2.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
NBT = nmsItem.getTag();
|
||||
if (NBT == null || NBT.toString().equals("{}")) //Null or empty.
|
||||
return null;
|
||||
return new Object[] { NBT };
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntityNBT(Entity entity, Object newCompound) {
|
||||
if (newCompound instanceof NBTTagCompound) {
|
||||
net.minecraft.server.v1_8_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();
|
||||
nmsWorld.notify(tileEntity.getPosition());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
|
||||
if (compound instanceof NBTTagCompound) {
|
||||
if (itemStack.getType() == Material.AIR || itemStack == null)
|
||||
return null;
|
||||
if (compound == null || compound.toString().equals("{}"))
|
||||
return itemStack;
|
||||
net.minecraft.server.v1_8_R2.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
|
||||
nmsItem.setTag((NBTTagCompound) compound);
|
||||
ItemStack newItem = CraftItemStack.asCraftMirror(nmsItem);
|
||||
return newItem;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.craftbukkit.v1_8_R2.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_8_R2.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_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_8_R2.BlockPosition;
|
||||
import net.minecraft.server.v1_8_R2.EntityInsentient;
|
||||
import net.minecraft.server.v1_8_R2.MojangsonParseException;
|
||||
import net.minecraft.server.v1_8_R2.MojangsonParser;
|
||||
import net.minecraft.server.v1_8_R2.NBTBase;
|
||||
import net.minecraft.server.v1_8_R2.NBTCompressedStreamTools;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagByte;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagCompound;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagDouble;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagFloat;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagInt;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagList;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagLong;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagShort;
|
||||
import net.minecraft.server.v1_8_R2.NBTTagString;
|
||||
import net.minecraft.server.v1_8_R2.PathfinderGoal;
|
||||
import net.minecraft.server.v1_8_R2.PathfinderGoalSelector;
|
||||
import net.minecraft.server.v1_8_R2.TileEntity;
|
||||
import net.minecraft.server.v1_8_R2.World;
|
||||
|
||||
public class NMS_v1_8_R2 implements NMSInterface {
|
||||
|
||||
@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 parsedNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).f();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@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 NBTTagList || value instanceof NBTTagCompound) {
|
||||
return value; //No need to convert anything, these are registered by the addon.
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
parsedNBT = parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (delta[0] instanceof String) {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
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 = null;
|
||||
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 "nbt:" + 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 s = fields.getObject("asString", String.class);
|
||||
NBTTagCompound compound = null;
|
||||
compound = parseRawNBT(s);
|
||||
return compound;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagCompound deserialize(String s) {
|
||||
NBTTagCompound compound = null;
|
||||
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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Byte[]) {
|
||||
typeId = 1;
|
||||
} else if (delta instanceof Short[]) {
|
||||
typeId = 2;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 3;
|
||||
} else if (delta instanceof Long[]) {
|
||||
typeId = 4;
|
||||
} else if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (delta[0] instanceof Number)
|
||||
addToList(nbtList, convertToNBT((Number) delta[0]));
|
||||
else if (delta[0] instanceof String)
|
||||
addToList(nbtList, convertToNBT((String) delta[0]));
|
||||
else if (delta[0] instanceof NBTTagCompound || delta[0] instanceof NBTTagList)
|
||||
addToList(nbtList, delta[0]);
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String listString, ParseContext context) {
|
||||
if (listString.startsWith("[") && listString.endsWith("]")) {
|
||||
NBTTagCompound tempNBT = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:[0:" + listString.substring(1) + "}");
|
||||
NBTTagList parsedList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
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 = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:" + s + "}");
|
||||
NBTTagList nbtList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
return nbtList;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList deserialize(String s) {
|
||||
NBTTagCompound tempNBT = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:" + s + "}");
|
||||
NBTTagList nbtList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
return nbtList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mustSyncDeserialization() {
|
||||
return true;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound getEntityNBT(Entity entity) {
|
||||
net.minecraft.server.v1_8_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.b(NBT);
|
||||
return NBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound getItemNBT(ItemStack itemStack) {
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
|
||||
if (String.valueOf(itemNBT).equals("{}"))
|
||||
itemNBT = null;
|
||||
return itemNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntityNBT(Entity entity, Object newCompound) {
|
||||
if (newCompound instanceof NBTTagCompound) {
|
||||
net.minecraft.server.v1_8_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();
|
||||
nmsWorld.notify(tileEntity.getPosition());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemWithNBT(ItemStack itemStack, Object compound) {
|
||||
net.minecraft.server.v1_8_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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
562
src/me/TheBukor/SkStuff/util/NMS_v1_9_R1.java
Normal file
562
src/me/TheBukor/SkStuff/util/NMS_v1_9_R1.java
Normal file
@ -0,0 +1,562 @@
|
||||
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.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.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.IBlockData;
|
||||
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 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 parsedNBT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentsId(Object nbtList) {
|
||||
if (nbtList instanceof NBTTagList) {
|
||||
return ((NBTTagList) nbtList).d();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@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 NBTTagList || value instanceof NBTTagCompound) {
|
||||
return value; //No need to convert anything, these are registered by the addon.
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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 || mode == ChangeMode.SET) {
|
||||
return CollectionUtils.array(String[].class, NBTTagCompound[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagCompound[] NBT, @Nullable Object[] delta, ChangeMode mode) {
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (delta[0] instanceof NBTTagCompound) {
|
||||
NBT[0] = (NBTTagCompound) delta[0];
|
||||
} else {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
parsedNBT = parseRawNBT((String) delta[0]);
|
||||
NBT[0] = parsedNBT;
|
||||
}
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (delta[0] instanceof String) {
|
||||
NBTTagCompound parsedNBT = null;
|
||||
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 = null;
|
||||
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 "nbt:" + 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 s = fields.getObject("asString", String.class);
|
||||
NBTTagCompound compound = null;
|
||||
compound = parseRawNBT(s);
|
||||
return compound;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagCompound deserialize(String s) {
|
||||
NBTTagCompound compound = null;
|
||||
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 || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
return CollectionUtils.array(Float[].class, Double[].class, String[].class, NBTTagCompound[].class, Integer[].class, NBTTagList[].class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void change(NBTTagList[] nbtList, @Nullable Object[] delta, ChangeMode mode) {
|
||||
int typeId = 0;
|
||||
if (delta instanceof Byte[]) {
|
||||
typeId = 1;
|
||||
} else if (delta instanceof Short[]) {
|
||||
typeId = 2;
|
||||
} else if (delta instanceof Integer[]) {
|
||||
typeId = 3;
|
||||
} else if (delta instanceof Long[]) {
|
||||
typeId = 4;
|
||||
} else if (delta instanceof Float[]) {
|
||||
typeId = 5;
|
||||
} else if (delta instanceof Double[]) {
|
||||
typeId = 6;
|
||||
} else if (delta instanceof String[]) {
|
||||
typeId = 8;
|
||||
} else if (delta instanceof NBTTagList[]) {
|
||||
typeId = 9;
|
||||
} else if (delta instanceof NBTTagCompound[]) {
|
||||
typeId = 10;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
if (mode == ChangeMode.SET) {
|
||||
if (typeId == 9)
|
||||
nbtList[0] = (NBTTagList) delta[0];
|
||||
} else if (mode == ChangeMode.ADD) {
|
||||
if (getContentsId(nbtList[0]) == typeId) {
|
||||
if (delta[0] instanceof Number)
|
||||
addToList(nbtList, convertToNBT((Number) delta[0]));
|
||||
else if (delta[0] instanceof String)
|
||||
addToList(nbtList, convertToNBT((String) delta[0]));
|
||||
else if (delta[0] instanceof NBTTagCompound || delta[0] instanceof NBTTagList)
|
||||
addToList(nbtList, delta[0]);
|
||||
}
|
||||
} else if (mode == ChangeMode.DELETE || mode == ChangeMode.RESET) {
|
||||
nbtList[0] = new NBTTagList();
|
||||
}
|
||||
}
|
||||
}).parser(new Parser<NBTTagList>() {
|
||||
|
||||
@Override
|
||||
public String getVariableNamePattern() {
|
||||
return ".+";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList parse(String listString, ParseContext context) {
|
||||
if (listString.startsWith("[") && listString.endsWith("]")) {
|
||||
NBTTagCompound tempNBT = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:[0:" + listString.substring(1) + "}");
|
||||
NBTTagList parsedList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
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 = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:" + s + "}");
|
||||
NBTTagList nbtList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
return nbtList;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NBTTagList deserialize(String s) {
|
||||
NBTTagCompound tempNBT = null;
|
||||
tempNBT = parseRawNBT("{SkStuffIsCool:" + s + "}");
|
||||
NBTTagList nbtList = (NBTTagList) tempNBT.get("SkStuffIsCool");
|
||||
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.getType() == Material.AIR)
|
||||
return null;
|
||||
NBTTagCompound itemNBT = CraftItemStack.asNMSCopy(itemStack).getTag();
|
||||
if (String.valueOf(itemNBT).equals("{}"))
|
||||
itemNBT = null;
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
@ -1,64 +1,74 @@
|
||||
package me.TheBukor.SkStuff.util;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
public class ReflectionUtils {
|
||||
|
||||
public static Class<?> getNMSClass(String classString, boolean isArray) {
|
||||
String version = getVersion();
|
||||
String name = "net.minecraft.server." + version + classString;
|
||||
if (isArray)
|
||||
name = "[L" + name + ";";
|
||||
Class<?> nmsClass = null;
|
||||
try {
|
||||
nmsClass = Class.forName(name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
Bukkit.getLogger().warning("Unable to get NMS class \'" + name + "\'! You are probably running an unsupported version!");
|
||||
return null;
|
||||
}
|
||||
return nmsClass;
|
||||
}
|
||||
|
||||
public static Class<?> getOBCClass(String classString) {
|
||||
String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] + ".";
|
||||
String name = "org.bukkit.craftbukkit." + version + classString;
|
||||
Class<?> obcClass = null;
|
||||
try {
|
||||
obcClass = Class.forName(name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
Bukkit.getLogger().warning("Unable to get OBC class \'" + name + "\'! You are probably running an unsupported version!");
|
||||
return null;
|
||||
}
|
||||
return obcClass;
|
||||
}
|
||||
|
||||
public static Object getField(String field, Class<?> clazz, Object object) {
|
||||
Field f = null;
|
||||
Object obj = null;
|
||||
try {
|
||||
f = clazz.getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
obj = f.get(object);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static void setField(String field, Class<?> clazz, Object object, Object toSet) {
|
||||
Field f = null;
|
||||
try {
|
||||
f = clazz.getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
f.set(object, toSet);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static String getVersion() {
|
||||
return Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] + ".";
|
||||
}
|
||||
package me.TheBukor.SkStuff.util;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
public class ReflectionUtils {
|
||||
|
||||
public static Class<?> getNMSClass(String classString) {
|
||||
String version = getVersion();
|
||||
String name = "net.minecraft.server." + version + classString;
|
||||
Class<?> nmsClass = null;
|
||||
try {
|
||||
nmsClass = Class.forName(name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
Bukkit.getLogger().warning("Unable to get NMS class \'" + name + "\'! You are probably running an unsupported version!");
|
||||
return null;
|
||||
}
|
||||
return nmsClass;
|
||||
}
|
||||
|
||||
public static Class<?> getOBCClass(String classString) {
|
||||
String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] + ".";
|
||||
String name = "org.bukkit.craftbukkit." + version + classString;
|
||||
Class<?> obcClass = null;
|
||||
try {
|
||||
obcClass = Class.forName(name);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
Bukkit.getLogger().warning("Unable to get OBC class \'" + name + "\'! You are probably running an unsupported version!");
|
||||
return null;
|
||||
}
|
||||
return obcClass;
|
||||
}
|
||||
|
||||
public static Object getField(String field, Class<?> clazz, Object object) {
|
||||
Field f = null;
|
||||
Object obj = null;
|
||||
try {
|
||||
f = clazz.getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
obj = f.get(object);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static void setField(String field, Class<?> clazz, Object object, Object toSet) {
|
||||
Field f = null;
|
||||
try {
|
||||
f = clazz.getDeclaredField(field);
|
||||
f.setAccessible(true);
|
||||
f.set(object, toSet);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static Constructor<?> getConstructor(String constructor, Class<?> clazz, Object object, Class<?> ... params) {
|
||||
Constructor<?> constr = null;
|
||||
try {
|
||||
constr = clazz.getDeclaredConstructor(params);
|
||||
constr.setAccessible(true);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return constr;
|
||||
}
|
||||
|
||||
public static String getVersion() {
|
||||
return Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] + ".";
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user