From 22d1923ad5fa4ceb8be45b6936f405fb0822f70f Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 9 Jul 2014 22:20:33 -0500 Subject: [PATCH] Add support for 1.7.10 --- .../dynmap/bukkit/BukkitVersionHelper.java | 10 +++++ .../dynmap/bukkit/BukkitVersionHelperCB.java | 2 +- .../bukkit/BukkitVersionHelperGeneric.java | 41 +++++++++++++++++++ .../java/org/dynmap/bukkit/DynmapPlugin.java | 6 +-- src/main/java/org/dynmap/bukkit/Metrics.java | 6 ++- 5 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java index f6a99e3d..49281b1c 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java @@ -5,11 +5,13 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.Map; + import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.ChunkSnapshot; import org.bukkit.Server; import org.bukkit.World; +import org.bukkit.entity.Player; import org.dynmap.Log; /** @@ -132,4 +134,12 @@ public abstract class BukkitVersionHelper { * Get block material index list */ public abstract int[] getBlockMaterialMap(); + /** + * Get list of online players + */ + public abstract Player[] getOnlinePlayers(); + /** + * Get player health + */ + public abstract int getHealth(Player p); } diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java index 007a20d4..042dba50 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java @@ -47,7 +47,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { nmsmaterial = getNMSClass("net.minecraft.server.Material"); blockbyid = getFieldNoFail(nmsblock, new String[] { "byId" }, nmsblockarray); if (blockbyid == null) { - blockbyidfunc = getMethod(nmsblock, new String[] { "e" }, new Class[] { int.class }); + blockbyidfunc = getMethod(nmsblock, new String[] { "getById", "e" }, new Class[] { int.class }); } blockname = getPrivateField(nmsblock, new String[] { "name", "b" }, String.class); material = getPrivateField(nmsblock, new String[] { "material" }, nmsmaterial); diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java index 6647dbee..e1ad7147 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java @@ -3,13 +3,17 @@ package org.dynmap.bukkit; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Map; + import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.ChunkSnapshot; import org.bukkit.Server; import org.bukkit.World; +import org.bukkit.entity.Player; import org.dynmap.Log; /** @@ -79,6 +83,10 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { protected Field nmst_x; protected Field nmst_y; protected Field nmst_z; + /** Server */ + protected Method server_getonlineplayers; + /** Player */ + protected Method player_gethealth; BukkitVersionHelperGeneric() { failed = false; @@ -99,6 +107,12 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { /* CraftChunk */ craftchunk = getOBCClass("org.bukkit.craftbukkit.CraftChunk"); cc_gethandle = getMethod(craftchunk, new String[] { "getHandle" }, new Class[0]); + + /** Server */ + server_getonlineplayers = getMethod(Server.class, new String[] { "getOnlinePlayers" }, new Class[0]); + /** Player */ + player_gethealth = getMethod(Player.class, new String[] { "getHealth" }, new Class[0]); + /* Get NMS classes and fields */ if(!failed) loadNMS(); @@ -385,4 +399,31 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { } return null; } + /** + * Get list of online players + */ + public Player[] getOnlinePlayers() { + Object players = callMethod(Bukkit.getServer(), server_getonlineplayers, nullargs, null); + if (players instanceof Player[]) { /* Pre 1.7.10 */ + return (Player[]) players; + } + else { + @SuppressWarnings("unchecked") + Collection p = (Collection) players; + return p.toArray(new Player[0]); + } + } + /** + * Get player health + */ + public int getHealth(Player p) { + Object health = callMethod(p, player_gethealth, nullargs, null); + if (health instanceof Integer) { + return (Integer) health; + } + else { + return ((Double) health).intValue(); + } + } + } diff --git a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index 949e3d75..b02f9d54 100644 --- a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -234,7 +234,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } @Override public DynmapPlayer[] getOnlinePlayers() { - Player[] players = getServer().getOnlinePlayers(); + Player[] players = helper.getOnlinePlayers(); DynmapPlayer[] dplay = new DynmapPlayer[players.length]; for(int i = 0; i < players.length; i++) dplay[i] = new BukkitPlayer(players[i]); @@ -507,7 +507,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } @Override public int getCurrentPlayers() { - return getServer().getOnlinePlayers().length; + return helper.getOnlinePlayers().length; } @Override public boolean isModLoaded(String name) { @@ -636,7 +636,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { @Override public int getHealth() { if(player != null) - return player.getHealth(); + return helper.getHealth(player); else return 0; } diff --git a/src/main/java/org/dynmap/bukkit/Metrics.java b/src/main/java/org/dynmap/bukkit/Metrics.java index ee75bb85..a40dd779 100644 --- a/src/main/java/org/dynmap/bukkit/Metrics.java +++ b/src/main/java/org/dynmap/bukkit/Metrics.java @@ -121,6 +121,8 @@ public class Metrics { */ private volatile BukkitTask task = null; + private BukkitVersionHelper helper; + public Metrics(final Plugin plugin) throws IOException { if (plugin == null) { throw new IllegalArgumentException("Plugin cannot be null"); @@ -146,6 +148,8 @@ public class Metrics { // Load the guid then guid = configuration.getString("guid"); debug = configuration.getBoolean("debug", false); + + helper = BukkitVersionHelper.getHelper(); } /** @@ -359,7 +363,7 @@ public class Metrics { boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled String pluginVersion = description.getVersion(); String serverVersion = Bukkit.getVersion(); - int playersOnline = Bukkit.getServer().getOnlinePlayers().length; + int playersOnline = helper.getOnlinePlayers().length; // END server software specific section -- all code below does not use any code outside of this class / Java