Advertisement
Guest User

Untitled

a guest
Jul 17th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.85 KB | None | 0 0
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Method;
  3. import java.util.Map;
  4.  
  5. import org.bukkit.Bukkit;
  6. import org.bukkit.Location;
  7. import org.bukkit.enchantments.Enchantment;
  8. import org.bukkit.entity.EntityType;
  9. import org.bukkit.inventory.ItemStack;
  10.  
  11. public class CSpawner {
  12.  
  13.     private static Class<?> _CRAFT_WORLD_CLASS, _TILE_ENTITY_MOB_SPAWNER_CLASS, _NBT_TAG_COMPOUND_CLASS,
  14.             _NBT_TAG_LIST_CLASS, _NBT_BASE_CLASS;
  15.     private static Constructor<?> _BLOCK_POSITION_CONSTRUCTOR, _NBT_TAG_LIST_CONSTRUCTOR, _NBT_TAG_COMPOUND_CONSTRUCTOR;
  16.     private static Method _GET_HANDLE_METHOD, _GET_TILE_ENTITY_METHOD, _D_METHOD, _SET_SHORT_METHOD, _SET_STRING_METHOD,
  17.             _SET_METHOD, _ADD_METHOD, _LOAD_METHOD;
  18.  
  19.     static {
  20.         String name = Bukkit.getServer().getClass().getName();
  21.         name = name.substring(name.indexOf("craftbukkit.") + "craftbukkit.".length());
  22.         final String _VERSION = name.substring(0, name.indexOf("."));
  23.         try {
  24.             Class<?> _BLOCK_POSITION_CLASS = Class.forName("net.minecraft.server." + _VERSION + ".BlockPosition");
  25.             _CRAFT_WORLD_CLASS = Class.forName("org.bukkit.craftbukkit." + _VERSION + ".CraftWorld");
  26.             _TILE_ENTITY_MOB_SPAWNER_CLASS = Class
  27.                     .forName("net.minecraft.server." + _VERSION + ".TileEntityMobSpawner");
  28.             _NBT_TAG_COMPOUND_CLASS = Class.forName("net.minecraft.server." + _VERSION + ".NBTTagCompound");
  29.             _NBT_TAG_LIST_CLASS = Class.forName("net.minecraft.server." + _VERSION + ".NBTTagList");
  30.             _NBT_BASE_CLASS = Class.forName("net.minecraft.server." + _VERSION + ".NBTBase");
  31.  
  32.             _BLOCK_POSITION_CONSTRUCTOR = _BLOCK_POSITION_CLASS.getConstructor(double.class, double.class,
  33.                     double.class);
  34.             _NBT_TAG_LIST_CONSTRUCTOR = _NBT_TAG_LIST_CLASS.getConstructor();
  35.             _NBT_TAG_COMPOUND_CONSTRUCTOR = _NBT_TAG_COMPOUND_CLASS.getConstructor();
  36.  
  37.             _GET_HANDLE_METHOD = _CRAFT_WORLD_CLASS.getMethod("getHandle");
  38.             _GET_TILE_ENTITY_METHOD = Class.forName("net.minecraft.server." + _VERSION + ".WorldServer")
  39.                     .getMethod("getTileEntity", _BLOCK_POSITION_CLASS);
  40.             _D_METHOD = _TILE_ENTITY_MOB_SPAWNER_CLASS.getMethod("d");
  41.             _SET_SHORT_METHOD = _NBT_TAG_COMPOUND_CLASS.getMethod("setShort", String.class, short.class);
  42.             _SET_STRING_METHOD = _NBT_TAG_COMPOUND_CLASS.getMethod("setString", String.class, String.class);
  43.             _SET_METHOD = _NBT_TAG_COMPOUND_CLASS.getMethod("set", String.class, _NBT_BASE_CLASS);
  44.             _ADD_METHOD = _NBT_TAG_LIST_CLASS.getMethod("add", _NBT_BASE_CLASS);
  45.             String[] split = _VERSION.split("_");
  46.             if (Double.valueOf(split[1]) < 1.9) {
  47.                 _LOAD_METHOD = _TILE_ENTITY_MOB_SPAWNER_CLASS.getMethod("a", _NBT_TAG_COMPOUND_CLASS);
  48.             } else {
  49.                 _LOAD_METHOD = _TILE_ENTITY_MOB_SPAWNER_CLASS.getMethod("load", _NBT_TAG_COMPOUND_CLASS);
  50.             }
  51.         } catch (Exception ex) {
  52.             ex.printStackTrace();
  53.         }
  54.     }
  55.  
  56.     private Object _spawner;
  57.     private Object _hands, _armor;
  58.     private String _entityType;
  59.  
  60.     private int _maxRange, _maxMobs;
  61.  
  62.     public CSpawner(Location location) {
  63.         try {
  64.             Object blockPosition = _BLOCK_POSITION_CONSTRUCTOR.newInstance(location.getBlockX(), location.getBlockY(),
  65.                     location.getBlockZ());
  66.             Object craftWorld = _CRAFT_WORLD_CLASS.cast(location.getWorld());
  67.             Object serverWorld = _GET_HANDLE_METHOD.invoke(craftWorld);
  68.             this._spawner = _GET_TILE_ENTITY_METHOD.invoke(serverWorld, blockPosition);
  69.             this._entityType = "zombie";
  70.             this._maxMobs = 20;
  71.             this._maxRange = 20;
  72.         } catch (Exception e) {
  73.             e.printStackTrace();
  74.         }
  75.     }
  76.  
  77.     public void setEntityType(EntityType entityType) {
  78.         this._entityType = entityType.name().toLowerCase();
  79.     }
  80.  
  81.     public void setSpawnRange(int range) {
  82.         this._maxRange = range;
  83.     }
  84.  
  85.     public void setMaxNearbyEntities(int max) {
  86.         this._maxMobs = max;
  87.     }
  88.  
  89.     public void setArmor(ItemStack helmetItem, ItemStack chestplateItem, ItemStack leggingsItem, ItemStack bootsItem) {
  90.         try {
  91.             this._armor = _NBT_TAG_LIST_CONSTRUCTOR.newInstance();
  92.  
  93.             Object helmet = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  94.             Object chestplate = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  95.             Object leggings = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  96.             Object boots = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  97.  
  98.             setItemOnTag(helmet, helmetItem);
  99.             setItemOnTag(chestplate, chestplateItem);
  100.             setItemOnTag(leggings, leggingsItem);
  101.             setItemOnTag(boots, bootsItem);
  102.  
  103.             _ADD_METHOD.invoke(this._armor, boots);
  104.             _ADD_METHOD.invoke(this._armor, leggings);
  105.             _ADD_METHOD.invoke(this._armor, chestplate);
  106.             _ADD_METHOD.invoke(this._armor, helmet);
  107.         } catch (Exception e) {
  108.             e.printStackTrace();
  109.         }
  110.     }
  111.  
  112.     public void setHands(ItemStack mainHandItem, ItemStack offHandItem) {
  113.         try {
  114.             this._hands = _NBT_TAG_LIST_CONSTRUCTOR.newInstance();
  115.  
  116.             Object mainHand = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  117.             Object offHand = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  118.  
  119.             setItemOnTag(mainHand, mainHandItem);
  120.             setItemOnTag(offHand, offHandItem);
  121.  
  122.             _ADD_METHOD.invoke(this._hands, mainHand);
  123.             _ADD_METHOD.invoke(this._hands, offHand);
  124.         } catch (Exception e) {
  125.             e.printStackTrace();
  126.         }
  127.     }
  128.  
  129.     @SuppressWarnings("deprecation")
  130.     private void setItemOnTag(Object tag, ItemStack item) {
  131.         try {
  132.             if (item != null) {
  133.                 _SET_STRING_METHOD.invoke(tag, "id", "minecraft:" + item.getType().toString().toLowerCase());
  134.                 _SET_SHORT_METHOD.invoke(tag, "Count", (short) item.getAmount());
  135.                 Map<Enchantment, Integer> enchants = item.getEnchantments();
  136.                 if (!enchants.isEmpty()) {
  137.                     Object enchantments = _NBT_TAG_LIST_CONSTRUCTOR.newInstance();
  138.                     for (Enchantment enchant : enchants.keySet()) {
  139.                         Object e = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  140.                         _SET_SHORT_METHOD.invoke(e, "id", (short) enchant.getId());
  141.                         _SET_SHORT_METHOD.invoke(e, "lvl", (short) enchants.get(enchant).intValue());
  142.                     }
  143.                     Object ench = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  144.                     _SET_METHOD.invoke(ench, "ench", enchantments);
  145.                     _SET_METHOD.invoke(tag, "tag", ench);
  146.                 }
  147.             }
  148.         } catch (Exception e) {
  149.             e.printStackTrace();
  150.         }
  151.     }
  152.  
  153.     public void load() {
  154.         try {
  155.             Object spawnerTag = _D_METHOD.invoke(this._spawner);
  156.             Object spawnData = _NBT_TAG_COMPOUND_CONSTRUCTOR.newInstance();
  157.             _SET_STRING_METHOD.invoke(spawnData, "id", this._entityType);
  158.             _SET_SHORT_METHOD.invoke(spawnerTag, "SpawnRange", (short) _maxRange);
  159.             _SET_SHORT_METHOD.invoke(spawnerTag, "MaxNearbyEntities", (short) _maxMobs);
  160.             if (this._hands != null) {
  161.                 _SET_METHOD.invoke(spawnData, "HandItems", this._hands);
  162.             }
  163.             if (this._armor != null) {
  164.                 _SET_METHOD.invoke(spawnData, "ArmorItems", this._armor);
  165.             }
  166.             _SET_METHOD.invoke(spawnerTag, "SpawnData", spawnData);
  167.             _LOAD_METHOD.invoke(this._spawner, spawnerTag);
  168.         } catch (Exception ex) {
  169.             ex.printStackTrace();
  170.         }
  171.     }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement