From 651afb3844207bbedc9cd83d2308d6ec3b6d8081 Mon Sep 17 00:00:00 2001 From: Brianna Date: Mon, 1 Mar 2021 10:02:36 -0600 Subject: [PATCH 1/4] Fixed an issue causing EXP not to drop for certain entities in 1.14- --- .../stackable/entity/EntityStack.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/songoda/ultimatestacker/stackable/entity/EntityStack.java b/src/main/java/com/songoda/ultimatestacker/stackable/entity/EntityStack.java index b52e5b8..b1ef678 100644 --- a/src/main/java/com/songoda/ultimatestacker/stackable/entity/EntityStack.java +++ b/src/main/java/com/songoda/ultimatestacker/stackable/entity/EntityStack.java @@ -1,5 +1,6 @@ package com.songoda.ultimatestacker.stackable.entity; +import com.songoda.core.compatibility.ServerVersion; import com.songoda.lootables.loot.Drop; import com.songoda.lootables.loot.DropUtils; import com.songoda.ultimatestacker.UltimateStacker; @@ -120,7 +121,7 @@ public class EntityStack extends ColdEntityStack { plugin.addExp(killed.getKiller(), this); } - private void handleSingleStackDeath(LivingEntity killed, List drops, EntityDeathEvent event) { + private void handleSingleStackDeath(LivingEntity killed, List drops, int droppedExp, EntityDeathEvent event) { EntityStackManager stackManager = plugin.getEntityStackManager(); killed.remove(); @@ -129,6 +130,13 @@ public class EntityStack extends ColdEntityStack { //if (!EntityUtils.isAware(killed)) // EntityUtils.setUnaware(newEntity); + // In versions 1.14 and below experience is not dropping. Because of this we are doing this ourselves. + if (ServerVersion.isServerVersionAtOrBelow(ServerVersion.V1_14)) { + Location killedLocation = killed.getLocation(); + if (droppedExp > 0) + killedLocation.getWorld().spawn(killedLocation, ExperienceOrb.class).setExperience(droppedExp); + } + DropUtils.processStackedDrop(killed, drops, event); newEntity.setVelocity(killed.getVelocity()); @@ -161,7 +169,7 @@ public class EntityStack extends ColdEntityStack { return; } } - handleSingleStackDeath(killed, drops, event); + handleSingleStackDeath(killed, drops, droppedExp, event); } } From b5ef30c62986abd9c716e29111354775a3441ad8 Mon Sep 17 00:00:00 2001 From: Brianna Date: Tue, 2 Mar 2021 09:22:07 -0600 Subject: [PATCH 2/4] Fixed an null pointer exception. --- .../stackable/entity/ColdEntityStack.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/songoda/ultimatestacker/stackable/entity/ColdEntityStack.java b/src/main/java/com/songoda/ultimatestacker/stackable/entity/ColdEntityStack.java index b3614c5..ba8e51f 100644 --- a/src/main/java/com/songoda/ultimatestacker/stackable/entity/ColdEntityStack.java +++ b/src/main/java/com/songoda/ultimatestacker/stackable/entity/ColdEntityStack.java @@ -102,9 +102,18 @@ public class ColdEntityStack implements Stackable { return entity; } - LivingEntity newEntity = (LivingEntity) nbtEntity.spawn(location); - stackedEntities.removeFirst(); - plugin.getDataManager().deleteStackedEntity(newEntity.getUniqueId()); + LivingEntity newEntity = null; + for (int i = 0; i < 5; i++) { + newEntity = (LivingEntity) nbtEntity.spawn(location); + + if (newEntity != null) { + stackedEntities.removeFirst(); + plugin.getDataManager().deleteStackedEntity(newEntity.getUniqueId()); + break; + } + } + if (newEntity == null) + plugin.getDataManager().deleteStackedEntity(hostUniqueId); return newEntity; } From b87f73589cf1c8685edc1e94fbce1c990cdc9b86 Mon Sep 17 00:00:00 2001 From: Brianna Date: Fri, 5 Mar 2021 08:09:00 -0600 Subject: [PATCH 3/4] Minor code clean up. --- .../ultimatestacker/UltimateStacker.java | 4 +- .../commands/CommandConvert.java | 3 +- .../commands/CommandGiveSpawner.java | 3 +- .../commands/CommandRemoveAll.java | 2 +- .../commands/CommandSpawn.java | 3 +- .../ultimatestacker/gui/GUIConvertWhat.java | 3 +- .../stackable/block/BlockStack.java | 5 +- .../ultimatestacker/utils/Methods.java | 79 ++----------------- 8 files changed, 21 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java index 3cfac1b..d3e9785 100644 --- a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java +++ b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java @@ -135,7 +135,7 @@ public class UltimateStacker extends SongodaPlugin { for (EntityType value : EntityType.values()) { if (value.isSpawnable() && value.isAlive() && !value.toString().contains("ARMOR")) { mobFile.addDefault("Mobs." + value.name() + ".Enabled", true); - mobFile.addDefault("Mobs." + value.name() + ".Display Name", Methods.formatText(value.name().toLowerCase().replace("_", " "), true)); + mobFile.addDefault("Mobs." + value.name() + ".Display Name", TextUtils.formatText(value.name().toLowerCase().replace("_", " "), true)); mobFile.addDefault("Mobs." + value.name() + ".Max Stack Size", -1); mobFile.addDefault("Mobs." + value.name() + ".Kill Whole Stack", false); } @@ -154,7 +154,7 @@ public class UltimateStacker extends SongodaPlugin { for (EntityType value : EntityType.values()) { if (value.isSpawnable() && value.isAlive() && !value.toString().contains("ARMOR")) { spawnerFile.addDefault("Spawners." + value.name() + ".Max Stack Size", -1); - spawnerFile.addDefault("Spawners." + value.name() + ".Display Name", Methods.formatText(value.name().toLowerCase().replace("_", " "), true)); + spawnerFile.addDefault("Spawners." + value.name() + ".Display Name", TextUtils.formatText(value.name().toLowerCase().replace("_", " "), true)); } } spawnerFile.load(); diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandConvert.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandConvert.java index 8ed02a2..beec318 100644 --- a/src/main/java/com/songoda/ultimatestacker/commands/CommandConvert.java +++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandConvert.java @@ -2,6 +2,7 @@ package com.songoda.ultimatestacker.commands; import com.songoda.core.commands.AbstractCommand; import com.songoda.core.gui.GuiManager; +import com.songoda.core.utils.TextUtils; import com.songoda.ultimatestacker.gui.GUIConvert; import com.songoda.ultimatestacker.utils.Methods; import org.bukkit.Bukkit; @@ -25,7 +26,7 @@ public class CommandConvert extends AbstractCommand { || Bukkit.getPluginManager().isPluginEnabled("StackMob")) { guiManager.showGUI((Player) sender, new GUIConvert()); } else { - sender.sendMessage(Methods.formatText("&cYou need to have the plugin &4WildStacker &cor &4StackMob &cenabled " + + sender.sendMessage(TextUtils.formatText("&cYou need to have the plugin &4WildStacker &cor &4StackMob &cenabled " + "in order to convert data.")); } return ReturnType.SUCCESS; diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandGiveSpawner.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandGiveSpawner.java index a0804d7..a3f4998 100644 --- a/src/main/java/com/songoda/ultimatestacker/commands/CommandGiveSpawner.java +++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandGiveSpawner.java @@ -1,6 +1,7 @@ package com.songoda.ultimatestacker.commands; import com.songoda.core.commands.AbstractCommand; +import com.songoda.core.utils.TextUtils; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.utils.Methods; import org.bukkit.Bukkit; @@ -48,7 +49,7 @@ public class CommandGiveSpawner extends AbstractCommand { if (types.isSpawnable() && types.isAlive() && !types.toString().contains("ARMOR")) list.append(types.name().toUpperCase().replace(" ", "_")).append("&7, &6"); } - sender.sendMessage(Methods.formatText("&6" + list)); + sender.sendMessage(TextUtils.formatText("&6" + list)); } else { int amt = args.length == 3 ? Integer.parseInt(args[2]) : 1; diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java index 1edd082..bea99df 100644 --- a/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java +++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandRemoveAll.java @@ -66,7 +66,7 @@ public class CommandRemoveAll extends AbstractCommand { + type + " exist that could be removed.").sendPrefixedMessage(sender); } else { plugin.getLocale().newMessage("&7Removed &6" + amountRemoved + (all ? " " : " stacked ") - + Methods.formatText(type.toLowerCase(), true) + " &7Successfully.").sendPrefixedMessage(sender); + + TextUtils.formatText(type.toLowerCase(), true) + " &7Successfully.").sendPrefixedMessage(sender); } return ReturnType.SUCCESS; } diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java index 0b2d174..318d114 100644 --- a/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java +++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java @@ -1,6 +1,7 @@ package com.songoda.ultimatestacker.commands; import com.songoda.core.commands.AbstractCommand; +import com.songoda.core.utils.TextUtils; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.stackable.entity.EntityStack; import com.songoda.ultimatestacker.utils.Methods; @@ -51,7 +52,7 @@ public class CommandSpawn extends AbstractCommand { if (types.isSpawnable() && types.isAlive() && !types.toString().contains("ARMOR")) list.append(types.name().toUpperCase().replace(" ", "_")).append("&7, &6"); } - sender.sendMessage(Methods.formatText("&6" + list)); + sender.sendMessage(TextUtils.formatText("&6" + list)); } else { LivingEntity entity = (LivingEntity)player.getWorld().spawnEntity(player.getTargetBlock((Set)null, 200).getLocation(), type); EntityStack stack = plugin.getEntityStackManager().addStack(entity); diff --git a/src/main/java/com/songoda/ultimatestacker/gui/GUIConvertWhat.java b/src/main/java/com/songoda/ultimatestacker/gui/GUIConvertWhat.java index d41e860..51d62b8 100644 --- a/src/main/java/com/songoda/ultimatestacker/gui/GUIConvertWhat.java +++ b/src/main/java/com/songoda/ultimatestacker/gui/GUIConvertWhat.java @@ -3,6 +3,7 @@ package com.songoda.ultimatestacker.gui; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.gui.Gui; import com.songoda.core.gui.GuiUtils; +import com.songoda.core.utils.TextUtils; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.convert.Convert; import com.songoda.ultimatestacker.utils.Methods; @@ -62,6 +63,6 @@ public class GUIConvertWhat extends Gui { convertFrom.disablePlugin(); exit(); - player.sendMessage(Methods.formatText("&7Data converted successfully. Remove &6" + convertFrom.getName() + " &7and restart your server to continue.")); + player.sendMessage(TextUtils.formatText("&7Data converted successfully. Remove &6" + convertFrom.getName() + " &7and restart your server to continue.")); } } diff --git a/src/main/java/com/songoda/ultimatestacker/stackable/block/BlockStack.java b/src/main/java/com/songoda/ultimatestacker/stackable/block/BlockStack.java index ab08de5..2ce73bf 100644 --- a/src/main/java/com/songoda/ultimatestacker/stackable/block/BlockStack.java +++ b/src/main/java/com/songoda/ultimatestacker/stackable/block/BlockStack.java @@ -1,6 +1,7 @@ package com.songoda.ultimatestacker.stackable.block; import com.songoda.core.compatibility.CompatibleMaterial; +import com.songoda.core.utils.TextUtils; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.settings.Settings; import com.songoda.ultimatestacker.stackable.Hologramable; @@ -83,12 +84,12 @@ public class BlockStack implements Stackable, Hologramable { @Override public String getHologramName() { String nameFormat = Settings.NAME_FORMAT_BLOCK.getString(); - String displayName = Methods.formatText(material.name().toLowerCase().replace("_", " "), true); + String displayName = TextUtils.formatText(material.name().toLowerCase().replace("_", " "), true); nameFormat = nameFormat.replace("{TYPE}", displayName); nameFormat = nameFormat.replace("{AMT}", Integer.toString(amount)); - return Methods.formatText(nameFormat).trim(); + return TextUtils.formatText(nameFormat).trim(); } @Override diff --git a/src/main/java/com/songoda/ultimatestacker/utils/Methods.java b/src/main/java/com/songoda/ultimatestacker/utils/Methods.java index cbba1d8..b499312 100644 --- a/src/main/java/com/songoda/ultimatestacker/utils/Methods.java +++ b/src/main/java/com/songoda/ultimatestacker/utils/Methods.java @@ -7,13 +7,9 @@ import com.songoda.core.utils.TextUtils; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.settings.Settings; import com.songoda.ultimatestacker.stackable.entity.custom.CustomEntity; -import com.songoda.ultimatestacker.stackable.entity.custom.CustomEntityManager; -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.CreatureSpawner; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -24,9 +20,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.ItemMeta; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; import java.util.Map; public class Methods { @@ -92,7 +85,7 @@ public class Methods { public static String compileItemName(ItemStack item, int amount) { String nameFormat = Settings.NAME_FORMAT_ITEM.getString(); - String displayName = Methods.formatText(UltimateStacker.getInstance().getItemFile() + String displayName = TextUtils.formatText(UltimateStacker.getInstance().getItemFile() .getString("Items." + item.getType().name() + ".Display Name")); if (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) @@ -110,31 +103,31 @@ public class Methods { String info = TextUtils.convertToInvisibleString(Methods.insertSemicolon(String.valueOf(amount)) + ":"); - return info + Methods.formatText(nameFormat).trim(); + return info + TextUtils.formatText(nameFormat).trim(); } public static String compileSpawnerName(EntityType entityType, int amount) { String nameFormat = UltimateStacker.getInstance().getConfig().getString("Spawners.Name Format"); - String displayName = Methods.formatText(UltimateStacker.getInstance().getSpawnerFile().getString("Spawners." + entityType.name() + ".Display Name")); + String displayName = TextUtils.formatText(UltimateStacker.getInstance().getSpawnerFile().getString("Spawners." + entityType.name() + ".Display Name")); nameFormat = nameFormat.replace("{TYPE}", displayName); nameFormat = nameFormat.replace("{AMT}", Integer.toString(amount)); - return Methods.formatText(nameFormat).trim(); + return TextUtils.formatText(nameFormat).trim(); } public static String compileEntityName(Entity entity, int amount) { String nameFormat = Settings.NAME_FORMAT_ENTITY.getString(); - String displayName = Methods.formatText(UltimateStacker.getInstance().getMobFile().getString("Mobs." + entity.getType().name() + ".Display Name")); + String displayName = TextUtils.formatText(UltimateStacker.getInstance().getMobFile().getString("Mobs." + entity.getType().name() + ".Display Name")); - CustomEntity customEntity = UltimateStacker.getInstance().getCustomEntityManager().getCustomEntity(entity); + CustomEntity customEntity = UltimateStacker.getInstance().getCustomEntityManager().getCustomEntity(entity); if (customEntity != null) displayName = customEntity.getDisplayName(entity); nameFormat = nameFormat.replace("{TYPE}", displayName); nameFormat = nameFormat.replace("{AMT}", Integer.toString(amount)); - return Methods.formatText(nameFormat).trim(); + return TextUtils.formatText(nameFormat).trim(); } public static void takeItem(Player player, int amount) { @@ -173,31 +166,6 @@ public class Methods { return true; } - private static Map serializeCache = new HashMap<>(); - - /** - * Deserializes a location from the string. - * - * @param str The string to parse. - * @return The location that was serialized in the string. - */ - public static Location unserializeLocation(String str) { - if (str == null || str.equals("")) - return null; - if (serializeCache.containsKey(str)) { - return serializeCache.get(str).clone(); - } - String cacheKey = str; - str = str.replace("y:", ":").replace("z:", ":").replace("w:", "").replace("x:", ":").replace("/", "."); - List args = Arrays.asList(str.split("\\s*:\\s*")); - - World world = Bukkit.getWorld(args.get(0)); - double x = Double.parseDouble(args.get(1)), y = Double.parseDouble(args.get(2)), z = Double.parseDouble(args.get(3)); - Location location = new Location(world, x, y, z, 0, 0); - serializeCache.put(cacheKey, location.clone()); - return location; - } - public static String insertSemicolon(String s) { if (s == null || s.equals("")) return ""; @@ -205,37 +173,4 @@ public class Methods { for (char c : s.toCharArray()) hidden.append(";").append(c); return hidden.toString(); } - - - public static String formatText(String text) { - if (text == null || text.equals("")) - return ""; - return formatText(text, false); - } - - public static String formatText(String text, boolean cap) { - if (text == null || text.equals("")) - return ""; - if (cap) - text = text.substring(0, 1).toUpperCase() + text.substring(1); - return ChatColor.translateAlternateColorCodes('&', text); - } - - public static class Tuple { - public final key x; - public final value y; - - public Tuple(key x, value y) { - this.x = x; - this.y = y; - } - - public key getKey() { - return this.x; - } - - public value getValue() { - return this.y; - } - } } From 4abaa3123f457222f516c85b317cd2fdacf80306 Mon Sep 17 00:00:00 2001 From: Brianna Date: Fri, 5 Mar 2021 08:06:50 -0600 Subject: [PATCH 4/4] version 2.1.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e092bac..c467fdc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ com.songoda UltimateStacker 4.0.0 - 2.1.3 + 2.1.4 clean install UltimateStacker-${project.version}