From 2273329e294c636eb43e6d96bc581d1409404f1b Mon Sep 17 00:00:00 2001 From: vemacs Date: Tue, 2 Jun 2015 07:32:10 -0600 Subject: [PATCH] Add SpawnerUtil with primary Spigot 1.8.3+ EntityType setting, legacy data fallback. Fixes #22 --- .../com/earth2me/essentials/Essentials.java | 8 +++ .../essentials/EssentialsBlockListener.java | 2 +- .../com/earth2me/essentials/IEssentials.java | 3 + .../src/com/earth2me/essentials/ItemDb.java | 11 +++- .../essentials/utils/SpawnerUtil.java | 55 +++++++++++++++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 Essentials/src/com/earth2me/essentials/utils/SpawnerUtil.java diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 7f1998b74..a00b50a18 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -30,6 +30,7 @@ import com.earth2me.essentials.textreader.IText; import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.SpawnerUtil; import com.google.common.base.Function; import com.google.common.base.Throwables; import com.google.common.collect.Iterables; @@ -95,6 +96,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient EssentialsTimer timer; private final transient List vanishedPlayers = new ArrayList(); private transient Method oldGetOnlinePlayers; + private transient SpawnerUtil spawnerUtil; public Essentials() { } @@ -192,6 +194,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { execTimer.mark("Init(Worth/ItemDB)"); jails = new Jails(this); confList.add(jails); + spawnerUtil = new SpawnerUtil(this); reload(); } catch (YAMLException exception) { if (pm.getPlugin("EssentialsUpdate") != null) { @@ -757,6 +760,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { }); } + @Override + public SpawnerUtil getSpawnerUtil() { + return spawnerUtil; + } + private static class EssentialsWorldListener implements Listener, Runnable { private transient final IEssentials ess; diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java index 324015596..59aab8c39 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java @@ -36,7 +36,7 @@ public class EssentialsBlockListener implements Listener { final BlockState blockState = event.getBlockPlaced().getState(); if (blockState instanceof CreatureSpawner) { final CreatureSpawner spawner = (CreatureSpawner) blockState; - final EntityType type = EntityType.fromId(event.getItemInHand().getData().getData()); + final EntityType type = ess.getSpawnerUtil().getEntityType(event.getItemInHand()); if (type != null && Mob.fromBukkitType(type) != null) { if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) { spawner.setSpawnedType(type); diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index e896e02da..34dd9e530 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -6,6 +6,7 @@ import com.earth2me.essentials.api.IWarps; import com.earth2me.essentials.metrics.Metrics; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.register.payment.Methods; +import com.earth2me.essentials.utils.SpawnerUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -96,4 +97,6 @@ public interface IEssentials extends Plugin { Collection getOnlinePlayers(); Iterable getOnlineUsers(); + + SpawnerUtil getSpawnerUtil(); } diff --git a/Essentials/src/com/earth2me/essentials/ItemDb.java b/Essentials/src/com/earth2me/essentials/ItemDb.java index b799552dc..e129a75ba 100644 --- a/Essentials/src/com/earth2me/essentials/ItemDb.java +++ b/Essentials/src/com/earth2me/essentials/ItemDb.java @@ -8,6 +8,7 @@ import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.*; import org.bukkit.potion.Potion; @@ -136,7 +137,15 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb { } final ItemStack retval = new ItemStack(mat); retval.setAmount(mat.getMaxStackSize()); - retval.setDurability(metaData); + if (mat == Material.MOB_SPAWNER) { + try { + ess.getSpawnerUtil().setEntityType(retval, EntityType.fromId(metaData)); + } catch (IllegalArgumentException e) { + throw new Exception("Can't spawn entity ID " + metaData + " from mob spawners."); + } + } else { + retval.setDurability(metaData); + } return retval; } diff --git a/Essentials/src/com/earth2me/essentials/utils/SpawnerUtil.java b/Essentials/src/com/earth2me/essentials/utils/SpawnerUtil.java new file mode 100644 index 000000000..a0310db6e --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/utils/SpawnerUtil.java @@ -0,0 +1,55 @@ +package com.earth2me.essentials.utils; + +import net.ess3.api.IEssentials; +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; +import org.bukkit.inventory.meta.ItemMeta; + +public class SpawnerUtil { + private boolean useMeta; + + public SpawnerUtil(IEssentials ess) { + try { + ItemStack is = new ItemStack(Material.MOB_SPAWNER, 1); + ItemMeta meta = is.getItemMeta(); + useMeta = meta instanceof BlockStateMeta; + } catch (Exception e) { + useMeta = false; + } + if (useMeta) { + ess.getLogger().info("Using BlockStateMeta for spawners"); + } else { + ess.getLogger().info("Using legacy item data for spawners"); + } + } + + public ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException { + if (useMeta) { + // Supported in 1.8.3-R0.1-SNAPSHOT and above + BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); + BlockState bs = bsm.getBlockState(); + ((CreatureSpawner) bs).setSpawnedType(type); + bsm.setBlockState(bs); + is.setItemMeta(bsm); + } else { + // Legacy behavior + is.setDurability(type.getTypeId()); + } + return is; + } + + public EntityType getEntityType(ItemStack is) { + ItemMeta meta = is.getItemMeta(); + if (useMeta) { + BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); + CreatureSpawner bs = (CreatureSpawner) bsm.getBlockState(); + return bs.getSpawnedType(); + } else { + return EntityType.fromId((int) is.getData().getData()); + } + } +}