From 08fc4145b1c917bd5042144a819a07ef1f96ba0e Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 4 Jan 2012 23:34:32 -0600 Subject: [PATCH] Add support for optional spawn-bed layer (show player's spawn beds) --- src/main/java/org/dynmap/DynmapPlugin.java | 15 +++- .../java/org/dynmap/MarkersComponent.java | 70 ++++++++++++++++++ .../dynmap/markers/impl/MarkerAPIImpl.java | 2 +- src/main/resources/configuration.txt | 35 +++++---- src/main/resources/markers/bed.png | Bin 0 -> 1498 bytes 5 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/markers/bed.png diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java index ea00a0e4..87787ab8 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapPlugin.java @@ -44,6 +44,7 @@ import org.bukkit.event.block.BlockSpreadEvent; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityListener; +import org.bukkit.event.player.PlayerBedLeaveEvent; import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; @@ -1462,7 +1463,18 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } } } - + + @Override + public void onPlayerBedLeave(PlayerBedLeaveEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerBedLeave(event); + } + } + } + @Override public void onPlayerChat(PlayerChatEvent event) { /* Call listeners */ @@ -1560,6 +1572,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { case PLAYER_JOIN: case PLAYER_QUIT: case PLAYER_MOVE: + case PLAYER_BED_LEAVE: pm.registerEvent(type, ourPlayerEventHandler, Event.Priority.Monitor, this); break; case BLOCK_PLACE: diff --git a/src/main/java/org/dynmap/MarkersComponent.java b/src/main/java/org/dynmap/MarkersComponent.java index 5405211f..38c71721 100644 --- a/src/main/java/org/dynmap/MarkersComponent.java +++ b/src/main/java/org/dynmap/MarkersComponent.java @@ -5,6 +5,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.Event.Type; +import org.bukkit.event.player.PlayerBedLeaveEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerQuitEvent; @@ -27,8 +28,11 @@ public class MarkersComponent extends ClientComponent { private String spawnlbl; private MarkerSet offlineset; private MarkerIcon offlineicon; + private MarkerSet spawnbedset; + private MarkerIcon spawnbedicon; private static final String OFFLINE_PLAYERS_SETID = "offline_players"; + private static final String PLAYER_SPAWN_BED_SETID = "spawn_beds"; public MarkersComponent(final DynmapPlugin plugin, ConfigurationNode configuration) { super(plugin, configuration); @@ -123,6 +127,72 @@ public class MarkersComponent extends ClientComponent { offlineset.deleteMarkerSet(); } } + /* If showing player spawn bed locations as markers */ + if(configuration.getBoolean("showspawnbeds", false)) { + /* Make set, if needed */ + spawnbedset = api.getMarkerSet(PLAYER_SPAWN_BED_SETID); + if(spawnbedset == null) { + spawnbedset = api.createMarkerSet(PLAYER_SPAWN_BED_SETID, configuration.getString("spawnbedlabel", "Spawn Beds"), null, true); + } + spawnbedset.setHideByDefault(configuration.getBoolean("spawnbedhidebydefault", true)); + spawnbedset.setMinZoom(configuration.getInteger("spawnbedminzoom", 0)); + + spawnbedicon = api.getMarkerIcon(configuration.getString("spawnbedicon", "bed")); + final String spawnbedformat = configuration.getString("spawnbedformat", "%name%'s bed"); + + /* Add listener for players coming and going */ + PlayerListener pl = new PlayerListener() { + private void updatePlayer(Player p) { + Location bl = p.getBedSpawnLocation(); + Marker m = spawnbedset.findMarker(p.getName()+"_bed"); + if(bl == null) { /* No bed location */ + if(m != null) { + m.deleteMarker(); + } + } + else { + if(m != null) + m.setLocation(bl.getWorld().getName(), bl.getX(), bl.getY(), bl.getZ()); + else + m = spawnbedset.createMarker(p.getName()+"_bed", spawnbedformat.replace("%name%", ChatColor.stripColor(p.getDisplayName())), false, + bl.getWorld().getName(), bl.getX(), bl.getY(), bl.getZ(), + spawnbedicon, true); + } + } + @Override + public void onPlayerJoin(PlayerJoinEvent event) { + Player p = event.getPlayer(); + updatePlayer(p); + } + @Override + public void onPlayerBedLeave(PlayerBedLeaveEvent event) { + final Player p = event.getPlayer(); + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { + public void run() { + updatePlayer(p); + } + }); + } + @Override + public void onPlayerQuit(PlayerQuitEvent event) { + Player p = event.getPlayer(); + Marker m = spawnbedset.findMarker(p.getName()+"_bed"); + if(m != null) { + m.deleteMarker(); + } + } + }; + plugin.registerEvent(Type.PLAYER_JOIN, pl); + plugin.registerEvent(Type.PLAYER_QUIT, pl); + plugin.registerEvent(Type.PLAYER_BED_LEAVE, pl); + } + else { + /* Make set, if needed */ + spawnbedset = api.getMarkerSet(PLAYER_SPAWN_BED_SETID); + if(spawnbedset != null) { + spawnbedset.deleteMarkerSet(); + } + } } private void addUpdateWorld(World w, Location loc) { diff --git a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index 842ae9f6..21db9d9c 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -63,7 +63,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { /* Built-in icons */ private static final String[] builtin_icons = { - "anchor", "bank", "basket", "beer", "bighouse", "blueflag", "bomb", "bookshelf", "bricks", "bronzemedal", "bronzestar", + "anchor", "bank", "basket", "bed", "beer", "bighouse", "blueflag", "bomb", "bookshelf", "bricks", "bronzemedal", "bronzestar", "building", "cake", "camera", "cart", "caution", "chest", "church", "coins", "comment", "compass", "construction", "cross", "cup", "cutlery", "default", "diamond", "dog", "door", "down", "drink", "exclamation", "factory", "fire", "flower", "gear", "goldmedal", "goldstar", "greenflag", "hammer", "heart", "house", "key", "king", diff --git a/src/main/resources/configuration.txt b/src/main/resources/configuration.txt index b631ffce..33ff5962 100644 --- a/src/main/resources/configuration.txt +++ b/src/main/resources/configuration.txt @@ -67,21 +67,29 @@ components: # Note: this component is needed for the dmarker commands, and for the Marker API to be available to other plugins - class: org.dynmap.MarkersComponent type: markers - #showlabel: true - #enablesigns: true + showlabel: false + enablesigns: false # (optional) add spawn point markers to standard marker layer showspawn: true spawnicon: world spawnlabel: "Spawn" # (optional) layer for showing offline player's positions - #showofflineplayers: true - #offlinelabel: "Offline" - #offlineicon: offlineuser - #offlinehidebydefault: true - #offlineminzoom: 0 + showofflineplayers: false + offlinelabel: "Offline" + offlineicon: offlineuser + offlinehidebydefault: true + offlineminzoom: 0 + # (optional) layer for showing player's spawn beds + showspawnbeds: false + spawnbedlabel: "Spawn Beds" + spawnbedicon: bed + spawnbedhidebydefault: true + spawnbedminzoom: 0 + spawnbedformat: "%name%'s bed" - class: org.dynmap.ClientComponent type: chat + allowurlname: false - class: org.dynmap.ClientComponent type: chatballoon focuschatballoons: false @@ -97,12 +105,13 @@ components: showplayerhealth: true # Option to make player faces small - don't use with showplayerhealth smallplayerfaces: false - # # Optional - make player faces layer hidden by default - # hidebydefault: true - # # Optional - ordering priority in layer menu (low goes before high - default is 0) - # layerprio: 1 - # # Optional - label for player marker layer (default is 'Players') - # label: "Players" + # Optional - make player faces layer hidden by default + hidebydefault: false + # Optional - ordering priority in layer menu (low goes before high - default is 0) + layerprio: 0 + # Optional - label for player marker layer (default is 'Players') + label: "Players" + #- class: org.dynmap.ClientComponent # type: digitalclock - class: org.dynmap.ClientComponent diff --git a/src/main/resources/markers/bed.png b/src/main/resources/markers/bed.png new file mode 100644 index 0000000000000000000000000000000000000000..01a02f7cc70c62b7f878f387bc974ff33c6ae82c GIT binary patch literal 1498 zcmV<01tt24P)4Tx0C)j~RNrgUP!#^!Wu36$i#lf!2|j3%Ze&w*L!7p2SGvtw>Nd9_NSmf@ zT$;ut?S8Na*^6&F#dq-sKKTa>*@JI;k`2ZbVfd_wB24xov!0tYO(#d#()tZ$I5%3%!zLYh@BH>w}XODA7?mkV}ap}jU$$3 zG&Mk)3Bm`(LOM&hKscCb;PVaG&Vdx+MpZJHTQ(R_;DA31$+jOGBoLXk_De?ey1m!ik&_4G zH9n^))_*|$z4!HUisgBd@awc5jn(v9k~&t~+vLrrBg4dZQ9lDnLV}JQWGLW~LJVP= zW5lZXOcog;N~F?hbX0k=IMzETla}oqM|jC!4!B+x^;@#I_Tc-T-6hwKycLDTx1-om z?X`jFy0R0R8-I0SrK4`)H@W4T8*Qr#2vPou<*`U!Wy(*2QP*`g=8#jD{B;Y@GL-Hm zb`n?&x~%YC_$q7)PlXr4m%r4=&fcvN%Ybn#KC7Nn&Bp8{(oE9pWVpYI^+LuN`H(R~ zTAjWmO`M83^4d@fCkA(d>*nHIFV_d2yUbnT`nd?LE^;G|!WZ>Ld?E0@Grm4ww{M7H zr`x{MWb30bTI;*hk-DO>dX$gbC-yy#suLNqvA(f>RtPJ!qGM`Gvvf}Y10`)vm-7Xa z?-7Ixe2A_siI1ydSCCID3U8SVUY86>uSnT0use_K1GZDvUFKY)t}F* z)!pahe+zh{{06Bb3f97*Uorpy010qNS#tmY3ljhU3ljkVnw%H_00Lr3L_t(26-`n* zXjDNIy?18bzL(iwKK^3-MNDI(66`c)S4bs@5<$c!O+frsX#x@v3rj08!3bhynuLI@ zv526o(SS{&Mb@m@&2Dz{+3(x;=3U=}Y|Mqr<(`>yX6DX8B7(i~1d+8vHy@;g)4(Su zCogAKR&E#a8=rl+CA|;Hubg~jNUN=RzJ42Fe@I1vweL|N9RdH${_sywE(G9 z>T{t`c#c}75w{R8bw*q7Mx?wZ7>J@i#<4&p zG#GwxYF`^vl!EkD(Jj|)WXL#U9NfAMWyhvsbF0b+44%oZqB!0G;pPyOH#74X2XnC% zSl5A&S&;%v&sAIx!%-g8Jdf60a??m6&mE+o0aiGY_8DEG(Uk@JF|376LM4y@*@ zGF(#bVKd+%BbKcyH^UJN78+!65Qaz+!|_}tH=4~-W@m2G!Uzgyz2?pufxwB9O&yC_ z2OQf|`H&D`F+fg9b!0e;|Gcx2i_AZ0EbMSVS6pC?G|DrQ}A* zqh%&=tOVYhRH~TTCL#)5KmIoo?ixvdr_L)E+b4R??WZG$LiZZj4FKM~W1I%os7zbe zw