diff --git a/Essentials/pom.xml b/Essentials/pom.xml index b98369aff..8628155db 100644 --- a/Essentials/pom.xml +++ b/Essentials/pom.xml @@ -123,7 +123,7 @@ net.ess3 - 1_9_R1SpawnEggProvider + 1_9_R1Provider 2.0.1 compile diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 7f12ebcda..38a615273 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -34,11 +34,14 @@ import com.google.common.collect.Iterables; import net.ess3.api.*; import net.ess3.api.IEssentials; import net.ess3.api.ISettings; +import net.ess3.nms.SpawnEggProvider; import net.ess3.nms.SpawnerProvider; import net.ess3.nms.blockmeta.BlockMetaSpawnerProvider; +import net.ess3.nms.legacy.LegacySpawnEggProvider; import net.ess3.nms.legacy.LegacySpawnerProvider; import net.ess3.nms.v1_8_R1.v1_8_R1SpawnerProvider; import net.ess3.nms.v1_8_R2.v1_8_R2SpawnerProvider; +import net.ess3.nms.v1_9_R1.v1_9_R1SpawnEggProvider; import net.ess3.providers.ProviderFactory; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -98,6 +101,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private final transient List vanishedPlayers = new ArrayList<>(); private transient Method oldGetOnlinePlayers; private transient SpawnerProvider spawnerProvider; + private transient SpawnEggProvider spawnEggProvider; public Essentials() { } @@ -204,6 +208,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { v1_8_R1SpawnerProvider.class, LegacySpawnerProvider.class ), "mob spawner").getProvider(); + spawnEggProvider = new ProviderFactory<>(getLogger(), + Arrays.asList( + v1_9_R1SpawnEggProvider.class, + LegacySpawnEggProvider.class + ), "spawn egg").getProvider(); reload(); } catch (YAMLException exception) { if (pm.getPlugin("EssentialsUpdate") != null) { @@ -776,6 +785,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return spawnerProvider; } + @Override + public SpawnEggProvider getSpawnEggProvider() { + return spawnEggProvider; + } + private static class EssentialsWorldListener implements Listener, Runnable { private transient final IEssentials ess; diff --git a/Essentials/src/com/earth2me/essentials/ItemDb.java b/Essentials/src/com/earth2me/essentials/ItemDb.java index 9343505c5..c3c61842d 100644 --- a/Essentials/src/com/earth2me/essentials/ItemDb.java +++ b/Essentials/src/com/earth2me/essentials/ItemDb.java @@ -3,7 +3,6 @@ package com.earth2me.essentials; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; import net.ess3.api.IEssentials; -import net.ess3.nms.v1_9_R1.SpawnEgg1_9; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.FireworkEffect; @@ -12,7 +11,6 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.*; -import org.bukkit.material.SpawnEgg; import org.bukkit.potion.Potion; import org.bukkit.potion.PotionEffect; @@ -152,11 +150,7 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb { } catch (IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from spawn eggs."); } - try { - retval = new SpawnEgg1_9(type).toItemStack(); - } catch (Throwable t) { - retval = new SpawnEgg(type).toItemStack(); - } + retval = ess.getSpawnEggProvider().createEggItem(type); } else { retval.setDurability(metaData); } diff --git a/Essentials/src/net/ess3/api/IEssentials.java b/Essentials/src/net/ess3/api/IEssentials.java index 17621415b..20f313d6e 100644 --- a/Essentials/src/net/ess3/api/IEssentials.java +++ b/Essentials/src/net/ess3/api/IEssentials.java @@ -1,5 +1,8 @@ package net.ess3.api; +import net.ess3.nms.SpawnEggProvider; + public interface IEssentials extends com.earth2me.essentials.IEssentials { + SpawnEggProvider getSpawnEggProvider(); } diff --git a/nms/1_9_R1SpawnEggProvider/pom.xml b/nms/1_9_R1Provider/pom.xml similarity index 81% rename from nms/1_9_R1SpawnEggProvider/pom.xml rename to nms/1_9_R1Provider/pom.xml index 1f9acdac8..04730888f 100644 --- a/nms/1_9_R1SpawnEggProvider/pom.xml +++ b/nms/1_9_R1Provider/pom.xml @@ -10,7 +10,7 @@ 4.0.0 - 1_9_R1SpawnEggProvider + 1_9_R1Provider @@ -26,5 +26,10 @@ 1.9-R0.1-SNAPSHOT provided + + net.ess3 + NMSProvider + 2.0.1 + \ No newline at end of file diff --git a/nms/1_9_R1SpawnEggProvider/src/net/ess3/nms/v1_9_R1/SpawnEgg1_9.java b/nms/1_9_R1Provider/src/net/ess3/nms/v1_9_R1/nms/SpawnEgg1_9.java similarity index 89% rename from nms/1_9_R1SpawnEggProvider/src/net/ess3/nms/v1_9_R1/SpawnEgg1_9.java rename to nms/1_9_R1Provider/src/net/ess3/nms/v1_9_R1/nms/SpawnEgg1_9.java index e308cf0ce..49b56c7e0 100644 --- a/nms/1_9_R1SpawnEggProvider/src/net/ess3/nms/v1_9_R1/SpawnEgg1_9.java +++ b/nms/1_9_R1Provider/src/net/ess3/nms/v1_9_R1/nms/SpawnEgg1_9.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with ASkyBlock. If not, see . *******************************************************************************/ -package net.ess3.nms.v1_9_R1; +package net.ess3.nms.v1_9_R1.nms; import net.minecraft.server.v1_9_R1.NBTTagCompound; import org.bukkit.Material; @@ -92,11 +92,11 @@ public class SpawnEgg1_9 { * @param item - ItemStack, quantity is disregarded * @return SpawnEgg 1.9 */ - public static SpawnEgg1_9 fromItemStack(ItemStack item) { + public static SpawnEgg1_9 fromItemStack(ItemStack item) throws IllegalArgumentException { if (item == null) - throw new IllegalArgumentException("item cannot be null"); + throw new IllegalArgumentException("Item cannot be null"); if (item.getType() != Material.MONSTER_EGG) - throw new IllegalArgumentException("item is not a monster egg"); + throw new IllegalArgumentException("Item is not a monster egg"); net.minecraft.server.v1_9_R1.ItemStack stack = CraftItemStack.asNMSCopy(item); NBTTagCompound tagCompound = stack.getTag(); if (tagCompound != null) { @@ -105,10 +105,10 @@ public class SpawnEgg1_9 { if (type != null) { return new SpawnEgg1_9(type); } else { - return null; + throw new IllegalArgumentException("Unable to parse type from item"); } } else { - return null; + throw new IllegalArgumentException("Item is lacking tag compound"); } } } diff --git a/nms/1_9_R1Provider/src/net/ess3/nms/v1_9_R1/v1_9_R1SpawnEggProvider.java b/nms/1_9_R1Provider/src/net/ess3/nms/v1_9_R1/v1_9_R1SpawnEggProvider.java new file mode 100644 index 000000000..b33a7961d --- /dev/null +++ b/nms/1_9_R1Provider/src/net/ess3/nms/v1_9_R1/v1_9_R1SpawnEggProvider.java @@ -0,0 +1,23 @@ +package net.ess3.nms.v1_9_R1; + +import net.ess3.nms.SpawnEggProvider; +import net.ess3.nms.v1_9_R1.nms.SpawnEgg1_9; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class v1_9_R1SpawnEggProvider extends SpawnEggProvider { + @Override + public ItemStack createEggItem(EntityType type) throws IllegalArgumentException { + return new SpawnEgg1_9(type).toItemStack(); + } + + @Override + public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException { + return SpawnEgg1_9.fromItemStack(eggItem).getSpawnedType(); + } + + @Override + public String getHumanName() { + return "CraftBukkit 1.9 NMS-based provider"; + } +} diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java new file mode 100644 index 000000000..9975659db --- /dev/null +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java @@ -0,0 +1,30 @@ +package net.ess3.nms.legacy; + +import net.ess3.nms.SpawnEggProvider; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.MaterialData; +import org.bukkit.material.SpawnEgg; + +public class LegacySpawnEggProvider extends SpawnEggProvider { + @Override + public ItemStack createEggItem(EntityType type) throws IllegalArgumentException { + return new SpawnEgg(type).toItemStack(); + } + + @Override + @SuppressWarnings("deprecation") + public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException { + MaterialData data = eggItem.getData(); + if (data instanceof SpawnEgg) { + return ((SpawnEgg) data).getSpawnedType(); + } else { + throw new IllegalArgumentException("Item is missing data"); + } + } + + @Override + public String getHumanName() { + return "legacy item data provider"; + } +} diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java new file mode 100644 index 000000000..b52f368f2 --- /dev/null +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java @@ -0,0 +1,22 @@ +package net.ess3.nms; + +import net.ess3.providers.Provider; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public abstract class SpawnEggProvider implements Provider { + public abstract ItemStack createEggItem(EntityType type) throws IllegalArgumentException; + public abstract EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException; + + @Override + public boolean tryProvider() { + try { + EntityType type = EntityType.CREEPER; + ItemStack is = createEggItem(type); + EntityType readType = getSpawnedType(is); + return type == readType; + } catch (Throwable t) { + return false; + } + } +} diff --git a/pom.xml b/pom.xml index 482d52406..d5776b0dd 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ nms/1_8_R1Provider nms/1_8_R2Provider nms/LegacyProvider - nms/1_9_R1SpawnEggProvider + nms/1_9_R1Provider