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 00000000..01a02f7c Binary files /dev/null and b/src/main/resources/markers/bed.png differ