From 9cf3b74609fb02688e41479966fbe456952638e5 Mon Sep 17 00:00:00 2001 From: Gabriel Hautclocq Date: Fri, 4 Oct 2019 00:51:57 +0200 Subject: [PATCH] fixed disappearing markers (webbukkit#2533), many thanks to tiagoad --- .../dynmap/common/DynmapServerInterface.java | 11 +++++++++++ .../dynmap/markers/impl/MarkerSignManager.java | 12 ++++-------- .../org/dynmap/forge_1_10_2/DynmapPlugin.java | 17 +++++++++++++++++ .../org/dynmap/forge_1_11_2/DynmapPlugin.java | 17 +++++++++++++++++ .../org/dynmap/forge_1_12_2/DynmapPlugin.java | 17 +++++++++++++++++ .../org/dynmap/forge_1_13_2/DynmapPlugin.java | 8 ++++++++ .../org/dynmap/forge_1_8_9/DynmapPlugin.java | 17 +++++++++++++++++ .../org/dynmap/forge_1_9_4/DynmapPlugin.java | 17 +++++++++++++++++ .../java/org/dynmap/bukkit/DynmapPlugin.java | 17 +++++++++++++++++ 9 files changed, 125 insertions(+), 8 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/common/DynmapServerInterface.java b/DynmapCore/src/main/java/org/dynmap/common/DynmapServerInterface.java index 3271300a..733a9a84 100644 --- a/DynmapCore/src/main/java/org/dynmap/common/DynmapServerInterface.java +++ b/DynmapCore/src/main/java/org/dynmap/common/DynmapServerInterface.java @@ -178,6 +178,17 @@ public abstract class DynmapServerInterface { * @return block ID, or -1 if chunk at given coordinate isn't loaded */ public abstract int getBlockIDAt(String wname, int x, int y, int z); + + /** + * Checks if a sign is at a given coordinate in a given world (if chunk is loaded) + * @param wname - world name + * @param x - X coordinate + * @param y - Y coordinate + * @param z - Z coordinate + * @return 1 if a sign is at the location, 0 if it's not, -1 if the chunk isn't loaded + */ + public abstract int isSignAt(String wname, int x, int y, int z); + /** * Get current TPS for server (20.0 is nominal) * @return ticks per second diff --git a/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java b/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java index 123cdc8c..b97c2051 100644 --- a/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java +++ b/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java @@ -19,10 +19,7 @@ public class MarkerSignManager { private static MarkerSignManager mgr = null; private static DynmapCore plugin = null; private static String defSignSet = null; - - private static final int SIGNPOST_ID = 63; - private static final int WALLSIGN_ID = 68; - + private static class SignRec { String wname; int x, y, z; @@ -143,14 +140,13 @@ public class MarkerSignManager { for(Iterator> iter = sign_cache.entrySet().iterator(); iter.hasNext(); ) { Entry ent = iter.next(); SignRec r = ent.getValue(); - /* If deleted marker, remote */ + /* If deleted marker, remove */ if(r.m.getMarkerSet() == null) { iter.remove(); } else { - /* Get block ID */ - int blkid = plugin.getServer().getBlockIDAt(r.wname, r.x, r.y, r.z); - if((blkid >= 0) && (blkid != WALLSIGN_ID) && (blkid != SIGNPOST_ID)) { + if(plugin.getServer().isSignAt(r.wname, r.x, r.y, r.z) == 0) { + System.out.println("Removing from cache sign " + r.m.getLabel()); r.m.deleteMarker(); iter.remove(); } diff --git a/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java b/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java index e53e1165..4ddb573c 100644 --- a/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java +++ b/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java @@ -146,6 +146,9 @@ public class DynmapPlugin private boolean useSaveFolder = true; private Field displayName = null; // MCPC+ display name + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" }; private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]"); @@ -510,6 +513,20 @@ public class DynmapPlugin return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + int blkid = this.getBlockIDAt(wname, x, y, z); + + if (blkid == -1) + return -1; + + if((blkid == WALLSIGN_ID) || (blkid == SIGNPOST_ID)) { + return 1; + } else { + return 0; + } + } + @Override public void scheduleServerTask(Runnable run, long delay) { diff --git a/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java b/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java index 95b6310a..869d20ef 100644 --- a/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java +++ b/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java @@ -146,6 +146,9 @@ public class DynmapPlugin private boolean useSaveFolder = true; private Field displayName = null; // MCPC+ display name + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" }; private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]"); @@ -518,6 +521,20 @@ public class DynmapPlugin return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + int blkid = this.getBlockIDAt(wname, x, y, z); + + if (blkid == -1) + return -1; + + if((blkid == WALLSIGN_ID) || (blkid == SIGNPOST_ID)) { + return 1; + } else { + return 0; + } + } + @Override public void scheduleServerTask(Runnable run, long delay) { diff --git a/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java b/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java index ffbcadc5..226df1b9 100644 --- a/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java +++ b/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java @@ -146,6 +146,9 @@ public class DynmapPlugin private boolean useSaveFolder = true; private Field displayName = null; // MCPC+ display name + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" }; private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]"); @@ -523,6 +526,20 @@ public class DynmapPlugin return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + int blkid = this.getBlockIDAt(wname, x, y, z); + + if (blkid == -1) + return -1; + + if((blkid == WALLSIGN_ID) || (blkid == SIGNPOST_ID)) { + return 1; + } else { + return 0; + } + } + @Override public void scheduleServerTask(Runnable run, long delay) { diff --git a/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java b/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java index b08d367d..93dda650 100644 --- a/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java +++ b/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java @@ -157,6 +157,9 @@ public class DynmapPlugin private boolean useSaveFolder = true; private Field displayName = null; // MCPC+ display name + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" }; private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]"); @@ -514,6 +517,11 @@ public class DynmapPlugin return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + return -1; + } + @Override public void scheduleServerTask(Runnable run, long delay) { diff --git a/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java b/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java index d6522c45..d1a5b741 100644 --- a/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java +++ b/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java @@ -141,6 +141,9 @@ public class DynmapPlugin private boolean useSaveFolder = true; private Field displayName = null; // MCPC+ display name + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" }; private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]"); @@ -494,6 +497,20 @@ public class DynmapPlugin return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + int blkid = this.getBlockIDAt(wname, x, y, z); + + if (blkid == -1) + return -1; + + if((blkid == WALLSIGN_ID) || (blkid == SIGNPOST_ID)) { + return 1; + } else { + return 0; + } + } + @Override public void scheduleServerTask(Runnable run, long delay) { diff --git a/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java b/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java index c1210eab..88382320 100644 --- a/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java +++ b/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java @@ -139,6 +139,9 @@ public class DynmapPlugin private boolean useSaveFolder = true; private Field displayName = null; // MCPC+ display name + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" }; private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]"); @@ -497,6 +500,20 @@ public class DynmapPlugin return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + int blkid = this.getBlockIDAt(wname, x, y, z); + + if (blkid == -1) + return -1; + + if((blkid == WALLSIGN_ID) || (blkid == SIGNPOST_ID)) { + return 1; + } else { + return 0; + } + } + @Override public void scheduleServerTask(Runnable run, long delay) { diff --git a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index be7e73e1..fd4455db 100644 --- a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -28,6 +28,7 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -213,6 +214,22 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { return -1; } + @Override + public int isSignAt(String wname, int x, int y, int z) { + World w = getServer().getWorld(wname); + if((w != null) && w.isChunkLoaded(x >> 4, z >> 4)) { + Block b = w.getBlockAt(x, y, z); + BlockState s = b.getState(); + + if (s instanceof Sign) { + return 1; + } else { + return 0; + } + } + return -1; + } + @Override public void scheduleServerTask(Runnable run, long delay) { getServer().getScheduler().scheduleSyncDelayedTask(DynmapPlugin.this, run, delay);