Fix for disappearing sign-markers on 1.14 (Issue #2533)

This commit is contained in:
Tiago Dias 2019-08-14 12:24:38 +01:00
parent fadfe1ba09
commit 8fc95bfc96
9 changed files with 127 additions and 9 deletions

View File

@ -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

View File

@ -20,9 +20,6 @@ public class MarkerSignManager {
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;
@ -33,10 +30,12 @@ public class MarkerSignManager {
@Override
public void signChangeEvent(int blkid, String wname, int x, int y, int z, String[] lines, DynmapPlayer p) {
if(mgr == null)
return;
return;
if(!lines[0].equalsIgnoreCase("[dynmap]")) { /* If not dynmap sign, quit */
return;
}
/* If allowed to do marker signs */
if((p == null) || ((plugin != null) && (plugin.checkPlayerPermission(p, "marker.sign")))) {
String id = getSignMarkerID(wname, x, y, z); /* Get marker ID */
@ -143,17 +142,15 @@ public class MarkerSignManager {
for(Iterator<Entry<String, SignRec>> iter = sign_cache.entrySet().iterator(); iter.hasNext(); ) {
Entry<String, SignRec> 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) {
r.m.deleteMarker();
iter.remove();
}
}
}
}
plugin.getServer().scheduleServerTask(sl, 60*20);

View File

@ -145,6 +145,9 @@ public class DynmapPlugin
private boolean isMCPC = false;
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" };
@ -509,6 +512,20 @@ public class DynmapPlugin
}
return -1;
}
@Override
public int isSignAt(String wname, int x, int y, int z) {
int blkid = plugin.getServer().getBlockIDAt(r.wname, r.x, r.y, r.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)

View File

@ -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]");
@ -517,6 +520,20 @@ public class DynmapPlugin
}
return -1;
}
@Override
public int isSignAt(String wname, int x, int y, int z) {
int blkid = plugin.getServer().getBlockIDAt(r.wname, r.x, r.y, r.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)

View File

@ -145,6 +145,9 @@ public class DynmapPlugin
private boolean isMCPC = false;
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" };
@ -522,6 +525,20 @@ public class DynmapPlugin
}
return -1;
}
@Override
public int isSignAt(String wname, int x, int y, int z) {
int blkid = plugin.getServer().getBlockIDAt(r.wname, r.x, r.y, r.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)

View File

@ -156,6 +156,9 @@ public class DynmapPlugin
private boolean isMCPC = false;
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" };
@ -513,6 +516,11 @@ public class DynmapPlugin
public int getBlockIDAt(String wname, int x, int y, int z) {
return -1;
}
@Override
public int isSignAt(String wname, int x, int y, int z) {
return -1;
}
@Override
public void scheduleServerTask(Runnable run, long delay)

View File

@ -140,6 +140,9 @@ public class DynmapPlugin
private boolean isMCPC = false;
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" };
@ -493,6 +496,20 @@ public class DynmapPlugin
}
return -1;
}
@Override
public int isSignAt(String wname, int x, int y, int z) {
int blkid = plugin.getServer().getBlockIDAt(r.wname, r.x, r.y, r.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)

View File

@ -138,6 +138,9 @@ public class DynmapPlugin
private boolean isMCPC = false;
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" };
@ -496,6 +499,20 @@ public class DynmapPlugin
}
return -1;
}
@Override
public int isSignAt(String wname, int x, int y, int z) {
int blkid = plugin.getServer().getBlockIDAt(r.wname, r.x, r.y, r.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)

View File

@ -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;
@ -212,6 +213,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) {