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