more egg options.

This commit is contained in:
Brianna 2019-08-10 13:10:58 -04:00
parent 1477e26206
commit 42a1e5dac4
4 changed files with 116 additions and 7 deletions

View File

@ -4,17 +4,23 @@ import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
import com.songoda.ultimatestacker.spawner.SpawnerStackManager;
import com.songoda.ultimatestacker.utils.Methods;
import com.songoda.ultimatestacker.utils.Reflection;
import com.songoda.ultimatestacker.utils.ServerVersion;
import com.songoda.ultimatestacker.utils.settings.Setting;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.SpawnerSpawnEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.material.SpawnEgg;
public class SpawnerListeners implements Listener {
@ -47,20 +53,69 @@ public class SpawnerListeners implements Listener {
if (event.getItem() == null) return;
Material type = event.getItem().getType();
Material itemType = event.getItem().getType();
Block block = event.getClickedBlock();
Player player = event.getPlayer();
if (block == null || type == Material.AIR) return;
if (block == null || itemType == Material.AIR) return;
Material blockType = block.getType();
if (block.getType() != (plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))
|| !type.toString().contains(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? "SPAWN_EGG" : "MONSTER_EGG"))
|| !itemType.toString().contains(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? "SPAWN_EGG" : "MONSTER_EGG"))
return;
event.setCancelled(true);
if (!Setting.EGGS_CONVERT_SPAWNERS.getBoolean()
|| !event.getPlayer().hasPermission("ultimatestacker.eggconvert")) {
if (!Setting.EGGS_CONVERT_SPAWNERS.getBoolean()) {
event.setCancelled(true);
}
SpawnerStackManager manager = plugin.getSpawnerStackManager();
SpawnerStack spawner = manager.isSpawner(block.getLocation())
? manager.getSpawner(block) : manager.addSpawner(new SpawnerStack(block.getLocation(), 1));
int stackSize = spawner.getAmount();
int amt = player.getInventory().getItemInHand().getAmount();
EntityType entityType;
if (plugin.isServerVersionAtLeast(ServerVersion.V1_13))
entityType = EntityType.valueOf(itemType.name().replace("_SPAWN_EGG", "").replace("MOOSHROOM", "MUSHROOM_COW"));
else if (plugin.isServerVersionAtLeast(ServerVersion.V1_12)) {
String str = Reflection.getNBTTagCompound(Reflection.getNMSItemStack(event.getItem())).toString();
if (str.contains("minecraft:"))
entityType = EntityType.fromName(str.substring(str.indexOf("minecraft:") + 10, str.indexOf("\"}")));
else
entityType = EntityType.fromName(str.substring(str.indexOf("EntityTag:{id:") + 15, str.indexOf("\"}")));
} else
entityType = ((SpawnEgg) event.getItem().getData()).getSpawnedType();
if (!player.hasPermission("ultimatestacker.egg." + entityType.name())) {
event.setCancelled(true);
return;
}
if (amt < stackSize) {
plugin.getLocale().getMessage("event.egg.needmore")
.processPlaceholder("amount", stackSize).sendPrefixedMessage(player);
event.setCancelled(true);
return;
}
if (blockType.equals(itemType)) {
plugin.getLocale().getMessage("event.egg.sametype")
.processPlaceholder("type", entityType.name()).sendPrefixedMessage(player);
return;
}
spawner.getCreatureSpawner().setSpawnedType(entityType);
spawner.getCreatureSpawner().update();
if (plugin.getHologram() != null)
plugin.getHologram().update(spawner);
if (player.getGameMode() != GameMode.CREATIVE) {
Methods.takeItem(player, stackSize - 1);
}
}
}

View File

@ -23,6 +23,10 @@ public class SpawnerStack {
setAmount(amount);
}
public CreatureSpawner getCreatureSpawner() {
return (CreatureSpawner) location.getBlock().getState();
}
public int getAmount() {
return amount;
}
@ -51,7 +55,7 @@ public class SpawnerStack {
public int calculateSpawnCount() {
Random random = new Random();
int count = 0;
for (int i = 0; i < getAmount(); i ++) {
for (int i = 0; i < getAmount(); i++) {
count += random.nextInt(3 - 1 + 1) + 1;
}
return count;

View File

@ -2,6 +2,7 @@ package com.songoda.ultimatestacker.utils;
import org.bukkit.Bukkit;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@ -66,5 +67,52 @@ public class Reflection {
}
}
public static Object getNMSItemStack(ItemStack item) {
@SuppressWarnings("rawtypes")
Class cis = getCraftItemStack();
java.lang.reflect.Method method;
try {
method = cis.getMethod("asNMSCopy", ItemStack.class);
Object answer = method.invoke(cis, item);
return answer;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@SuppressWarnings({"unchecked"})
public static Object getNBTTagCompound(Object nmsitem) {
@SuppressWarnings("rawtypes")
Class c = nmsitem.getClass();
java.lang.reflect.Method method;
try {
method = c.getMethod("getTag");
Object answer = method.invoke(nmsitem);
return answer;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@SuppressWarnings("rawtypes")
public static Class getCraftItemStack() {
String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
try {
Class c = Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftItemStack");
//Constructor<?> cons = c.getConstructor(ItemStack.class);
//return cons.newInstance(item);
return c;
} catch (Exception ex) {
System.out.println("Error in ItemNBTAPI! (Outdated plugin?)");
ex.printStackTrace();
return null;
}
}
}

View File

@ -8,4 +8,6 @@ command.give.success = "&7You have been given a &6%type%&7."
#Event Messages
event.general.nopermission = "&cYou do not have permission to do that."
event.general.nopermission = "&cYou do not have permission to do that."
event.egg.needmore = "&7You need &6%amount% &7Monster Eggs to convert this spawner."
event.egg.sametype = "&7This already spawns &6%type%s&7."