diff --git a/resource/plugin.yml b/resource/plugin.yml index 9185e39..0cb4f29 100644 --- a/resource/plugin.yml +++ b/resource/plugin.yml @@ -1,4 +1,4 @@ -version: 3.15.6.0 +version: 3.15.6.1 main: me.rockyhawk.commandpanels.CommandPanels name: CommandPanels author: RockyHawk diff --git a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java b/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java index 06d0bdd..031cee1 100644 --- a/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java +++ b/src/me/rockyhawk/commandpanels/commandtags/tags/economy/BuyCommandTags.java @@ -57,9 +57,9 @@ public class BuyCommandTags implements Listener { String price = e.args[0]; String command = String.join(" ",Arrays.copyOfRange(e.raw, 1, e.raw.length)); plugin.commandTags.runCommand(e.panel,e.p,command); - plugin.tex.sendMessage(e.p, Objects.requireNonNull(plugin.config.getString("purchase.token.success")).replaceAll("%cp-args%", price)); + plugin.tex.sendMessage(e.p, Objects.requireNonNull(plugin.config.getString("purchase.tokens.success")).replaceAll("%cp-args%", price)); } else { - plugin.tex.sendMessage(e.p, plugin.config.getString("purchase.token.failure")); + plugin.tex.sendMessage(e.p, plugin.config.getString("purchase.tokens.failure")); } } else { plugin.tex.sendMessage(e.p, ChatColor.RED + "Buying Requires Vault and an Economy to work!"); diff --git a/src/me/rockyhawk/commandpanels/ioclasses/NBTEditor.java b/src/me/rockyhawk/commandpanels/ioclasses/NBTEditor.java index 702f64e..eded854 100644 --- a/src/me/rockyhawk/commandpanels/ioclasses/NBTEditor.java +++ b/src/me/rockyhawk/commandpanels/ioclasses/NBTEditor.java @@ -1,5 +1,18 @@ package me.rockyhawk.commandpanels.ioclasses; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Base64; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -8,26 +21,20 @@ import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Sets/Gets NBT tags from ItemStacks + * Supports 1.8-1.17 + * + * Github: https://github.com/BananaPuncher714/NBTEditor * Spigot: https://www.spigotmc.org/threads/269621/ * - * @version 7.16.1 + * @version 7.17.0 * @author BananaPuncher714 */ -@SuppressWarnings("deprecation") public final class NBTEditor { - private static final Map< String, Class > classCache; + private static final Map< String, Class< ? > > classCache; private static final Map< String, Method > methodCache; - private static final Map< Class< ? >, Constructor< ? >> constructorCache; + private static final Map< Class< ? >, Constructor< ? > > constructorCache; private static final Map< Class< ? >, Class< ? > > NBTClasses; private static final Map< Class< ? >, Field > NBTTagFieldCache; private static Field NBTListData; @@ -41,27 +48,50 @@ public final class NBTEditor { classCache = new HashMap< String, Class >(); try { - classCache.put( "NBTBase", Class.forName( "net.minecraft.server." + VERSION + "." + "NBTBase" ) ); - classCache.put( "NBTTagCompound", Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagCompound" ) ); - classCache.put( "NBTTagList", Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagList" ) ); - classCache.put( "MojangsonParser", Class.forName( "net.minecraft.server." + VERSION + "." + "MojangsonParser" ) ); + if ( LOCAL_VERSION.lessThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + classCache.put( "NBTBase", Class.forName( "net.minecraft.server." + VERSION + "." + "NBTBase" ) ); + classCache.put( "NBTTagCompound", Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagCompound" ) ); + classCache.put( "NBTTagList", Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagList" ) ); + classCache.put( "MojangsonParser", Class.forName( "net.minecraft.server." + VERSION + "." + "MojangsonParser" ) ); + + classCache.put( "ItemStack", Class.forName( "net.minecraft.server." + VERSION + "." + "ItemStack" ) ); + + classCache.put( "Entity", Class.forName( "net.minecraft.server." + VERSION + "." + "Entity" ) ); + classCache.put( "EntityLiving", Class.forName( "net.minecraft.server." + VERSION + "." + "EntityLiving" ) ); + + classCache.put( "BlockPosition", Class.forName( "net.minecraft.server." + VERSION + "." + "BlockPosition" ) ); + classCache.put( "TileEntity", Class.forName( "net.minecraft.server." + VERSION + "." + "TileEntity" ) ); + classCache.put( "World", Class.forName( "net.minecraft.server." + VERSION + "." + "World" ) ); + classCache.put( "IBlockData", Class.forName( "net.minecraft.server." + VERSION + "." + "IBlockData" ) ); + + classCache.put( "TileEntitySkull", Class.forName( "net.minecraft.server." + VERSION + "." + "TileEntitySkull" ) ); + + } else { + classCache.put( "BlockPosition", Class.forName( "net.minecraft.core.BlockPosition" ) ); + + classCache.put( "NBTBase", Class.forName( "net.minecraft.nbt.NBTBase" ) ); + classCache.put( "NBTTagCompound", Class.forName( "net.minecraft.nbt.NBTTagCompound" ) ); + classCache.put( "NBTTagList", Class.forName( "net.minecraft.nbt.NBTTagList" ) ); + classCache.put( "MojangsonParser", Class.forName( "net.minecraft.nbt.MojangsonParser" ) ); + + classCache.put( "ItemStack", Class.forName( "net.minecraft.world.item.ItemStack" ) ); + + classCache.put( "Entity", Class.forName( "net.minecraft.world.entity.Entity" ) ); + classCache.put( "EntityLiving", Class.forName( "net.minecraft.world.entity.EntityLiving" ) ); + + classCache.put( "World", Class.forName( "net.minecraft.world.level.World" ) ); + classCache.put( "IBlockData", Class.forName( "net.minecraft.world.level.block.state.IBlockData" ) ); + classCache.put( "TileEntity", Class.forName( "net.minecraft.world.level.block.entity.TileEntity" ) ); + classCache.put( "TileEntitySkull", Class.forName( "net.minecraft.world.level.block.entity.TileEntitySkull" ) ); + } - classCache.put( "ItemStack", Class.forName( "net.minecraft.server." + VERSION + "." + "ItemStack" ) ); classCache.put( "CraftItemStack", Class.forName( "org.bukkit.craftbukkit." + VERSION + ".inventory." + "CraftItemStack" ) ); classCache.put( "CraftMetaSkull", Class.forName( "org.bukkit.craftbukkit." + VERSION + ".inventory." + "CraftMetaSkull" ) ); - classCache.put( "Entity", Class.forName( "net.minecraft.server." + VERSION + "." + "Entity" ) ); classCache.put( "CraftEntity", Class.forName( "org.bukkit.craftbukkit." + VERSION + ".entity." + "CraftEntity" ) ); - classCache.put( "EntityLiving", Class.forName( "net.minecraft.server." + VERSION + "." + "EntityLiving" ) ); classCache.put( "CraftWorld", Class.forName( "org.bukkit.craftbukkit." + VERSION + "." + "CraftWorld" ) ); classCache.put( "CraftBlockState", Class.forName( "org.bukkit.craftbukkit." + VERSION + ".block." + "CraftBlockState" ) ); - classCache.put( "BlockPosition", Class.forName( "net.minecraft.server." + VERSION + "." + "BlockPosition" ) ); - classCache.put( "TileEntity", Class.forName( "net.minecraft.server." + VERSION + "." + "TileEntity" ) ); - classCache.put( "World", Class.forName( "net.minecraft.server." + VERSION + "." + "World" ) ); - classCache.put( "IBlockData", Class.forName( "net.minecraft.server." + VERSION + "." + "IBlockData" ) ); - - classCache.put( "TileEntitySkull", Class.forName( "net.minecraft.server." + VERSION + "." + "TileEntitySkull" ) ); classCache.put( "GameProfile", Class.forName( "com.mojang.authlib.GameProfile" ) ); classCache.put( "Property", Class.forName( "com.mojang.authlib.properties.Property" ) ); @@ -72,16 +102,29 @@ public final class NBTEditor { NBTClasses = new HashMap< Class< ? >, Class< ? > >(); try { - NBTClasses.put( Byte.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagByte" ) ); - NBTClasses.put( Boolean.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagByte" ) ); - NBTClasses.put( String.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagString" ) ); - NBTClasses.put( Double.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagDouble" ) ); - NBTClasses.put( Integer.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagInt" ) ); - NBTClasses.put( Long.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagLong" ) ); - NBTClasses.put( Short.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagShort" ) ); - NBTClasses.put( Float.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagFloat" ) ); - NBTClasses.put( Class.forName( "[B" ), Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagByteArray" ) ); - NBTClasses.put( Class.forName( "[I" ), Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagIntArray" ) ); + if ( LOCAL_VERSION.lessThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + NBTClasses.put( Byte.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagByte" ) ); + NBTClasses.put( Boolean.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagByte" ) ); + NBTClasses.put( String.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagString" ) ); + NBTClasses.put( Double.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagDouble" ) ); + NBTClasses.put( Integer.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagInt" ) ); + NBTClasses.put( Long.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagLong" ) ); + NBTClasses.put( Short.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagShort" ) ); + NBTClasses.put( Float.class, Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagFloat" ) ); + NBTClasses.put( Class.forName( "[B" ), Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagByteArray" ) ); + NBTClasses.put( Class.forName( "[I" ), Class.forName( "net.minecraft.server." + VERSION + "." + "NBTTagIntArray" ) ); + } else { + NBTClasses.put( Byte.class, Class.forName( "net.minecraft.nbt.NBTTagByte" ) ); + NBTClasses.put( Boolean.class, Class.forName( "net.minecraft.nbt.NBTTagByte" ) ); + NBTClasses.put( String.class, Class.forName( "net.minecraft.nbt.NBTTagString" ) ); + NBTClasses.put( Double.class, Class.forName( "net.minecraft.nbt.NBTTagDouble" ) ); + NBTClasses.put( Integer.class, Class.forName( "net.minecraft.nbt.NBTTagInt" ) ); + NBTClasses.put( Long.class, Class.forName( "net.minecraft.nbt.NBTTagLong" ) ); + NBTClasses.put( Short.class, Class.forName( "net.minecraft.nbt.NBTTagShort" ) ); + NBTClasses.put( Float.class, Class.forName( "net.minecraft.nbt.NBTTagFloat" ) ); + NBTClasses.put( Class.forName( "[B" ), Class.forName( "net.minecraft.nbt.NBTTagByteArray" ) ); + NBTClasses.put( Class.forName( "[I" ), Class.forName( "net.minecraft.nbt.NBTTagIntArray" ) ); + } } catch ( ClassNotFoundException e ) { e.printStackTrace(); } @@ -91,7 +134,11 @@ public final class NBTEditor { methodCache.put( "get", getNMSClass( "NBTTagCompound" ).getMethod( "get", String.class ) ); methodCache.put( "set", getNMSClass( "NBTTagCompound" ).getMethod( "set", String.class, getNMSClass( "NBTBase" ) ) ); methodCache.put( "hasKey", getNMSClass( "NBTTagCompound" ).getMethod( "hasKey", String.class ) ); - methodCache.put( "setIndex", getNMSClass( "NBTTagList" ).getMethod( "a", int.class, getNMSClass( "NBTBase" ) ) ); + if ( LOCAL_VERSION.lessThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + methodCache.put( "setIndex", getNMSClass( "NBTTagList" ).getMethod( "a", int.class, getNMSClass( "NBTBase" ) ) ); + } else { + methodCache.put( "setIndex", getNMSClass( "NBTTagList" ).getMethod( "set", int.class, getNMSClass( "NBTBase" ) ) ); + } if ( LOCAL_VERSION.greaterThanOrEqualTo( MinecraftVersion.v1_14 ) ) { methodCache.put( "getTypeId", getNMSClass( "NBTBase" ).getMethod( "getTypeId" ) ); methodCache.put( "add", getNMSClass( "NBTTagList" ).getMethod( "add", int.class, getNMSClass( "NBTBase" ) ) ); @@ -136,7 +183,7 @@ public final class NBTEditor { methodCache.put( "createStack", getNMSClass( "ItemStack" ).getMethod( "a", getNMSClass( "NBTTagCompound" ) ) ); } - if ( LOCAL_VERSION.greaterThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + if ( LOCAL_VERSION == MinecraftVersion.v1_16 ) { methodCache.put( "setTileTag", getNMSClass( "TileEntity" ).getMethod( "load", getNMSClass( "IBlockData" ), getNMSClass( "NBTTagCompound" ) ) ); methodCache.put( "getType", getNMSClass( "World" ).getMethod( "getType", getNMSClass( "BlockPosition" ) ) ); } else if ( LOCAL_VERSION.greaterThanOrEqualTo( MinecraftVersion.v1_12 ) ) { @@ -144,6 +191,13 @@ public final class NBTEditor { } else { methodCache.put( "setTileTag", getNMSClass( "TileEntity" ).getMethod( "a", getNMSClass( "NBTTagCompound" ) ) ); } + + if ( LOCAL_VERSION == MinecraftVersion.v1_8 ) { + methodCache.put( "getTileTag", getNMSClass( "TileEntity" ).getMethod( "b", getNMSClass( "NBTTagCompound" ) ) ); + } else { + methodCache.put( "getTileTag", getNMSClass( "TileEntity" ).getMethod( "save", getNMSClass( "NBTTagCompound" ) ) ); + } + methodCache.put( "getTileEntity", getNMSClass( "World" ).getMethod( "getTileEntity", getNMSClass( "BlockPosition" ) ) ); methodCache.put( "getWorldHandle", getNMSClass( "CraftWorld" ).getMethod( "getHandle" ) ); @@ -159,18 +213,6 @@ public final class NBTEditor { e.printStackTrace(); } - try { - methodCache.put( "getTileTag", getNMSClass( "TileEntity" ).getMethod( "save", getNMSClass( "NBTTagCompound" ) ) ); - } catch( NoSuchMethodException exception ) { - try { - methodCache.put( "getTileTag", getNMSClass( "TileEntity" ).getMethod( "b", getNMSClass( "NBTTagCompound" ) ) ); - } catch ( Exception exception2 ) { - exception2.printStackTrace(); - } - } catch( Exception exception ) { - exception.printStackTrace(); - } - try { methodCache.put( "setProfile", getNMSClass( "CraftMetaSkull" ).getDeclaredMethod( "setProfile", getNMSClass( "GameProfile" ) ) ); methodCache.get( "setProfile" ).setAccessible( true ); @@ -210,19 +252,41 @@ public final class NBTEditor { NBTTagFieldCache = new HashMap< Class< ? >, Field >(); try { - for ( Class< ? > clazz : NBTClasses.values() ) { - Field data = clazz.getDeclaredField( "data" ); - data.setAccessible( true ); - NBTTagFieldCache.put( clazz, data ); + if ( LOCAL_VERSION.lessThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + for ( Class< ? > clazz : NBTClasses.values() ) { + Field data = clazz.getDeclaredField( "data" ); + data.setAccessible( true ); + NBTTagFieldCache.put( clazz, data ); + } + } else { + NBTTagFieldCache.put( NBTClasses.get( Byte.class ), NBTClasses.get( Byte.class ).getDeclaredField( "x" ) ); + NBTTagFieldCache.put( NBTClasses.get( Boolean.class ), NBTClasses.get( Boolean.class ).getDeclaredField( "x" ) ); + NBTTagFieldCache.put( NBTClasses.get( String.class ), NBTClasses.get( String.class ).getDeclaredField( "A" ) ); + NBTTagFieldCache.put( NBTClasses.get( Double.class ), NBTClasses.get( Double.class ).getDeclaredField( "w" ) ); + NBTTagFieldCache.put( NBTClasses.get( Integer.class ), NBTClasses.get( Integer.class ).getDeclaredField( "c" ) ); + NBTTagFieldCache.put( NBTClasses.get( Long.class ), NBTClasses.get( Long.class ).getDeclaredField( "c" ) ); + NBTTagFieldCache.put( NBTClasses.get( Float.class ), NBTClasses.get( Float.class ).getDeclaredField( "w" ) ); + NBTTagFieldCache.put( NBTClasses.get( Short.class ), NBTClasses.get( Short.class ).getDeclaredField( "c" ) ); + NBTTagFieldCache.put( NBTClasses.get( Class.forName( "[B" ) ), NBTClasses.get( Class.forName( "[B" ) ).getDeclaredField( "c" ) ); + NBTTagFieldCache.put( NBTClasses.get( Class.forName( "[I" ) ), NBTClasses.get( Class.forName( "[I" ) ).getDeclaredField( "c" ) ); + + for ( Field field : NBTTagFieldCache.values() ) { + field.setAccessible( true ); + } } } catch( Exception e ) { e.printStackTrace(); } try { - NBTListData = getNMSClass( "NBTTagList" ).getDeclaredField( "list" ); + if ( LOCAL_VERSION.lessThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + NBTListData = getNMSClass( "NBTTagList" ).getDeclaredField( "list" ); + NBTCompoundMap = getNMSClass( "NBTTagCompound" ).getDeclaredField( "map" ); + } else { + NBTListData = getNMSClass( "NBTTagList" ).getDeclaredField( "c" ); + NBTCompoundMap = getNMSClass( "NBTTagCompound" ).getDeclaredField( "x" ); + } NBTListData.setAccessible( true ); - NBTCompoundMap = getNMSClass( "NBTTagCompound" ).getDeclaredField( "map" ); NBTCompoundMap.setAccessible( true ); } catch( Exception e ) { e.printStackTrace(); @@ -752,7 +816,7 @@ public final class NBTEditor { setTag( tag, value, keys ); } - if ( LOCAL_VERSION.greaterThanOrEqualTo( MinecraftVersion.v1_16 ) ) { + if ( LOCAL_VERSION == MinecraftVersion.v1_16 ) { getMethod( "setTileTag" ).invoke( tileEntity, getMethod( "getType" ).invoke( nmsWorld, blockPosition ), tag ); } else { getMethod( "setTileTag" ).invoke( tileEntity, tag ); @@ -1419,4 +1483,4 @@ public final class NBTEditor { return null; } } -} +} \ No newline at end of file