From 4a247d1ba9fd9992dd7690a0f27b564c4c8bce7e Mon Sep 17 00:00:00 2001 From: Christian Koop Date: Sun, 30 May 2021 08:25:09 +0200 Subject: [PATCH 1/4] Update holograms in bulk (SD-7586) **Requires at least SongodaCore 2.4.57** Drastically improves performance when hooked into *Holographic Displays* + minor code cleanup --- .../songoda/epicfurnaces/EpicFurnaces.java | 107 +++++++++--------- .../songoda/epicfurnaces/gui/GUIOverview.java | 1 - .../epicfurnaces/gui/GUIRemoteAccess.java | 1 - .../listeners/BlockListeners.java | 6 +- .../listeners/InventoryListeners.java | 1 - .../epicfurnaces/settings/Settings.java | 8 +- .../epicfurnaces/tasks/FurnaceTask.java | 6 +- .../epicfurnaces/tasks/HologramTask.java | 5 +- .../songoda/epicfurnaces/utils/Methods.java | 4 +- 9 files changed, 63 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/songoda/epicfurnaces/EpicFurnaces.java b/src/main/java/com/songoda/epicfurnaces/EpicFurnaces.java index 6de341f..4d2ea96 100644 --- a/src/main/java/com/songoda/epicfurnaces/EpicFurnaces.java +++ b/src/main/java/com/songoda/epicfurnaces/EpicFurnaces.java @@ -56,6 +56,8 @@ import org.bukkit.plugin.PluginManager; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -63,7 +65,7 @@ import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; -public class EpicFurnaces extends SongodaPlugin { +public class EpicFurnaces extends SongodaPlugin { private static EpicFurnaces INSTANCE; @@ -247,14 +249,6 @@ public class EpicFurnaces extends SongodaPlugin { @Override public void onDataLoad() { - // Register Hologram Plugin - - if (Settings.HOLOGRAMS.getBoolean()) { - for (Furnace furnace : getFurnaceManager().getFurnaces().values()) { - if (furnace.getLocation() == null || furnace.getLocation().getWorld() == null) - continue; - } - } } @Override @@ -267,67 +261,70 @@ public class EpicFurnaces extends SongodaPlugin { @Override public List getExtraConfig() { - return Arrays.asList(levelsFile); + return Collections.singletonList(levelsFile); } public void clearHologram(Furnace furnace) { HologramManager.removeHologram(furnace.getLocation().add(0, .15, 0)); } - public void updateHologram(Furnace furnace) { + public void updateHolograms(Collection furnaces) { // are holograms enabled? if (!Settings.HOLOGRAMS.getBoolean() || !HologramManager.getManager().isEnabled()) return; - // don't try to load furnaces in chunks that aren't loaded - if (!furnace.isInLoadedChunk()) return; - BlockState state = furnace.getLocation().getBlock().getState(); + Map> holograms = new HashMap<>(furnaces.size()); - // verify that this is a furnace - if (!(state instanceof org.bukkit.block.Furnace)) return; + for (Furnace furnace : furnaces) { + // don't try to load furnaces in chunks that aren't loaded + if (!furnace.isInLoadedChunk()) continue; - org.bukkit.block.Furnace furnaceBlock = ((org.bukkit.block.Furnace) state); + BlockState state = furnace.getLocation().getBlock().getState(); - int performance = (furnaceBlock.getCookTime() - furnace.getPerformanceTotal(furnaceBlock.getType())) <= 0 ? 0 : furnace.getPerformanceTotal(furnaceBlock.getType()); + // verify that this is a furnace + if (!(state instanceof org.bukkit.block.Furnace)) continue; - float percent = (float) (furnaceBlock.getCookTime() - performance) / (200 - performance); + org.bukkit.block.Furnace furnaceBlock = ((org.bukkit.block.Furnace) state); - int progressBars = (int) (6 * percent) + (percent == 0 ? 0 : 1); - int leftOver = (6 - progressBars); + int performance = (furnaceBlock.getCookTime() - furnace.getPerformanceTotal(furnaceBlock.getType())) <= 0 ? 0 : furnace.getPerformanceTotal(furnaceBlock.getType()); + float percent = (float) (furnaceBlock.getCookTime() - performance) / (200 - performance); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < progressBars; i++) { - sb.append("&a="); - } - for (int i = 0; i < leftOver; i++) { - sb.append("&c="); + int progressBars = (int) (6 * percent) + (percent == 0 ? 0 : 1); + int leftOver = (6 - progressBars); + + String progress; + + if (furnaceBlock.getInventory().getFuel() != null) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < progressBars; i++) { + sb.append("&a="); + } + for (int i = 0; i < leftOver; i++) { + sb.append("&c="); + } + + progress = Methods.formatText(sb.toString()); + } else { + progress = getLocale().getMessage("general.hologram.outoffuel").getMessage(); + } + + int inAmt = 0; + int outAmt = 0; + if (furnaceBlock.getInventory().getSmelting() != null) { + inAmt = furnaceBlock.getInventory().getSmelting().getAmount(); + } + if (furnaceBlock.getInventory().getResult() != null) { + outAmt = furnaceBlock.getInventory().getResult().getAmount(); + } + + String stats = getLocale().getMessage("general.hologram.stats") + .processPlaceholder("in", inAmt) + .processPlaceholder("out", Math.min(outAmt, 64)).getMessage(); + + holograms.put(furnace.getLocation().add(0, .15, 0), Arrays.asList(progress, stats)); } - ArrayList lines = new ArrayList<>(); - - String progress = Methods.formatText(sb.toString()); - - if (furnaceBlock.getInventory().getFuel() == null) { - progress = getLocale().getMessage("general.hologram.outoffuel").getMessage(); - } - - int inAmt = 0; - int outAmt = 0; - if (furnaceBlock.getInventory().getSmelting() != null) { - inAmt = furnaceBlock.getInventory().getSmelting().getAmount(); - } - if (furnaceBlock.getInventory().getResult() != null) { - outAmt = furnaceBlock.getInventory().getResult().getAmount(); - } - - String stats = getLocale().getMessage("general.hologram.stats") - .processPlaceholder("in", inAmt) - .processPlaceholder("out", Math.min(outAmt, 64)).getMessage(); - - lines.add(progress); - lines.add(stats); - - // create the hologram - HologramManager.updateHologram(furnace.getLocation().add(0, .15, 0), lines); + // Update holograms + HologramManager.bulkUpdateHolograms(holograms); } private void loadLevelManager() { @@ -424,7 +421,7 @@ public class EpicFurnaces extends SongodaPlugin { // Legacy trash. if (item.getItemMeta().getDisplayName().contains(":")) { - String arr[] = (item.getItemMeta().getDisplayName().replace("§", "")).split(":"); + String[] arr = (item.getItemMeta().getDisplayName().replace("§", "")).split(":"); return Integer.parseInt(arr[0]); } else { return 1; @@ -440,7 +437,7 @@ public class EpicFurnaces extends SongodaPlugin { // Legacy trash. if (item.getItemMeta().getDisplayName().contains(":")) { - String arr[] = (item.getItemMeta().getDisplayName().replace("§", "")).split(":"); + String[] arr = (item.getItemMeta().getDisplayName().replace("§", "")).split(":"); return Integer.parseInt(arr[1]); } else { return 0; diff --git a/src/main/java/com/songoda/epicfurnaces/gui/GUIOverview.java b/src/main/java/com/songoda/epicfurnaces/gui/GUIOverview.java index a3c21da..5109154 100644 --- a/src/main/java/com/songoda/epicfurnaces/gui/GUIOverview.java +++ b/src/main/java/com/songoda/epicfurnaces/gui/GUIOverview.java @@ -2,7 +2,6 @@ package com.songoda.epicfurnaces.gui; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.gui.CustomizableGui; -import com.songoda.core.gui.Gui; import com.songoda.core.gui.GuiUtils; import com.songoda.core.input.ChatPrompt; import com.songoda.epicfurnaces.EpicFurnaces; diff --git a/src/main/java/com/songoda/epicfurnaces/gui/GUIRemoteAccess.java b/src/main/java/com/songoda/epicfurnaces/gui/GUIRemoteAccess.java index 82b5501..53efa9b 100644 --- a/src/main/java/com/songoda/epicfurnaces/gui/GUIRemoteAccess.java +++ b/src/main/java/com/songoda/epicfurnaces/gui/GUIRemoteAccess.java @@ -16,7 +16,6 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; -import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; diff --git a/src/main/java/com/songoda/epicfurnaces/listeners/BlockListeners.java b/src/main/java/com/songoda/epicfurnaces/listeners/BlockListeners.java index b84e9b4..b2cc32b 100644 --- a/src/main/java/com/songoda/epicfurnaces/listeners/BlockListeners.java +++ b/src/main/java/com/songoda/epicfurnaces/listeners/BlockListeners.java @@ -16,6 +16,7 @@ import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.ItemStack; +import java.util.Collections; import java.util.List; /** @@ -46,14 +47,13 @@ public class BlockListeners implements Listener { return; } } - } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { if (plugin.getBlacklistHandler().isBlacklisted(event.getPlayer().getWorld()) - || !event.getBlock().getType().name().contains("FURNACE") && !event.getBlock().getType().name().contains("SMOKER")) + || !event.getBlock().getType().name().contains("FURNACE") && !event.getBlock().getType().name().contains("SMOKER")) return; ItemStack item = event.getItemInHand(); @@ -74,7 +74,7 @@ public class BlockListeners implements Listener { plugin.getFurnaceManager().addFurnace(furnace); plugin.getDataManager().createFurnace(furnace); - plugin.updateHologram(furnace); + plugin.updateHolograms(Collections.singleton(furnace)); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/com/songoda/epicfurnaces/listeners/InventoryListeners.java b/src/main/java/com/songoda/epicfurnaces/listeners/InventoryListeners.java index e209784..971a767 100644 --- a/src/main/java/com/songoda/epicfurnaces/listeners/InventoryListeners.java +++ b/src/main/java/com/songoda/epicfurnaces/listeners/InventoryListeners.java @@ -36,7 +36,6 @@ public class InventoryListeners implements Listener { furnace.updateCook(); } - @SuppressWarnings("unchecked") @EventHandler public void onInventoryClick(InventoryClickEvent event) { if (event.getSlot() != 64537) { diff --git a/src/main/java/com/songoda/epicfurnaces/settings/Settings.java b/src/main/java/com/songoda/epicfurnaces/settings/Settings.java index fd3f41c..712a95b 100644 --- a/src/main/java/com/songoda/epicfurnaces/settings/Settings.java +++ b/src/main/java/com/songoda/epicfurnaces/settings/Settings.java @@ -5,11 +5,8 @@ import com.songoda.core.configuration.Config; import com.songoda.core.configuration.ConfigSetting; import com.songoda.core.hooks.EconomyManager; import com.songoda.core.hooks.HologramManager; -import com.songoda.core.hooks.ProtectionManager; import com.songoda.epicfurnaces.EpicFurnaces; -import java.util.stream.Collectors; - public class Settings { static final Config config = EpicFurnaces.getInstance().getCoreConfig(); @@ -44,8 +41,7 @@ public class Settings { public static final ConfigSetting HOLOGRAM_PLUGIN = new ConfigSetting(config, "Main.Hologram", HologramManager.getHolograms() == null ? "HolographicDisplays" : HologramManager.getHolograms().getName(), "Which hologram plugin should be used?", - "You can choose from \"" + HologramManager.getManager().getRegisteredPlugins().stream().collect(Collectors.joining(", ")) + "\"."); - + "You can choose from \"" + String.join(", ", HologramManager.getManager().getRegisteredPlugins()) + "\"."); public static final ConfigSetting HOLOGRAMS = new ConfigSetting(config, "Main.Furnaces Have Holograms", true); @@ -68,7 +64,7 @@ public class Settings { public static final ConfigSetting ECONOMY_PLUGIN = new ConfigSetting(config, "Main.Economy", EconomyManager.getEconomy() == null ? "Vault" : EconomyManager.getEconomy().getName(), "Which economy plugin should be used?", - "Supported plugins you have installed: \"" + EconomyManager.getManager().getRegisteredPlugins().stream().collect(Collectors.joining("\", \"")) + "\"."); + "Supported plugins you have installed: \"" + String.join("\", \"", EconomyManager.getManager().getRegisteredPlugins()) + "\"."); public static final ConfigSetting REWARD_ICON = new ConfigSetting(config, "Interfaces.Reward Icon", "GOLDEN_APPLE"); public static final ConfigSetting PERFORMANCE_ICON = new ConfigSetting(config, "Interfaces.Performance Icon", "REDSTONE"); diff --git a/src/main/java/com/songoda/epicfurnaces/tasks/FurnaceTask.java b/src/main/java/com/songoda/epicfurnaces/tasks/FurnaceTask.java index 6d9bbdd..7aafc62 100644 --- a/src/main/java/com/songoda/epicfurnaces/tasks/FurnaceTask.java +++ b/src/main/java/com/songoda/epicfurnaces/tasks/FurnaceTask.java @@ -19,7 +19,7 @@ public class FurnaceTask extends BukkitRunnable { private static FurnaceTask instance; private final EpicFurnaces plugin; - final HashSet toRemove = new HashSet(); + final HashSet toRemove = new HashSet<>(); boolean doParticles; private FurnaceTask(EpicFurnaces plugin) { @@ -56,7 +56,7 @@ public class FurnaceTask extends BukkitRunnable { } }); if (!toRemove.isEmpty()) { - toRemove.stream().forEach(l -> plugin.getFurnaceManager().removeFurnace(l)); + toRemove.forEach(l -> plugin.getFurnaceManager().removeFurnace(l)); toRemove.clear(); } } @@ -81,7 +81,7 @@ public class FurnaceTask extends BukkitRunnable { else if (block.getType() == Material.ICE || block.getType() == Material.PACKED_ICE) block.setType(Material.WATER); else - continue; + continue; if (doParticles) { float xx = (float) (0 + (Math.random() * .75)); diff --git a/src/main/java/com/songoda/epicfurnaces/tasks/HologramTask.java b/src/main/java/com/songoda/epicfurnaces/tasks/HologramTask.java index 4cd5c85..009d06b 100644 --- a/src/main/java/com/songoda/epicfurnaces/tasks/HologramTask.java +++ b/src/main/java/com/songoda/epicfurnaces/tasks/HologramTask.java @@ -2,7 +2,6 @@ package com.songoda.epicfurnaces.tasks; import com.songoda.core.hooks.HologramManager; import com.songoda.epicfurnaces.EpicFurnaces; -import com.songoda.epicfurnaces.furnace.Furnace; import org.bukkit.scheduler.BukkitRunnable; public class HologramTask extends BukkitRunnable { @@ -28,8 +27,6 @@ public class HologramTask extends BukkitRunnable { public void run() { if (!HologramManager.getManager().isEnabled()) return; - for (Furnace furnace : plugin.getFurnaceManager().getFurnaces().values()) { - plugin.updateHologram(furnace); - } + plugin.updateHolograms(plugin.getFurnaceManager().getFurnaces().values()); } } \ No newline at end of file diff --git a/src/main/java/com/songoda/epicfurnaces/utils/Methods.java b/src/main/java/com/songoda/epicfurnaces/utils/Methods.java index 562065d..89bfd66 100644 --- a/src/main/java/com/songoda/epicfurnaces/utils/Methods.java +++ b/src/main/java/com/songoda/epicfurnaces/utils/Methods.java @@ -6,7 +6,6 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.block.Block; import java.text.DecimalFormat; import java.util.Arrays; @@ -52,7 +51,8 @@ public class Methods { str = str.replace(".0", "").replace("/", ""); return str; } - private static Map serializeCache = new HashMap<>(); + + private static final Map serializeCache = new HashMap<>(); /** * Deserializes a location from the string. From 3d8fb5af0b7ecc50ce0c32111ea43073b4e0a12a Mon Sep 17 00:00:00 2001 From: Brianna Date: Sat, 12 Jun 2021 22:05:21 -0500 Subject: [PATCH 2/4] Replaced the script engine with the one in core. --- .../songoda/epicfurnaces/furnace/Furnace.java | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/songoda/epicfurnaces/furnace/Furnace.java b/src/main/java/com/songoda/epicfurnaces/furnace/Furnace.java index 18a3956..6826844 100644 --- a/src/main/java/com/songoda/epicfurnaces/furnace/Furnace.java +++ b/src/main/java/com/songoda/epicfurnaces/furnace/Furnace.java @@ -4,6 +4,7 @@ import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.ServerVersion; import com.songoda.core.gui.GuiManager; import com.songoda.core.hooks.EconomyManager; +import com.songoda.core.math.MathUtils; import com.songoda.core.hooks.ProtectionManager; import com.songoda.epicfurnaces.EpicFurnaces; import com.songoda.epicfurnaces.boost.BoostData; @@ -25,9 +26,6 @@ import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.InventoryHolder; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -56,7 +54,6 @@ public class Furnace { private final List radiusOverheat = new ArrayList<>(); private final List radiusFuelshare = new ArrayList<>(); private final List accessList = new ArrayList<>(); - private final Map cache = new HashMap<>(); public Furnace(Location location) { this.location = location; @@ -244,20 +241,7 @@ public class Furnace { public int getPerformanceTotal(Material material) { String cap = (material.name().contains("BLAST") || material.name().contains("SMOKER") ? "100" : "200"); String equation = "(" + level.getPerformance() + " / 100) * " + cap; - try { - if (!cache.containsKey(equation)) { - ScriptEngineManager mgr = new ScriptEngineManager(null); - ScriptEngine engine = mgr.getEngineByName("JavaScript"); - int num = (int) Math.round(Double.parseDouble(engine.eval("(" + level.getPerformance() + " / 100) * " + cap).toString())); - cache.put(equation, num); - return num; - } else { - return cache.get(equation); - } - } catch (ScriptException e) { - e.printStackTrace(); - } - return 0; + return (int) MathUtils.eval(equation); } public boolean addToAccessList(OfflinePlayer player) { From 193d49d08ed566d9d887c8ae186201623c4d566e Mon Sep 17 00:00:00 2001 From: Brianna Date: Sun, 13 Jun 2021 11:54:07 -0500 Subject: [PATCH 3/4] 1.17 Support --- pom.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a14db4a..931d59b 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.1.0 + 3.3.0-SNAPSHOT shaded @@ -79,6 +79,12 @@ + + + apache.snapshots + https://repository.apache.org/snapshots/ + + public @@ -89,7 +95,7 @@ org.spigotmc spigot - 1.16.1 + 1.17 com.songoda From 8feed68dbc9bbc027ad397c1c51a7c2019f998fc Mon Sep 17 00:00:00 2001 From: Brianna Date: Sun, 13 Jun 2021 11:54:39 -0500 Subject: [PATCH 4/4] version 4.7.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 931d59b..ada667e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ com.songoda EpicFurnaces 4.0.0 - 4.7.1 + 4.7.2 clean install EpicFurnaces-${project.version}