From 99c38f0ee7174fb16948ca205e805e792fcf48c9 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Sat, 1 Oct 2011 19:19:52 -0500 Subject: [PATCH] Add support for optional 'offline players' marker layer --- .../java/org/dynmap/MarkersComponent.java | 58 +++++++++++++++++- src/main/java/org/dynmap/PlayerList.java | 5 ++ .../dynmap/markers/impl/MarkerAPIImpl.java | 2 +- src/main/resources/markers/offlineuser.png | Bin 0 -> 516 bytes web/css/dynmap_style.css | 4 ++ web/js/markers.js | 6 +- 6 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/markers/offlineuser.png diff --git a/src/main/java/org/dynmap/MarkersComponent.java b/src/main/java/org/dynmap/MarkersComponent.java index 12feeb50..d2b05c88 100644 --- a/src/main/java/org/dynmap/MarkersComponent.java +++ b/src/main/java/org/dynmap/MarkersComponent.java @@ -1,7 +1,13 @@ package org.dynmap; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.Event.Type; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.SpawnChangeEvent; import org.bukkit.event.world.WorldListener; import org.bukkit.event.world.WorldLoadEvent; @@ -19,8 +25,12 @@ public class MarkersComponent extends ClientComponent { private MarkerSignManager signmgr; private MarkerIcon spawnicon; private String spawnlbl; + private MarkerSet offlineset; + private MarkerIcon offlineicon; - public MarkersComponent(DynmapPlugin plugin, ConfigurationNode configuration) { + private static final String OFFLINE_PLAYERS_SETID = "offline_players"; + + public MarkersComponent(final DynmapPlugin plugin, ConfigurationNode configuration) { super(plugin, configuration); /* Register API with plugin, if needed */ if(plugin.markerAPIInitialized()) { @@ -66,6 +76,52 @@ public class MarkersComponent extends ClientComponent { addUpdateWorld(world, loc); } } + /* If showing offline players as markers */ + if(configuration.getBoolean("showofflineplayers", false)) { + /* Make set, if needed */ + offlineset = api.getMarkerSet(OFFLINE_PLAYERS_SETID); + if(offlineset == null) { + offlineset = api.createMarkerSet(OFFLINE_PLAYERS_SETID, configuration.getString("offlinelabel", "Offline"), null, true); + } + offlineset.setHideByDefault(configuration.getBoolean("offlinehidebydefault", true)); + + offlineicon = api.getMarkerIcon(configuration.getString("offlineicon", "offlineuser")); + + /* Add listener for players coming and going */ + PlayerListener pl = new PlayerListener() { + @Override + public void onPlayerJoin(PlayerJoinEvent event) { + Player p = event.getPlayer(); + Marker m = offlineset.findMarker(p.getName()); + if(m != null) { + m.deleteMarker(); + } + } + @Override + public void onPlayerQuit(PlayerQuitEvent event) { + Player p = event.getPlayer(); + Marker m = offlineset.findMarker(p.getName()); + if(m != null) { + m.deleteMarker(); + } + if(plugin.playerList.isVisiblePlayer(p)) { + Location loc = p.getLocation(); + m = offlineset.createMarker(p.getName(), ChatColor.stripColor(p.getDisplayName()), false, + loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), + offlineicon, true); + } + } + }; + plugin.registerEvent(Type.PLAYER_JOIN, pl); + plugin.registerEvent(Type.PLAYER_QUIT, pl); + } + else { + /* Make set, if needed */ + offlineset = api.getMarkerSet(OFFLINE_PLAYERS_SETID); + if(offlineset != null) { + offlineset.deleteMarkerSet(); + } + } } private void addUpdateWorld(World w, Location loc) { diff --git a/src/main/java/org/dynmap/PlayerList.java b/src/main/java/org/dynmap/PlayerList.java index a702db15..49444d86 100644 --- a/src/main/java/org/dynmap/PlayerList.java +++ b/src/main/java/org/dynmap/PlayerList.java @@ -115,4 +115,9 @@ public class PlayerList { } return hidden; } + + public boolean isVisiblePlayer(Player p) { + boolean useWhitelist = configuration.getBoolean("display-whitelist", false); + return (!(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))); + } } diff --git a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index 807baca3..631defd8 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -60,7 +60,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { "left", "lightbulb", "lighthouse", "lock", "minecart", "orangeflag", "pin", "pinkflag", "pirateflag", "pointdown", "pointleft", "pointright", "pointup", "portal", "purpleflag", "queen", "redflag", "right", "ruby", "scales", "skull", "shield", "sign", "silvermedal", "silverstar", "star", "sun", "temple", "theater", "tornado", "tower", "tree", "truck", "up", - "walk", "warning", "world", "wrench", "yellowflag" + "walk", "warning", "world", "wrench", "yellowflag", "offlineuser" }; /* Component messages for client updates */ diff --git a/src/main/resources/markers/offlineuser.png b/src/main/resources/markers/offlineuser.png new file mode 100644 index 0000000000000000000000000000000000000000..ac76d7015483e2b631eca0b167f4406fea48976f GIT binary patch literal 516 zcmV+f0{i`mP)1-*GH7Sq~lN}FVpY~t+J)Dk1K14F)i zJM%H$&I(Z!fglKwjEj2X8Tm59So3mHtF9+&Sg!~vae8+C03eiAH47{mo^XF7RlxK7 z9ZlDP5SJ&zjGJ44QVNnJf$KOt8D?Bs$Z2E{1RzT?5YL+wA!gj%0yGFb;<<_}PmU3D zZf*>pI}DDs5s+F+h_T?60q zq1Q9HK&fOvM#+F}JK#7rgkkuIecQJ;%^|lCQaV&M4OB(pH{Kt7Kp4>JWS!0%h_VE^ zTpl#6Bd)te2(g$0IrfNag17FkP2L(`E>0QY5?z~54$H;j^kK>I!|_KW98>w}7SgX4 zg;') .addClass(configuration.showlabel?'markerName-show':'markerName') + .addClass('markerName_' + set.id) .append(marker.label)); } else $(div).append($('') .addClass(configuration.showlabel?'markerName-show':'markerName') + .addClass('markerName_' + set.id) .text(marker.label)); return div; }}); @@ -105,7 +107,7 @@ componentconstructors['markers'] = function(dynmap, configuration) { } else if(msg.msg == 'setupdated') { if(!dynmapmarkersets[msg.id]) { - dynmapmarkersets[msg.id] = { label: msg.label, layerprio: msg.layerprio, markers:{} }; + dynmapmarkersets[msg.id] = { id: msg.id, label: msg.label, layerprio: msg.layerprio, markers:{} }; createMarkerSet(dynmapmarkersets[msg.id]); } else {