Modifizierung von Items[ItemsStacks]

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

Modifizierung von Items[ItemsStacks]

Beitragvon Repitury » Fr 26. Jun 2015, 00:23

Hey,

ich möchte euch eine Klasse von mir vorstellen in der ich mithilfe von NBT Items mit tag´s modifizieren kann. Dies ist z.B. nützlich bei dem Event PlayerInteractEvent wenn man ein Item anklickt aber es nur bei einem bestimmten Item etwas ausgeführt wird. Aber man dem Item keine Lore oder einen Namen geben will.

Die Klasse
Code: Alles auswählen
  1. import java.lang.reflect.Method;
  2. import org.bukkit.Bukkit;
  3. import org.bukkit.inventory.ItemStack;
  4. /**
  5. * @author WolfPlaysDE
  6. * This class in licensed under GPLv3
  7. * For more information look at http://www.gnu.org/licenses/gpl-3.0
  8. */
  9. public class NBTItem {
  10.    private ItemStack bukkititem;
  11.    public NBTItem(ItemStack item) {
  12.       bukkititem = item.clone();
  13.    }
  14.    public ItemStack getItem() {
  15.       return bukkititem;
  16.    }
  17.    public void setString(String key, String s) {
  18.       bukkititem = NBTReflection.setString(bukkititem, key, s);
  19.    }
  20.    public String getString(String key) {
  21.       return NBTReflection.getString(bukkititem, key);
  22.    }
  23.    public void setInteger(String key, Integer i) {
  24.       bukkititem = NBTReflection.setInt(bukkititem, key, i);
  25.    }
  26.    public Integer getInteger(String key) {
  27.       return NBTReflection.getInt(bukkititem, key);
  28.    }
  29.    public void setDouble(String key, Double d) {
  30.       bukkititem = NBTReflection.setDouble(bukkititem, key, d);
  31.    }
  32.    public Double getDouble(String key) {
  33.       return NBTReflection.getDouble(bukkititem, key);
  34.    }
  35.    public void setBoolean(String key, Boolean b) {
  36.       bukkititem = NBTReflection.setBoolean(bukkititem, key, b);
  37.    }
  38.    public Boolean getBoolean(String key) {
  39.       return NBTReflection.getBoolean(bukkititem, key);
  40.    }
  41.    public Boolean hasKey(String key) {
  42.       return NBTReflection.hasKey(bukkititem, key);
  43.    }
  44.    // NBT Classes/Methodes
  45.    private static class NBTReflection {
  46.       static String VERSION;
  47.       static {
  48.          String path = Bukkit.getServer().getClass().getPackage().getName();
  49.          VERSION = path.substring(path.lastIndexOf(".") + 1, path.length());
  50.       }
  51.       private static Class<?> getCraftItemstack() {
  52.          try {
  53.             Class<?> clazz = Class.forName("org.bukkit.craftbukkit" + VERSION + "inventory.CraftItemStack");
  54.             return clazz;
  55.          } catch (Exception ex) {
  56.             ex.printStackTrace();
  57.             return null;
  58.          }
  59.       }
  60.       private static Object getnewNBTTag() {
  61.          try {
  62.             Class<?> clazz = Class.forName("net.minecraft.server" + VERSION + "NBTTagCompound");
  63.             return clazz.newInstance();
  64.          } catch (Exception ex) {
  65.             ex.printStackTrace();
  66.             return null;
  67.          }
  68.       }
  69.       private static Object setNBTTag(Object NBTTag, Object NMSItem) {
  70.          try {
  71.             Method method;
  72.             method = NMSItem.getClass().getMethod("setTag", NBTTag.getClass());
  73.             method.invoke(NMSItem, NBTTag);
  74.             return NMSItem;
  75.          } catch (Exception ex) {
  76.             ex.printStackTrace();
  77.          }
  78.          return null;
  79.       }
  80.       private static Object getNBTTagCompound(Object nmsitem) {
  81.          Class<?> clazz = nmsitem.getClass();
  82.          Method method;
  83.          try {
  84.             method = clazz.getMethod("getTag");
  85.             Object answer = method.invoke(nmsitem);
  86.             return answer;
  87.          } catch (Exception e) {
  88.             e.printStackTrace();
  89.          }
  90.          return null;
  91.       }
  92.       
  93.       private static Object getNMSItemStack(ItemStack item) {
  94.          Class<?> clazz = getCraftItemstack();
  95.          Method method;
  96.          try {
  97.             method = clazz.getMethod("asNMSCopy", ItemStack.class);
  98.             Object answer = method.invoke(clazz, item);
  99.             return answer;
  100.          } catch (Exception e) {
  101.             e.printStackTrace();
  102.          }
  103.          return null;
  104.       }
  105.       
  106.       private static ItemStack getBukkitItemStack(Object item) {
  107.          Class<?> clazz = getCraftItemstack();
  108.          Method method;
  109.          try {
  110.             method = clazz.getMethod("asBukkitCopy", item.getClass());
  111.             Object answer = method.invoke(clazz, item);
  112.             return (ItemStack) answer;
  113.          } catch (Exception e) {
  114.             e.printStackTrace();
  115.          }
  116.          return null;
  117.       }
  118.       public static ItemStack setString(ItemStack item, String key, String Text) {
  119.          Object nmsitem = getNMSItemStack(item);
  120.          Object nbttag = getNBTTagCompound(nmsitem);
  121.          if (nbttag == null) nbttag = getnewNBTTag();
  122.          Method method;
  123.          try {
  124.             method = nbttag.getClass().getMethod("setString", String.class, String.class);
  125.             method.invoke(nbttag, key, Text);
  126.             nmsitem = setNBTTag(nbttag, nmsitem);
  127.             return getBukkitItemStack(nmsitem);
  128.          } catch (Exception ex) {
  129.             ex.printStackTrace();
  130.          }
  131.          return item;
  132.       }
  133.       public static String getString(ItemStack item, String key) {
  134.          Object nmsitem = getNMSItemStack(item);
  135.          Object nbttag = getNBTTagCompound(nmsitem);
  136.          if (nbttag == null) nbttag = getnewNBTTag();
  137.          Method method;
  138.          try {
  139.             method = nbttag.getClass().getMethod("getString", String.class);
  140.             return (String) method.invoke(nbttag, key);
  141.          } catch (Exception ex) {
  142.             ex.printStackTrace();
  143.          }
  144.          return null;
  145.       }
  146.       public static ItemStack setInt(ItemStack item, String key, Integer i) {
  147.          Object nmsitem = getNMSItemStack(item);
  148.          Object nbttag = getNBTTagCompound(nmsitem);
  149.          if (nbttag == null) nbttag = getnewNBTTag();
  150.          Method method;
  151.          try {
  152.             method = nbttag.getClass().getMethod("setInt", String.class, int.class);
  153.             method.invoke(nbttag, key, i);
  154.             nmsitem = setNBTTag(nbttag, nmsitem);
  155.             return getBukkitItemStack(nmsitem);
  156.          } catch (Exception ex) {
  157.             ex.printStackTrace();
  158.          }
  159.          return item;
  160.       }
  161.       public static Integer getInt(ItemStack item, String key) {
  162.          Object nmsitem = getNMSItemStack(item);
  163.          Object nbttag = getNBTTagCompound(nmsitem);
  164.          if (nbttag == null) nbttag = getnewNBTTag();
  165.          Method method;
  166.          try {
  167.             method = nbttag.getClass().getMethod("getInt", String.class);
  168.             return (Integer) method.invoke(nbttag, key);
  169.          } catch (Exception ex) {
  170.             ex.printStackTrace();
  171.          }
  172.          return null;
  173.       }
  174.       public static ItemStack setDouble(ItemStack item, String key, Double d) {
  175.          Object nmsitem = getNMSItemStack(item);
  176.          Object nbttag = getNBTTagCompound(nmsitem);
  177.          if (nbttag == null)   nbttag = getnewNBTTag();
  178.          Method method;
  179.          try {
  180.             method = nbttag.getClass().getMethod("setDouble", String.class, double.class);
  181.             method.invoke(nbttag, key, d);
  182.             nmsitem = setNBTTag(nbttag, nmsitem);
  183.             return getBukkitItemStack(nmsitem);
  184.          } catch (Exception ex) {
  185.             ex.printStackTrace();
  186.          }
  187.          return item;
  188.       }
  189.       public static Double getDouble(ItemStack item, String key) {
  190.          Object nmsitem = getNMSItemStack(item);
  191.          Object nbttag = getNBTTagCompound(nmsitem);
  192.          if (nbttag == null) nbttag = getnewNBTTag();
  193.          Method method;
  194.          try {
  195.             method = nbttag.getClass().getMethod("getDouble", String.class);
  196.             return (Double) method.invoke(nbttag, key);
  197.          } catch (Exception ex) {
  198.             ex.printStackTrace();
  199.          }
  200.          return null;
  201.       }
  202.       public static ItemStack setBoolean(ItemStack item, String key, Boolean d) {
  203.          Object nmsitem = getNMSItemStack(item);
  204.          Object nbttag = getNBTTagCompound(nmsitem);
  205.          if (nbttag == null) nbttag = getnewNBTTag();
  206.          Method method;
  207.          try {
  208.             method = nbttag.getClass().getMethod("setBoolean", String.class, boolean.class);
  209.             method.invoke(nbttag, key, d);
  210.             nmsitem = setNBTTag(nbttag, nmsitem);
  211.             return getBukkitItemStack(nmsitem);
  212.          } catch (Exception ex) {
  213.             ex.printStackTrace();
  214.          }
  215.          return item;
  216.       }
  217.       public static Boolean getBoolean(ItemStack item, String key) {
  218.          Object nmsitem = getNMSItemStack(item);
  219.          Object nbttag = getNBTTagCompound(nmsitem);
  220.          if (nbttag == null) nbttag = getnewNBTTag();
  221.          Method method;
  222.          try {
  223.             method = nbttag.getClass().getMethod("getBoolean", String.class);
  224.             return (Boolean) method.invoke(nbttag, key);
  225.          } catch (Exception ex) {
  226.             ex.printStackTrace();
  227.          }
  228.          return null;
  229.       }
  230.       public static Boolean hasKey(ItemStack item, String key) {
  231.          Object nmsitem = getNMSItemStack(item);
  232.          Object nbttag = getNBTTagCompound(nmsitem);
  233.          if (nbttag == null)   nbttag = getnewNBTTag();
  234.          Method method;
  235.          try {
  236.             method = nbttag.getClass().getMethod("hasKey", String.class);
  237.             return (Boolean) method.invoke(nbttag, key);
  238.          } catch (Exception ex) {
  239.             ex.printStackTrace();
  240.          }
  241.          return null;
  242.       }
  243.    }
  244. }


Lizenz: GPLv3 (Anpassungen sind also erlaubt)

Anwendung

Setzen
Code: Alles auswählen
  1. public void addSpecialStick(Player p) {
  2.       NBTItem nbtStick = new NBTItem(new ItemStack(Material.STICK));
  3.       
  4.       nbtStick.setBoolean("witherShooter", true);
  5.       
  6.       p.getInventory().addItem(nbtStick.getItem());
  7. }


Abfragen
Code: Alles auswählen
  1. @EventHandler
  2. public void onInteract(PlayerInteractEvent event) {
  3.    Player p = event.getPlayer();
  4.    ItemStack item = p.getItemInHand();
  5.    NBTItem nbtItem = new NBTItem(item);
  6.       
  7.    if(item.isSimilar(new ItemStack(Material.STICK))) {
  8.       if(nbtItem.getBoolean("witherShooter")) {
  9.          p.launchProjectile(WitherSkull.class, p.getLocation().getDirection().multiply(2D));
  10.       }
  11.    }
  12. }


Voraussetzungen

Ich empfehle Spigot 1.8 oder neuer. Selber getestet mit Spigot 1.8.6.
Die Idee die Klasse zu schreiben habe ich von Janhektor(hier @Sep2703) von seinem Video [EXPERT] Named Binary Tag [NBT] - Part 1 (Items).
Außerdem wollte ich noch sagen das ich noch nicht viel in Foren gemacht habe deshalb würde ich mich auf feedback freuen und ich wünsche euch noch viel spaß mit der Klasse. ;)
Bin noch Neuling in dem Thema Foren
GitHub
Bitbucket
Youtube
Twitter
Benutzeravatar
Repitury
 
Beiträge: 1
Registriert: Mo 22. Jun 2015, 23:20
Wohnort: Arnsberg NRW

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron