Added nbt support for spawners.

This commit is contained in:
Brianna 2020-04-26 08:42:18 -04:00
parent f8e2d62e4e
commit 5334503cd1
4 changed files with 39 additions and 49 deletions

View File

@ -13,6 +13,8 @@ import com.songoda.core.database.SQLiteConnector;
import com.songoda.core.gui.GuiManager; import com.songoda.core.gui.GuiManager;
import com.songoda.core.hooks.HologramManager; import com.songoda.core.hooks.HologramManager;
import com.songoda.core.hooks.WorldGuardHook; import com.songoda.core.hooks.WorldGuardHook;
import com.songoda.core.nms.NmsManager;
import com.songoda.core.nms.nbt.NBTItem;
import com.songoda.core.utils.TextUtils; import com.songoda.core.utils.TextUtils;
import com.songoda.ultimatestacker.commands.*; import com.songoda.ultimatestacker.commands.*;
import com.songoda.ultimatestacker.database.DataManager; import com.songoda.ultimatestacker.database.DataManager;
@ -32,14 +34,6 @@ import com.songoda.ultimatestacker.storage.types.StorageYaml;
import com.songoda.ultimatestacker.tasks.StackingTask; import com.songoda.ultimatestacker.tasks.StackingTask;
import com.songoda.ultimatestacker.utils.EntityUtils; import com.songoda.ultimatestacker.utils.EntityUtils;
import com.songoda.ultimatestacker.utils.Methods; import com.songoda.ultimatestacker.utils.Methods;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.WordUtils; import org.apache.commons.lang.WordUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -50,14 +44,18 @@ import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import java.io.File;
import java.util.*;
public class UltimateStacker extends SongodaPlugin { public class UltimateStacker extends SongodaPlugin {
private static UltimateStacker INSTANCE; private static UltimateStacker INSTANCE;
private final static Set<String> whitelist = new HashSet(); private final static Set<String> whitelist = new HashSet();
private final static Set<String> blacklist = new HashSet();; private final static Set<String> blacklist = new HashSet();
private final Config mobFile = new Config(this, "mobs.yml"); private final Config mobFile = new Config(this, "mobs.yml");
private final Config itemFile = new Config(this, "items.yml"); private final Config itemFile = new Config(this, "items.yml");
@ -88,7 +86,7 @@ public class UltimateStacker extends SongodaPlugin {
// Register WorldGuard // Register WorldGuard
WorldGuardHook.addHook("mob-stacking", true); WorldGuardHook.addHook("mob-stacking", true);
} }
@Override @Override
public void onPluginDisable() { public void onPluginDisable() {
this.dataManager.bulkUpdateSpawners(this.spawnerStackManager.getStacks()); this.dataManager.bulkUpdateSpawners(this.spawnerStackManager.getStacks());
@ -102,12 +100,12 @@ public class UltimateStacker extends SongodaPlugin {
// Setup Config // Setup Config
Settings.setupConfig(); Settings.setupConfig();
this.setLocale(Settings.LANGUGE_MODE.getString(), false); this.setLocale(Settings.LANGUGE_MODE.getString(), false);
blacklist.clear(); blacklist.clear();
whitelist.clear(); whitelist.clear();
whitelist.addAll(Settings.ITEM_WHITELIST.getStringList()); whitelist.addAll(Settings.ITEM_WHITELIST.getStringList());
blacklist.addAll(Settings.ITEM_BLACKLIST.getStringList()); blacklist.addAll(Settings.ITEM_BLACKLIST.getStringList());
// Setup plugin commands // Setup plugin commands
this.commandManager = new CommandManager(this); this.commandManager = new CommandManager(this);
this.commandManager.addCommand(new CommandUltimateStacker()) this.commandManager.addCommand(new CommandUltimateStacker())
@ -252,15 +250,15 @@ public class UltimateStacker extends SongodaPlugin {
public List<Config> getExtraConfig() { public List<Config> getExtraConfig() {
return Arrays.asList(mobFile, itemFile, spawnerFile); return Arrays.asList(mobFile, itemFile, spawnerFile);
} }
@Override @Override
public void onConfigReload() { public void onConfigReload() {
blacklist.clear(); blacklist.clear();
whitelist.clear(); whitelist.clear();
whitelist.addAll(Settings.ITEM_WHITELIST.getStringList()); whitelist.addAll(Settings.ITEM_WHITELIST.getStringList());
blacklist.addAll(Settings.ITEM_BLACKLIST.getStringList()); blacklist.addAll(Settings.ITEM_BLACKLIST.getStringList());
this.setLocale(getConfig().getString("System.Language Mode"), true); this.setLocale(getConfig().getString("System.Language Mode"), true);
this.locale.reloadMessages(); this.locale.reloadMessages();
this.entityUtils = new EntityUtils(); this.entityUtils = new EntityUtils();
@ -339,7 +337,7 @@ public class UltimateStacker extends SongodaPlugin {
public void updateHologram(SpawnerStack stack) { public void updateHologram(SpawnerStack stack) {
// are holograms enabled? // are holograms enabled?
if(!Settings.SPAWNER_HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return; if (!Settings.SPAWNER_HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return;
Block block = stack.getLocation().getBlock(); Block block = stack.getLocation().getBlock();
if (block.getType() != CompatibleMaterial.SPAWNER.getBlockMaterial()) return; if (block.getType() != CompatibleMaterial.SPAWNER.getBlockMaterial()) return;
// grab the spawner block // grab the spawner block
@ -357,17 +355,18 @@ public class UltimateStacker extends SongodaPlugin {
// verify that this is a spawner // verify that this is a spawner
if (block.getType() != CompatibleMaterial.SPAWNER.getMaterial()) return; if (block.getType() != CompatibleMaterial.SPAWNER.getMaterial()) return;
// are holograms enabled? // are holograms enabled?
if(!Settings.SPAWNER_HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return; if (!Settings.SPAWNER_HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return;
// update this hologram in a tick // update this hologram in a tick
SpawnerStack spawner = getSpawnerStackManager().getSpawner(block); SpawnerStack spawner = getSpawnerStackManager().getSpawner(block);
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, () -> updateHologram(spawner), 10L); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, () -> updateHologram(spawner), 10L);
} }
//////// Convenient API ////////// //////// Convenient API //////////
/** /**
* Change the stacked amount for this item * Change the stacked amount for this item
* *
* @param item item entity to update * @param item item entity to update
* @param newAmount number of items this item represents * @param newAmount number of items this item represents
*/ */
public static void updateItemAmount(Item item, int newAmount) { public static void updateItemAmount(Item item, int newAmount) {
@ -448,10 +447,10 @@ public class UltimateStacker extends SongodaPlugin {
*/ */
public static boolean isMaterialBlacklisted(ItemStack item) { public static boolean isMaterialBlacklisted(ItemStack item) {
CompatibleMaterial mat = CompatibleMaterial.getMaterial(item); CompatibleMaterial mat = CompatibleMaterial.getMaterial(item);
if(mat == null) { if (mat == null) {
// this shouldn't happen, but just in case? // this shouldn't happen, but just in case?
return item == null ? false : (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13) return item == null ? false : (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)
? isMaterialBlacklisted(item.getType()) : isMaterialBlacklisted(item.getType(), item.getData().getData())); ? isMaterialBlacklisted(item.getType()) : isMaterialBlacklisted(item.getType(), item.getData().getData()));
} else if (mat.usesData()) { } else if (mat.usesData()) {
return isMaterialBlacklisted(mat.name()) || isMaterialBlacklisted(mat.getMaterial(), mat.getData()); return isMaterialBlacklisted(mat.name()) || isMaterialBlacklisted(mat.getMaterial(), mat.getData());
} else { } else {

View File

@ -144,6 +144,7 @@ public class EntityStack {
private void handleSingleStackDeath(LivingEntity killed, List<Drop> drops, EntityDeathEvent event) { private void handleSingleStackDeath(LivingEntity killed, List<Drop> drops, EntityDeathEvent event) {
EntityStackManager stackManager = plugin.getEntityStackManager(); EntityStackManager stackManager = plugin.getEntityStackManager();
LivingEntity newEntity = plugin.getEntityUtils().newEntity(killed); LivingEntity newEntity = plugin.getEntityUtils().newEntity(killed);
updateHealth(newEntity); updateHealth(newEntity);

View File

@ -1,6 +1,8 @@
package com.songoda.ultimatestacker.listeners; package com.songoda.ultimatestacker.listeners;
import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.nms.NmsManager;
import com.songoda.core.nms.nbt.NBTItem;
import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.events.SpawnerBreakEvent; import com.songoda.ultimatestacker.events.SpawnerBreakEvent;
import com.songoda.ultimatestacker.events.SpawnerPlaceEvent; import com.songoda.ultimatestacker.events.SpawnerPlaceEvent;
@ -192,6 +194,9 @@ public class BlockListeners implements Listener {
} }
private int getSpawnerAmount(ItemStack item) { private int getSpawnerAmount(ItemStack item) {
NBTItem nbtItem = NmsManager.getNbt().of(item);
if (nbtItem.has("spawner_stack_size"))
return nbtItem.getNBTObject("spawner_stack_size").asInt();
if (!item.hasItemMeta() || !item.getItemMeta().hasDisplayName()) return 1; if (!item.hasItemMeta() || !item.getItemMeta().hasDisplayName()) return 1;
if (item.getItemMeta().getDisplayName().contains(":")) { if (item.getItemMeta().getDisplayName().contains(":")) {
int amt = NumberUtils.toInt(item.getItemMeta().getDisplayName().replace("\u00A7", "").replace(";", "").split(":")[0], 1); int amt = NumberUtils.toInt(item.getItemMeta().getDisplayName().replace("\u00A7", "").replace(";", "").split(":")[0], 1);

View File

@ -1,34 +1,27 @@
package com.songoda.ultimatestacker.utils; package com.songoda.ultimatestacker.utils;
import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerVersion; import com.songoda.core.nms.NmsManager;
import com.songoda.core.nms.nbt.NBTItem;
import com.songoda.core.utils.TextUtils; import com.songoda.core.utils.TextUtils;
import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings; import com.songoda.ultimatestacker.settings.Settings;
import java.util.Arrays; import org.bukkit.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner; import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.Entity; import org.bukkit.entity.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
public class Methods { public class Methods {
public static void updateInventory(Item item, Inventory inventory) { public static void updateInventory(Item item, Inventory inventory) {
@ -172,18 +165,10 @@ public class Methods {
cs.setSpawnedType(entityType); cs.setSpawnedType(entityType);
((BlockStateMeta) meta).setBlockState(cs); ((BlockStateMeta) meta).setBlockState(cs);
item.setItemMeta(meta); item.setItemMeta(meta);
return item;
}
public static String formatTitle(String text) { NBTItem nbtItem = NmsManager.getNbt().of(item);
if (text == null || text.equals("")) nbtItem.set("spawner_stack_size", amount);
return ""; return nbtItem.finish();
if (!ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9)) {
if (text.length() > 31)
text = text.substring(0, 29) + "...";
}
text = formatText(text);
return text;
} }
public static boolean isInt(String number) { public static boolean isInt(String number) {