From cb8eb2911201c05a665356fd8058764ded3df1e6 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 22 May 2017 20:21:13 +0200 Subject: [PATCH] Fixed a few issues with holograms --- .../shopchest/config/HologramFormat.java | 23 ++++++++--- .../de/epiceric/shopchest/nms/Hologram.java | 41 ++++++++++++++----- .../java/de/epiceric/shopchest/shop/Shop.java | 18 ++++---- .../epiceric/shopchest/utils/ShopUtils.java | 18 +++++++- 4 files changed, 76 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/epiceric/shopchest/config/HologramFormat.java b/src/main/java/de/epiceric/shopchest/config/HologramFormat.java index 4f9b8eb..a988ed5 100644 --- a/src/main/java/de/epiceric/shopchest/config/HologramFormat.java +++ b/src/main/java/de/epiceric/shopchest/config/HologramFormat.java @@ -20,10 +20,11 @@ public class HologramFormat { } private ShopChest plugin; + private File configFile; private YamlConfiguration config; public HologramFormat(ShopChest plugin) { - File configFile = new File(plugin.getDataFolder(), "hologram-format.yml"); + this.configFile = new File(plugin.getDataFolder(), "hologram-format.yml"); this.config = YamlConfiguration.loadConfiguration(configFile); this.plugin = plugin; } @@ -48,10 +49,8 @@ public class HologramFormat { for (String sReq : requirements) { for (Requirement req : values.keySet()) { if (sReq.contains(req.toString())) { - if (!sReq.replace(req.toString(), "").trim().isEmpty()) { - if (!eval(sReq, values)) { - continue optionLoop; - } + if (!eval(sReq, values)) { + continue optionLoop; } } } @@ -63,6 +62,10 @@ public class HologramFormat { return ""; } + public void reload() { + config = YamlConfiguration.loadConfiguration(configFile); + } + /** Returns whether the hologram text has to change dynamically without reloading */ public boolean isDynamic() { int count = getLineCount(); @@ -70,10 +73,18 @@ public class HologramFormat { ConfigurationSection options = config.getConfigurationSection("lines." + i + ".options"); for (String key : options.getKeys(false)) { - String format = options.getConfigurationSection(key).getString("format"); + ConfigurationSection option = options.getConfigurationSection(key); + + String format = option.getString("format"); if (format.contains(Regex.STOCK.getName())) { return true; } + + for (String req : option.getStringList("requirements")) { + if (req.contains(Requirement.IN_STOCK.toString())) { + return true; + } + } } } diff --git a/src/main/java/de/epiceric/shopchest/nms/Hologram.java b/src/main/java/de/epiceric/shopchest/nms/Hologram.java index dfe4ff9..8533b3f 100644 --- a/src/main/java/de/epiceric/shopchest/nms/Hologram.java +++ b/src/main/java/de/epiceric/shopchest/nms/Hologram.java @@ -1,6 +1,7 @@ package de.epiceric.shopchest.nms; import de.epiceric.shopchest.ShopChest; +import de.epiceric.shopchest.config.Config; import de.epiceric.shopchest.utils.Utils; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -24,6 +25,7 @@ public class Hologram { private Location location; private List visible = new ArrayList<>(); private ShopChest plugin; + private Config config; private Class entityArmorStandClass = Utils.getNMSClass("EntityArmorStand"); private Class packetPlayOutSpawnEntityLivingClass = Utils.getNMSClass("PacketPlayOutSpawnEntityLiving"); @@ -32,6 +34,7 @@ public class Hologram { public Hologram(ShopChest plugin, String[] lines, Location location) { this.plugin = plugin; + this.config = plugin.getShopChestConfig(); this.location = location; Class[] requiredClasses = new Class[] { @@ -54,16 +57,27 @@ public class Hologram { text = ChatColor.translateAlternateColorCodes('&', text); - for (int i = line; i < armorStands.size(); i++) { - ArmorStand stand = armorStands.get(i); - stand.teleport(stand.getLocation().subtract(0, 0.25, 0)); + if (config.hologram_fixed_bottom) { + for (int i = 0; i < line; i++) { + ArmorStand stand = armorStands.get(i); + stand.teleport(stand.getLocation().add(0, 0.25, 0)); + } + } else { + for (int i = line; i < armorStands.size(); i++) { + ArmorStand stand = armorStands.get(i); + stand.teleport(stand.getLocation().subtract(0, 0.25, 0)); + } } if (line >= armorStands.size()) { line = armorStands.size(); } - Location location = this.location.clone().subtract(0, line * 0.25, 0); + Location location = this.location.clone(); + + if (!config.hologram_fixed_bottom) { + location.subtract(0, line * 0.25, 0); + } try { ArmorStand armorStand = (ArmorStand) location.getWorld().spawnEntity(location, EntityType.ARMOR_STAND); @@ -92,7 +106,7 @@ public class Hologram { text = ChatColor.translateAlternateColorCodes('&', text); - if (armorStands.size() <= line) { + if (line >= armorStands.size()) { addLine(line, text); return; } @@ -101,12 +115,19 @@ public class Hologram { } public void removeLine(int line) { - for (int i = line + 1; i < armorStands.size(); i++) { - ArmorStand stand = armorStands.get(i); - stand.teleport(stand.getLocation().add(0, 0.25, 0)); - } + if (line < armorStands.size()) { + if (config.hologram_fixed_bottom) { + for (int i = 0; i < line; i++) { + ArmorStand stand = armorStands.get(i); + stand.teleport(stand.getLocation().subtract(0, 0.25, 0)); + } + } else { + for (int i = line + 1; i < armorStands.size(); i++) { + ArmorStand stand = armorStands.get(i); + stand.teleport(stand.getLocation().add(0, 0.25, 0)); + } + } - if (armorStands.size() > line) { armorStands.get(line).remove(); armorStands.remove(line); nmsArmorStands.remove(line); diff --git a/src/main/java/de/epiceric/shopchest/shop/Shop.java b/src/main/java/de/epiceric/shopchest/shop/Shop.java index 1ebf58a..f8d0204 100644 --- a/src/main/java/de/epiceric/shopchest/shop/Shop.java +++ b/src/main/java/de/epiceric/shopchest/shop/Shop.java @@ -271,29 +271,33 @@ public class Shop { int y = b.getY(); int z = b.getZ(); + double subtractY = 0.6; + + if (config.hologram_fixed_bottom) subtractY = 0.85; + if (doubleChest) { Chest r = chests[0]; Chest l = chests[1]; if (b.getLocation().equals(r.getLocation())) { if (r.getX() != l.getX()) { - holoLocation = new Location(w, x, y - 0.6, z + 0.5); + holoLocation = new Location(w, x, y - subtractY, z + 0.5); } else if (r.getZ() != l.getZ()) { - holoLocation = new Location(w, x + 0.5, y - 0.6, z); + holoLocation = new Location(w, x + 0.5, y - subtractY, z); } else { - holoLocation = new Location(w, x + 0.5, y - 0.6, z + 0.5); + holoLocation = new Location(w, x + 0.5, y - subtractY, z + 0.5); } } else { if (r.getX() != l.getX()) { - holoLocation = new Location(w, x + 1, y - 0.6, z + 0.5); + holoLocation = new Location(w, x + 1, y - subtractY, z + 0.5); } else if (r.getZ() != l.getZ()) { - holoLocation = new Location(w, x + 0.5, y - 0.6, z + 1); + holoLocation = new Location(w, x + 0.5, y - subtractY, z + 1); } else { - holoLocation = new Location(w, x + 0.5, y - 0.6, z + 0.5); + holoLocation = new Location(w, x + 0.5, y - subtractY, z + 0.5); } } } else { - holoLocation = new Location(w, x + 0.5, y - 0.6, z + 0.5); + holoLocation = new Location(w, x + 0.5, y - subtractY, z + 0.5); } holoLocation.add(0, config.hologram_lift, 0); diff --git a/src/main/java/de/epiceric/shopchest/utils/ShopUtils.java b/src/main/java/de/epiceric/shopchest/utils/ShopUtils.java index c7cee8e..680d522 100644 --- a/src/main/java/de/epiceric/shopchest/utils/ShopUtils.java +++ b/src/main/java/de/epiceric/shopchest/utils/ShopUtils.java @@ -3,6 +3,7 @@ package de.epiceric.shopchest.utils; import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.config.Config; import de.epiceric.shopchest.shop.Shop; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -205,6 +206,7 @@ public class ShopUtils { if (reloadConfig) { plugin.getShopChestConfig().reload(false, true, showConsoleMessages); + plugin.getHologramFormat().reload(); plugin.getUpdater().setMaxDelta(plugin.getShopChestConfig().update_quality.getTime()); } @@ -227,6 +229,11 @@ public class ShopUtils { addShop(shop, false); } } + + for (Player player : Bukkit.getOnlinePlayers()) { + updateShops(player, true); + } + if (callback != null) callback.callSyncResult(shops.length); } } @@ -247,7 +254,16 @@ public class ShopUtils { * @param player Player to show the updates */ public void updateShops(Player player) { - if (player.getLocation().equals(playerLocation.get(player))) { + updateShops(player, false); + } + + /** + * Update hologram and item of all shops for a player + * @param player Player to show the updates + * @param force Whether update should be forced even if player has not moved + */ + public void updateShops(Player player, boolean force) { + if (!force && player.getLocation().equals(playerLocation.get(player))) { // Player has not moved, so don't calculate shops again. return; }