From b817a74bd7312de8d3eee574277ff7e8157bf746 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 13 Jun 2014 19:54:31 -0500 Subject: [PATCH 01/74] Refactored to prepared for backwards compatibility. basically, all the v1_7_R3 imports were taken out of VirtualPlayers.class dynamically registering the proper listeners + executors based on the Minecraft version has NOT been added yet. --- VirtualPlayers/pom.xml | 20 +- .../mc/alk/virtualPlayer/VirtualPlayer.java | 272 ----------- .../mc/alk/virtualPlayer/VirtualPlayers.java | 198 +------- .../nms/v1_7_R3}/CustomCommandExecutor.java | 7 +- .../nms/v1_7_R3}/PlayerExecutor.java | 15 +- .../nms/v1_7_R3}/Util.java | 3 +- .../nms/v1_7_R3}/VPBaseExecutor.java | 13 +- .../nms/v1_7_R3}/VPExecutor.java | 10 +- .../nms/v1_7_R3/VirtualPlayer.java | 426 ++++++++++++++++++ 9 files changed, 474 insertions(+), 490 deletions(-) delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java rename VirtualPlayers/src/java/mc/alk/{virtualPlayer/Executors => virtualplayers/nms/v1_7_R3}/CustomCommandExecutor.java (99%) rename VirtualPlayers/src/java/mc/alk/{virtualPlayer/Executors => virtualplayers/nms/v1_7_R3}/PlayerExecutor.java (98%) rename VirtualPlayers/src/java/mc/alk/{virtualPlayer/Util => virtualplayers/nms/v1_7_R3}/Util.java (92%) rename VirtualPlayers/src/java/mc/alk/{virtualPlayer/Executors => virtualplayers/nms/v1_7_R3}/VPBaseExecutor.java (89%) rename VirtualPlayers/src/java/mc/alk/{virtualPlayer/Executors => virtualplayers/nms/v1_7_R3}/VPExecutor.java (88%) create mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java diff --git a/VirtualPlayers/pom.xml b/VirtualPlayers/pom.xml index 1911897..6977b6d 100644 --- a/VirtualPlayers/pom.xml +++ b/VirtualPlayers/pom.xml @@ -5,7 +5,7 @@ VirtualPlayers jar 1.5.8 - VirtualPlayers + VirtualPlayers-master UTF-8 @@ -62,24 +62,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - 1.4 - - - package - - - shade - - - - true - - - - diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java deleted file mode 100644 index ce650eb..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java +++ /dev/null @@ -1,272 +0,0 @@ -package mc.alk.virtualPlayer; - -import mc.alk.virtualPlayer.Util.Util; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import net.minecraft.server.v1_7_R3.MinecraftServer; -import net.minecraft.server.v1_7_R3.PlayerInteractManager; -import net.minecraft.server.v1_7_R3.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; -import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer -{ - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - - Location loc; - CraftScoreboard scoreboard; - - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, - GameProfile gameProfile, PlayerInteractManager pim) - { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) - { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv){ - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect){ - /// do nothing - } - - @Override - public void closeInventory(){ - /// do nothing - } - - @Override - public void updateInventory() - { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) - { - try{ - super.setGameMode(gamemode); - } catch (Exception e){ - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() - { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) - { - if (h < 0) h = 0; - this.health = h; - try{super.setHealth(h);} catch (Exception e){} - try{this.getHandle().setHealth((float)h);} catch (Exception e){e.printStackTrace();} - } - - - - @Override - public boolean isDead() - { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s){ - if (showMessages && enableMessages) - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - - public void moveTo(Location loc){ - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) - { - if (isDead()){ - return false; - } - try{ - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) - { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) - { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) - { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e){ - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) - return false; - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) - { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) - { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() - { - return loc; - } - - @Override - public boolean isOnline() - { - return online; - } - - public void setOnline(boolean b) - { - if (enableMessages) - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - online = b; - } - - @Override - public boolean isOp() - { - return isop; - } - - @Override - public void setOp(boolean b) - { - isop = b; - } - - @Override - public String toString() - { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - - @Override - public void setScoreboard(Scoreboard scoreboard){ - Object s = null; - this.scoreboard = (CraftScoreboard)scoreboard; - if (scoreboard != null){ - if (Bukkit.getScoreboardManager().getMainScoreboard() != null && - scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())){ - s = "BukkitMainScoreboard"; - } else if(scoreboard.getObjective(DisplaySlot.SIDEBAR) != null){ - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if(scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null){ - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) - Util.sendMessage(this, getName() + " setting scoreboard "+ s); - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l){ - loc = l; - } - - - public Player getInformed(){ - return keepInformed; - } - - public static void setGlobalMessages(boolean enable){ - VirtualPlayer.enableMessages = enable; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java index fbebdfd..f6875c1 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java +++ b/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java @@ -1,213 +1,65 @@ package mc.alk.virtualPlayer; -import mc.alk.virtualPlayer.Executors.CustomCommandExecutor; -import mc.alk.virtualPlayer.Executors.PlayerExecutor; -import mc.alk.virtualPlayer.Executors.VPBaseExecutor; -import mc.alk.virtualPlayer.Executors.VPExecutor; -import net.minecraft.server.v1_7_R3.MinecraftServer; -import net.minecraft.server.v1_7_R3.PlayerInteractManager; -import net.minecraft.server.v1_7_R3.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; -import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.plugin.java.JavaPlugin; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; public class VirtualPlayers extends JavaPlugin implements Listener { - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - static VirtualPlayers plugin; + @Override public void onEnable() { - plugin = this; Bukkit.getPluginManager().registerEvents(this, this); - getCommand("vdc").setExecutor(new PlayerExecutor(this)); - getCommand("virtualplayers").setExecutor(new VPExecutor(this)); + // getCommand("vdc").setExecutor(new PlayerExecutor(this)); + // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); } @Override public void onDisable() { - deleteVirtualPlayers(); + // VirtualPlayer.deleteVirtualPlayers(); } - - public static VirtualPlayers getSelf() - { - return plugin; + + public static void setPlayerMessages(boolean show){ + // VirtualPlayer.setGlobalMessages(show); } - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } + + public static void setEventMessages(boolean show){ + // VPBaseExecutor.setShowEventMessages(show); } - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } + - public static void setPlayerMessages(boolean show){ - VirtualPlayer.setGlobalMessages(show); - } + - public static void setEventMessages(boolean show){ - VPBaseExecutor.setShowEventMessages(show); - } + - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!vps.containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } + - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } + - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } + - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } + - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } + - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } + - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } + - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } + - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } + - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } + - public List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } + - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } + } diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java similarity index 99% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java rename to VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java index 5b62f26..f3e101f 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java +++ b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java @@ -1,7 +1,6 @@ -package mc.alk.virtualPlayer.Executors; +package mc.alk.virtualplayers.nms.v1_7_R3; import mc.alk.virtualPlayer.Util.InventoryUtil; -import mc.alk.virtualPlayer.VirtualPlayers; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -717,10 +716,10 @@ public static Player findPlayer(String name) { Player foundPlayer = Bukkit.getPlayer(name); if (foundPlayer != null) { return foundPlayer;} - foundPlayer = VirtualPlayers.getPlayer(name); + foundPlayer = VirtualPlayer.getPlayer(name); if (foundPlayer != null) { return foundPlayer;} - Player[] online = VirtualPlayers.getOnlinePlayers(); + Player[] online = VirtualPlayer.getOnlinePlayers(); for (Player player : online) { String playerName = player.getName(); diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java similarity index 98% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java rename to VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java index c8d3fd2..562e2dc 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java +++ b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java @@ -1,9 +1,6 @@ -package mc.alk.virtualPlayer.Executors; +package mc.alk.virtualplayers.nms.v1_7_R3; import mc.alk.virtualPlayer.Util.InventoryUtil; -import mc.alk.virtualPlayer.Util.Util; -import mc.alk.virtualPlayer.VirtualPlayer; -import mc.alk.virtualPlayer.VirtualPlayers; import net.minecraft.server.v1_7_R3.DamageSource; import net.minecraft.server.v1_7_R3.EntityPlayer; import org.apache.commons.lang.StringUtils; @@ -50,14 +47,20 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; /** * @author alkarin */ public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + public PlayerExecutor(Plugin plugin) { super(plugin,1); super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); } @@ -199,7 +202,7 @@ public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { final String msg = Util.colorChat(StringUtils.join(args, " ")); final HashSet players = new HashSet( - Arrays.asList(VirtualPlayers.getOnlinePlayers())); + Arrays.asList(VirtualPlayer.getOnlinePlayers())); Runnable r = new Runnable() { @Override public void run() { @@ -376,7 +379,7 @@ public void run() /// preloginevent /// Sync back up and call the Login and Join events Bukkit.getScheduler().scheduleSyncDelayedTask( - VirtualPlayers.getSelf(), new Runnable(){ + plugin, new Runnable(){ @Override public void run() { diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java similarity index 92% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java rename to VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java index 605b7b0..a3825cb 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java +++ b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java @@ -1,6 +1,5 @@ -package mc.alk.virtualPlayer.Util; +package mc.alk.virtualplayers.nms.v1_7_R3; -import mc.alk.virtualPlayer.VirtualPlayer; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java similarity index 89% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java rename to VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java index 0fbd169..57dd9a0 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java +++ b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java @@ -1,8 +1,5 @@ -package mc.alk.virtualPlayer.Executors; +package mc.alk.virtualplayers.nms.v1_7_R3; -import mc.alk.virtualPlayer.Util.Util; -import mc.alk.virtualPlayer.VirtualPlayer; -import mc.alk.virtualPlayer.VirtualPlayers; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -46,11 +43,11 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command } private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayers.getPlayerExact(name); + Player p = VirtualPlayer.getPlayerExact(name); if (p == null) { if (name.contains("-")) { /// return range return getVps(name);} - p = VirtualPlayers.getOrCreate(name); + p = VirtualPlayer.getOrCreate(name); } if (!(p instanceof VirtualPlayer)){ throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); @@ -104,10 +101,10 @@ private List getVps(String names) { Integer start = Integer.valueOf(split[1]); Integer end = Integer.valueOf(split[2]); for (int i=start;i<=end;i++){ - players.add(VirtualPlayers.getOrCreate(name + i)); + players.add(VirtualPlayer.getOrCreate(name + i)); } } else { - players.add(VirtualPlayers.getOrCreate(name)); + players.add(VirtualPlayer.getOrCreate(name)); } return players; } diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java similarity index 88% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java rename to VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java index 0bfdacf..9beda33 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java +++ b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java @@ -1,7 +1,5 @@ -package mc.alk.virtualPlayer.Executors; +package mc.alk.virtualplayers.nms.v1_7_R3; -import mc.alk.virtualPlayer.VirtualPlayer; -import mc.alk.virtualPlayer.VirtualPlayers; import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; @@ -22,7 +20,7 @@ public VPExecutor(Plugin plugin) { public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception { for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayers.makeVirtualPlayer(); + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); sendMessage(sender, "Added Player " + p1.getName()); } return true; @@ -30,13 +28,13 @@ public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Except @MCCommand(cmds = {"removeAll"}, op = true) public boolean removeAll(CommandSender sender) { - VirtualPlayers.deleteVirtualPlayers(); + VirtualPlayer.deleteVirtualPlayers(); return sendMessage(sender, "&2Removed all VirtualPlayers"); } @MCCommand(cmds = {"listPlayers"}, op = true) public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayers.getSelf().getPlayerList(); + List players = VirtualPlayer.getPlayerList(); sender.sendMessage("VirtualPlayers count="+players.size()); Collections.sort(players, new Comparator() { diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java new file mode 100644 index 0000000..190c936 --- /dev/null +++ b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java @@ -0,0 +1,426 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R3.EntityPlayer; +import net.minecraft.server.v1_7_R3.MinecraftServer; +import net.minecraft.server.v1_7_R3.PlayerInteractManager; +import net.minecraft.server.v1_7_R3.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R3.CraftServer; +import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer implements Listener { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Added stuff below. + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!vps.containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) vp = vps.get(id); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} From 6c1083f0ad2e7f28a94a51c7f5c15663f2909647 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 5 Jul 2014 21:19:14 -0500 Subject: [PATCH 02/74] Removed all packages and classes Will be replaced with the backward compatible classes. --- VirtualPlayers/.project | 17 - VirtualPlayers/README | 5 - VirtualPlayers/plugin.yml | 19 - VirtualPlayers/pom.xml | 91 -- .../Executors/CustomCommandExecutor.java | 761 ----------------- .../Executors/PlayerExecutor.java | 431 ---------- .../Executors/VPBaseExecutor.java | 118 --- .../virtualPlayer/Executors/VPExecutor.java | 76 -- .../alk/virtualPlayer/Util/InventoryUtil.java | 778 ------------------ .../java/mc/alk/virtualPlayer/Util/Util.java | 59 -- .../mc/alk/virtualPlayer/VirtualPlayer.java | 272 ------ .../mc/alk/virtualPlayer/VirtualPlayers.java | 213 ----- 12 files changed, 2840 deletions(-) delete mode 100644 VirtualPlayers/.project delete mode 100644 VirtualPlayers/README delete mode 100644 VirtualPlayers/plugin.yml delete mode 100644 VirtualPlayers/pom.xml delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/InventoryUtil.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java diff --git a/VirtualPlayers/.project b/VirtualPlayers/.project deleted file mode 100644 index a44a744..0000000 --- a/VirtualPlayers/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - VirtualPlayers - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/VirtualPlayers/README b/VirtualPlayers/README deleted file mode 100644 index 9a3ccb1..0000000 --- a/VirtualPlayers/README +++ /dev/null @@ -1,5 +0,0 @@ -Create virtual players for easy debugging of plugins through the console. - -Versions: -1.2: Added chatting to virtualplayers - diff --git a/VirtualPlayers/plugin.yml b/VirtualPlayers/plugin.yml deleted file mode 100644 index 651b051..0000000 --- a/VirtualPlayers/plugin.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: ${project.name} -version: ${project.version} -author: Alkarin -description: CraftBukkit_1.6.2. Create Virtualplayers for debugging or running commands otherwise unavailable from the console - -main: mc.alk.virtualPlayer.VirtualPlayers -commands: - virtualplayers: - aliases: [vp,virtualplayer] - ap: - description: add virtual player - usage: /ap [arguments] - vdc: - aliases: [dc] - description: do command as a virtual player - usage: /dc [arguments] - - - diff --git a/VirtualPlayers/pom.xml b/VirtualPlayers/pom.xml deleted file mode 100644 index c300971..0000000 --- a/VirtualPlayers/pom.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - 4.0.0 - mc.alk - VirtualPlayers - jar - 1.5.7.1 - VirtualPlayers - - UTF-8 - - http://maven.apache.org - - - - bukkit-repo - http://repo.bukkit.org/content/groups/public - - - - - - - org.bukkit - bukkit - 1.7.5-R0.1-SNAPSHOT - provided - - - org.bukkit - craftbukkit - 1.7.5-R0.1-SNAPSHOT - provided - - - - - - - ${project.name} - - - org.apache.maven.wagon - wagon-ssh - 2.4 - - - install - - ${basedir}/src/java - - - - . - true - ${basedir} - - plugin.yml - default_files/* - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 1.4 - - - package - - - shade - - - - true - - - - - - - - - battleplugins-repo - scp://server.battleplugins.com/var/www/server.battleplugins.com/htdocs/maven/repository - - - diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java deleted file mode 100644 index 5b62f26..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java +++ /dev/null @@ -1,761 +0,0 @@ -package mc.alk.virtualPlayer.Executors; - -import mc.alk.virtualPlayer.Util.InventoryUtil; -import mc.alk.virtualPlayer.VirtualPlayers; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayers.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayers.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java deleted file mode 100644 index 0610c1f..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java +++ /dev/null @@ -1,431 +0,0 @@ -package mc.alk.virtualPlayer.Executors; - -import mc.alk.virtualPlayer.Util.InventoryUtil; -import mc.alk.virtualPlayer.Util.Util; -import mc.alk.virtualPlayer.VirtualPlayer; -import mc.alk.virtualPlayer.VirtualPlayers; -import net.minecraft.server.v1_7_R2.DamageSource; -import net.minecraft.server.v1_7_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayers.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - VirtualPlayers.getSelf(), new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java deleted file mode 100644 index 0fbd169..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java +++ /dev/null @@ -1,118 +0,0 @@ -package mc.alk.virtualPlayer.Executors; - -import mc.alk.virtualPlayer.Util.Util; -import mc.alk.virtualPlayer.VirtualPlayer; -import mc.alk.virtualPlayer.VirtualPlayers; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayers.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayers.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayers.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayers.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java deleted file mode 100644 index 0bfdacf..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java +++ /dev/null @@ -1,76 +0,0 @@ -package mc.alk.virtualPlayer.Executors; - -import mc.alk.virtualPlayer.VirtualPlayer; -import mc.alk.virtualPlayer.VirtualPlayers; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayers.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayers.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayers.getSelf().getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/InventoryUtil.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/InventoryUtil.java deleted file mode 100644 index 5a15d2d..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/InventoryUtil.java +++ /dev/null @@ -1,778 +0,0 @@ -package mc.alk.virtualPlayer.Util; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; - -public class InventoryUtil -{ - static final String version = "InventoryUtil 2.1.4"; - static final boolean DEBUG = false; - - public static class Armor - { - public ArmorLevel level; - public ArmorType type; - - Armor(ArmorType at, ArmorLevel al) - { - this.level = al; - this.type = at; - } - } - - public static class EnchantmentWithLevel - { - public EnchantmentWithLevel() - { - } - - public EnchantmentWithLevel(boolean all) - { - this.all = all; - } - - public Enchantment e; - public Integer lvl; - boolean all = false; - - @Override - public String toString() - { - return (e != null ? e.getName() : "null") + ":" + lvl; - } - } - - public enum ArmorLevel - { - WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND - }; - - public enum ArmorType - { - HELM, CHEST, LEGGINGS, BOOTS - }; - - public static Enchantment getEnchantmentByCommonName(String iname) - { - iname = iname.toLowerCase(); - if (iname.contains("smite")) - return Enchantment.getByName("DAMAGE_UNDEAD"); - if (iname.contains("sharp")) - return Enchantment.getByName("DAMAGE_ALL"); - if (iname.contains("fire") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_FIRE"); - if (iname.contains("fire")) - return Enchantment.getByName("FIRE_ASPECT"); - if (iname.contains("exp") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - if (iname.contains("blast") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - if (iname.contains("arrow") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_PROJECTILE"); - if (iname.contains("proj") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_PROJECTILE"); - if (iname.contains("respiration")) - return Enchantment.getByName("OXYGEN"); - if (iname.contains("fall")) - return Enchantment.getByName("PROTECTION_FALL"); - if (iname.contains("prot")) - return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); - if (iname.contains("respiration")) - return Enchantment.getByName("OXYGEN"); - if (iname.contains("oxygen")) return Enchantment.getByName("OXYGEN"); - if (iname.contains("aqua")) - return Enchantment.getByName("WATER_WORKER"); - if (iname.contains("arth")) - return Enchantment.getByName("DAMAGE_ARTHROPODS"); - if (iname.contains("knockback")) - return Enchantment.getByName("KNOCKBACK"); - if (iname.contains("loot")) - return Enchantment.getByName("LOOT_BONUS_MOBS"); - if (iname.contains("dig")) return Enchantment.getByName("DIG_SPEED"); - if (iname.contains("silk")) return Enchantment.getByName("SILK_TOUCH"); - if (iname.contains("unbreaking")) - return Enchantment.getByName("DURABILITY"); - if (iname.contains("dura")) return Enchantment.getByName("DURABILITY"); - return null; - } - - static final HashMap armor; - static - { - armor = new HashMap(); - armor.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); - armor.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.IRON)); - armor.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.IRON)); - armor.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.IRON)); - armor.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.IRON)); - armor.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.CHAINMAIL)); - } - - public static int arrowCount(Player p) - { - return getItemAmount(p.getInventory().getContents(), new ItemStack( - Material.ARROW, 1)); - } - - public static int getItemAmountFromInventory(Inventory inv, ItemStack is) - { - return getItemAmount(inv.getContents(), is); - } - - public static boolean hasArmor(Player p) - { - PlayerInventory pi = p.getInventory(); - return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi - .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); - } - - public static ArmorLevel hasArmorSet(List inv) - { - ArmorLevel armorSet[] = new ArmorLevel[4]; - for (ItemStack is : inv) - { - Armor a = armor.get(is.getType()); - if (a == null) continue; - switch (a.type) - { - case BOOTS: - armorSet[0] = a.level; - break; - case LEGGINGS: - armorSet[1] = a.level; - break; - case CHEST: - armorSet[2] = a.level; - break; - case HELM: - armorSet[3] = a.level; - break; - } - } - ArmorLevel lvl = null; - for (ArmorLevel a : armorSet) - { - if (lvl == null) - lvl = a; - else if (lvl != a) return null; - } - return lvl; - } - - // - // private static Material getMaterial(ArmorLevel level) { - // switch(level){ - // case WOOL: return Material.WOOL; - // case LEATHER : return Material.LEATHER; - // case IRON: return Material.IRON_BOOTS; - // case GOLD : return Material.GOLD_BOOTS; - // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; - // case DIAMOND: return Material.DIAMOND; - // default : return null; - // } - // } - - public static int getItemAmount(ItemStack[] items, ItemStack is) - { - int count = 0; - for (ItemStack item : items) - { - if (item == null) - { - continue; - } - if (item.getType() == is.getType() - && ((item.getDurability() == is.getDurability() || item - .getDurability() == -1))) - { - count += item.getAmount(); - } - } - return count; - } - - public static ItemStack getItemStack(String name) - { - if (name == null || name.isEmpty()) return null; - name = name.replace(" ", "_"); - name = name.replace(":", ";"); - - int dataIndex = name.indexOf(';'); - dataIndex = (dataIndex != -1 ? dataIndex : -1); - int dataValue = 0; - if (dataIndex != -1) - { - dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer - .parseInt(name.substring(dataIndex + 1)) : 0); - name = name.substring(0, dataIndex); - } - - dataValue = dataValue < 0 ? 0 : dataValue; - Material mat = getMat(name); - - if (mat != null && mat != Material.AIR) - { - return new ItemStack(mat, 0, (short) dataValue); - } - return null; - } - - public static boolean isInt(String i) - { - try - { - Integer.parseInt(i); - return true; - } catch (Exception e) - { - return false; - } - } - - public static boolean isFloat(String i) - { - try - { - Float.parseFloat(i); - return true; - } catch (Exception e) - { - return false; - } - } - - // / Get the Material - public static Material getMat(String name) - { - Integer id = null; - try - { - id = Integer.parseInt(name); - } catch (Exception e) - { - } - if (id == null) - { - id = getMaterialID(name); - } - return id != null && id >= 0 ? Material.getMaterial(id) : null; - } - - // / This allows for abbreviations to work, useful for sign etc - public static int getMaterialID(String name) - { - name = name.toUpperCase(); - // / First try just getting it from the Material Name - Material mat = Material.getMaterial(name); - if (mat != null) return mat.getId(); - // / Might be an abbreviation, or a more complicated - int temp = Integer.MAX_VALUE; - mat = null; - name = name.replaceAll("\\s+", "").replaceAll("_", ""); - for (Material m : Material.values()) - { - if (m.name().replaceAll("_", "").startsWith(name)) - { - if (m.name().length() < temp) - { - mat = m; - temp = m.name().length(); - } - } - } - return mat != null ? mat.getId() : -1; - } - - public static boolean hasItem(Player p, ItemStack itemType) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() == itemType.getType()) - { - return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() == itemType.getType()) - { - return true; - } - } - return false; - } - - public static boolean hasAnyItem(Player p) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() != Material.AIR) - { - // System.out.println("item=" + is); - return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() != Material.AIR) - { - // System.out.println("item=" + is); - return true; - } - } - - return false; - } - - public static void addItemToInventory(Player player, ItemStack itemStack) - { - addItemToInventory(player, itemStack, itemStack.getAmount(), true, - false); - } - - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount) - { - addItemToInventory(player, itemStack, stockAmount, true, false); - } - - @SuppressWarnings("deprecation") - public static void addItemsToInventory(Player p, List items, - boolean ignoreHelmet) - { - for (ItemStack is : items) - InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), - false, false); - try - { - p.updateInventory(); - } catch (Exception e) - { - } - } - - @SuppressWarnings("deprecation") - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount, boolean update, boolean ignoreHelmet) - { - PlayerInventory inv = player.getInventory(); - Material itemType = itemStack.getType(); - if (armor.containsKey(itemType)) - { - // / no item: add to armor slot - // / item better: add old to inventory, new to armor slot - // / item notbetter: add to inventory - ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); - boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); - boolean better = empty ? false : armorSlotBetter( - armor.get(oldArmor.getType()), armor.get(itemType)); - final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; - if (empty || better) - { - switch (armor.get(itemType).type) - { - case HELM: - inv.setHelmet(itemStack); - break; - case CHEST: - inv.setChestplate(itemStack); - break; - case LEGGINGS: - inv.setLeggings(itemStack); - break; - case BOOTS: - inv.setBoots(itemStack); - break; - } - } - if (!empty) - { - if (better && (!isHelmet && ignoreHelmet)) - { - addItemToInventory(inv, oldArmor, oldArmor.getAmount()); - } - else - { - addItemToInventory(inv, itemStack, stockAmount); - } - } - } - else - { - addItemToInventory(inv, itemStack, stockAmount); - } - if (update) try - { - player.updateInventory(); - } catch (Exception e) - { - } - } - - private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) - { - if (oldArmor == null || newArmor == null) // / technically we could - // throw an exception.. but - // nah - return false; - return oldArmor.level.ordinal() < newArmor.level.ordinal(); - } - - private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) - { - switch (armor.type) - { - case HELM: - return inv.getHelmet(); - case CHEST: - return inv.getChestplate(); - case LEGGINGS: - return inv.getLeggings(); - case BOOTS: - return inv.getBoots(); - } - return null; - } - - // /Adds item to inventory - public static void addItemToInventory(Inventory inv, ItemStack is, int left) - { - int maxStackSize = is.getType().getMaxStackSize(); - if (left <= maxStackSize) - { - is.setAmount(left); - inv.addItem(is); - return; - } - - if (maxStackSize != 64) - { - ArrayList items = new ArrayList(); - for (int i = 0; i < Math.ceil(left / maxStackSize); i++) - { - if (left < maxStackSize) - { - is.setAmount(left); - items.add(is); - return; - } - else - { - is.setAmount(maxStackSize); - items.add(is); - } - } - Object[] iArray = items.toArray(); - for (Object o : iArray) - { - inv.addItem((ItemStack) o); - } - } - else - { - inv.addItem(is); - } - } - - public static void closeInventory(Player p) - { - - try - { - p.closeInventory(); - } catch (Exception closeInventoryError) - { - // / This almost always throws an NPE, but does its job so ignore - } - } - - public static void clearInventory(Player p) - { - try - { - PlayerInventory inv = p.getInventory(); - closeInventory(p); - - if (inv != null) - { - inv.clear(); - inv.setArmorContents(null); - inv.setItemInHand(null); - } - } catch (Exception ee) - { - ee.printStackTrace(); - } - } - - public static Object getCommonName(ItemStack is) - { - int id = is.getTypeId(); - int datavalue = is.getDurability(); - if (datavalue > 0) - { - return Material.getMaterial(id).toString() + ":" + datavalue; - } - return Material.getMaterial(id).toString(); - } - - public static boolean isItem(String str) - { - // System.out.println("string = " + str); - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - if (DEBUG) System.out.println("item=" + str); - ItemStack is = null; - try - { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - is.setAmount(Integer.valueOf(split[split.length - 1])); - for (int i = 1; i < split.length - 1; i++) - { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try - { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) - { - return false; - } - } - } catch (Exception e) - { - return false; - } - return true; - } - - public static ItemStack parseItem(String str) throws Exception - { - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - if (DEBUG) System.out.println("item=" + str); - ItemStack is = null; - try - { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - // System.out.println(" split = " + split); - final int amt = split.length > 1 ? Integer - .valueOf(split[split.length - 1]) : 1; - is.setAmount(amt); - for (int i = 1; i < split.length - 1; i++) - { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try - { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) - { - Logger.getLogger("minecraft").warning( - ewl + " can not be applied to the item " + str); - } - } - } catch (Exception e) - { - e.printStackTrace(); - Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); - throw new Exception("parse item was bad"); - } - return is; - } - - public static EnchantmentWithLevel getEnchantment(String str) - { - if (str.equalsIgnoreCase("all")) - { - return new EnchantmentWithLevel(true); - } - Enchantment e = null; - str = str.replaceAll(",", ":"); - int index = str.indexOf(':'); - index = (index != -1 ? index : -1); - int lvl = -1; - if (index != -1) - { - try - { - lvl = Integer.parseInt(str.substring(index + 1)); - } catch (Exception err) - { - } - str = str.substring(0, index); - } - - // System.out.println("String = <" + str +"> " + lvl); - try - { - e = Enchantment.getById(Integer.valueOf(str)); - } catch (Exception err) - { - } - if (e == null) e = Enchantment.getByName(str); - if (e == null) e = getEnchantmentByCommonName(str); - if (e == null) return null; - EnchantmentWithLevel ewl = new EnchantmentWithLevel(); - ewl.e = e; - if (lvl < e.getStartLevel()) - { - lvl = e.getStartLevel(); - } - if (lvl > e.getMaxLevel()) - { - lvl = e.getMaxLevel(); - } - ewl.lvl = lvl; - return ewl; - } - - public boolean addEnchantments(ItemStack is, String[] args) - { - Map encs = new HashMap(); - for (String s : args) - { - EnchantmentWithLevel ewl = getEnchantment(s); - if (ewl != null) - { - if (ewl.all) - { - return addAllEnchantments(is); - } - encs.put(ewl.e, ewl.lvl); - } - } - addEnchantments(is, encs); - return true; - } - - public void addEnchantments(ItemStack is, - Map enchantments) - { - for (Enchantment e : enchantments.keySet()) - { - if (e.canEnchantItem(is)) - { - is.addUnsafeEnchantment(e, enchantments.get(e)); - } - } - } - - public boolean addAllEnchantments(ItemStack is) - { - for (Enchantment enc : Enchantment.values()) - { - if (enc.canEnchantItem(is)) - { - is.addUnsafeEnchantment(enc, enc.getMaxLevel()); - } - } - return true; - } - - /** - * For Serializing an item or printing - * - * @param is - * @return - */ - public static String getItemString(ItemStack is) - { - if (is == null) return null; - StringBuilder sb = new StringBuilder(); - sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); - Map encs = is.getEnchantments(); - for (Enchantment enc : encs.keySet()) - { - sb.append(enc.getName() + ":" + encs.get(enc) + " "); - } - sb.append(is.getAmount()); - return sb.toString(); - } - - public static boolean hasEnchantedItem(Player p) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() != Material.AIR) - { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() != Material.AIR) - { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) return true; - } - } - return false; - } - - public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) - { - Armor a = armor.get(is.getType()); - if (a == null) return false; - return a.level == lvl; - } - - public static ItemStack getWool(int color) - { - return new ItemStack(Material.WOOL, 1, (short) color); - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java deleted file mode 100644 index 605b7b0..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Util/Util.java +++ /dev/null @@ -1,59 +0,0 @@ -package mc.alk.virtualPlayer.Util; - -import mc.alk.virtualPlayer.VirtualPlayer; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java deleted file mode 100644 index 85fc9ff..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayer.java +++ /dev/null @@ -1,272 +0,0 @@ -package mc.alk.virtualPlayer; - -import mc.alk.virtualPlayer.Util.Util; -import net.minecraft.server.v1_7_R2.EntityPlayer; -import net.minecraft.server.v1_7_R2.MinecraftServer; -import net.minecraft.server.v1_7_R2.PlayerInteractManager; -import net.minecraft.server.v1_7_R2.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_7_R2.CraftServer; -import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R2.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer -{ - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - - Location loc; - CraftScoreboard scoreboard; - - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, - GameProfile gameProfile, PlayerInteractManager pim) - { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) - { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv){ - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect){ - /// do nothing - } - - @Override - public void closeInventory(){ - /// do nothing - } - - @Override - public void updateInventory() - { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) - { - try{ - super.setGameMode(gamemode); - } catch (Exception e){ - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() - { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) - { - if (h < 0) h = 0; - this.health = h; - try{super.setHealth(h);} catch (Exception e){} - try{this.getHandle().setHealth((float)h);} catch (Exception e){e.printStackTrace();} - } - - - - @Override - public boolean isDead() - { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s){ - if (showMessages && enableMessages) - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - - public void moveTo(Location loc){ - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) - { - if (isDead()){ - return false; - } - try{ - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) - { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) - { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) - { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e){ - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) - return false; - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) - { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) - { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() - { - return loc; - } - - @Override - public boolean isOnline() - { - return online; - } - - public void setOnline(boolean b) - { - if (enableMessages) - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - online = b; - } - - @Override - public boolean isOp() - { - return isop; - } - - @Override - public void setOp(boolean b) - { - isop = b; - } - - @Override - public String toString() - { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - - @Override - public void setScoreboard(Scoreboard scoreboard){ - Object s = null; - this.scoreboard = (CraftScoreboard)scoreboard; - if (scoreboard != null){ - if (Bukkit.getScoreboardManager().getMainScoreboard() != null && - scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())){ - s = "BukkitMainScoreboard"; - } else if(scoreboard.getObjective(DisplaySlot.SIDEBAR) != null){ - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if(scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null){ - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) - Util.sendMessage(this, getName() + " setting scoreboard "+ s); - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l){ - loc = l; - } - - - public Player getInformed(){ - return keepInformed; - } - - public static void setGlobalMessages(boolean enable){ - VirtualPlayer.enableMessages = enable; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java deleted file mode 100644 index 707e843..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java +++ /dev/null @@ -1,213 +0,0 @@ -package mc.alk.virtualPlayer; - -import mc.alk.virtualPlayer.Executors.CustomCommandExecutor; -import mc.alk.virtualPlayer.Executors.PlayerExecutor; -import mc.alk.virtualPlayer.Executors.VPBaseExecutor; -import mc.alk.virtualPlayer.Executors.VPExecutor; -import net.minecraft.server.v1_7_R2.MinecraftServer; -import net.minecraft.server.v1_7_R2.PlayerInteractManager; -import net.minecraft.server.v1_7_R2.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R2.CraftServer; -import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class VirtualPlayers extends JavaPlugin implements Listener -{ - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - static VirtualPlayers plugin; - - @Override - public void onEnable() - { - plugin = this; - Bukkit.getPluginManager().registerEvents(this, this); - getCommand("vdc").setExecutor(new PlayerExecutor(this)); - getCommand("virtualplayers").setExecutor(new VPExecutor(this)); - } - - @Override - public void onDisable() - { - deleteVirtualPlayers(); - } - - public static VirtualPlayers getSelf() - { - return plugin; - } - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - public static void setPlayerMessages(boolean show){ - VirtualPlayer.setGlobalMessages(show); - } - - public static void setEventMessages(boolean show){ - VPBaseExecutor.setShowEventMessages(show); - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!vps.containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - -} From 0e23690c60b6a5e4c1a63b7d9227ed27da99d1b4 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 5 Jul 2014 21:22:24 -0500 Subject: [PATCH 03/74] http://dev.bukkit.org/bukkit-plugins/virtualplayers/ --- README.md | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c65c50 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +VirtualPlayers2 +====== +Bukkit plugin that creates virtual players: +Used for easy debugging of plugins through the console. + + +VirtualPlayers2 was made for developers who need to easily test +their plugins against multiple versions of craftbukkit. + + +Commands as Players +--- + +|command|description| +|:------|:----------| +|`dc ` | any command you would normally do as a player | +|`dc op` | op virtual player | +|`dc deop` | deop virtual player | +|`dc respawn` | respawn the virtual player | +|`dc connect` | virtual player connects to the server | +|`dc disconnect` | virtual player disconnects from the server | +|`dc reconnect` | virtual player reconnects to the server | +|`dc health ` | give the virtual player some health ( or kill them if 0 ) | +|`dc inv` | print out their inventory | +|`dc giveinv ` | give them an item | +|`dc tp ` | teleport them to the given location ( "world,3,3,3" ) | +|`dc chat my message` | have the virtual player talk in chat | +|`dc hit [damage]` | attack other players, defaults to 5 damage | +|`dc interact ` | do a PlayerInteractEvent on the specified block location | +|`/dc bpe ` | do a BlockPlaceEvent of the given material at the given location | +|`/dc bbe ` | do a BlockBreakEvent at the given location | + + +Other Commands +--- + +|command|description| +|:------|:----------| +|`/virtualplayers hideMessages` | hide messages from players | +|`/virtualplayers showMessages` | show messages from players | + + +Change Log +--- + +- **v1.5.9** + * Added backwards compatibility. + * You can now use one JAR for all craftbukkit versions. + * Tested against craftbukkit versions 1.2.5 to 1.7.9 +- **v1.5.6** + * `/dc help`: now shows help + * `/dc sneak ` : now sneaks and unsneaks +- **v1.4.3** + * Fixes for cross world moves +- **v1.4.1.1** + * Command is now vdc, with an alias for dc +- **v1.4** + * More API commands for making virtual players +- **v1.3.1** + * Fixes for bpe and bbe +- **v1.3** + * new command : `/dc bpe ` : do a BlockPlaceEvent of the given material at the given location + * new command : `/dc bbe ` : do a BlockBreakEvent at the given location +- **v1.2.5** + * new command : `/dc interact ` : interact with the location with a left or right click, with whatever item they have in hand. +- **v1.2.4** + * new command. givehelm. Set the virtual players helm + * Fix for creating virtual players in servers that don't have world +- **v1.2.3** + * new command: `/dc hit [damage]` <- attack other players + * new command: `/dc interact ` <- do a block click event +- **v1.2.0** + * Add ability for virtual players to fire AsyncPlayerChat events by the use of `/dc chat ` + + +Downloads: +--- + +**Official builds** + +You can find the official builds at dev.bukkit.org + +[http://dev.bukkit.org/bukkit-plugins/virtualplayers/] (http://dev.bukkit.org/bukkit-plugins/virtualplayers/ "Official builds") + + +**Development builds** + +```python +"Development builds of this project can be acquired at the provided continuous integration server." +"These builds have not been approved by the BukkitDev staff. Use them at your own risk." +``` + +[http://ci.battleplugins.com/job/VirtualPlayers/](http://ci.battleplugins.com/job/VirtualPlayers/ "dev builds") + +The dev builds are primarily for testing purposes. + + +Contact: +====== + +[Author: alkarin](https://github.com/alkarinv/VirtualPlayers "alkarin/VirtualPlayers") + +[alkarin on IRC](http://webchat.esper.net/?nick=&channels=battleplugins "battleplugins IRC") + +Conversion to a Maven multi-module project [by Europia79](http://dev.bukkit.org/profiles/Europia79 "Europia79 on dev.bukkit.org") + + +Javadocs +--- + +[http://ci.battleplugins.com/job/VirtualPlayers/javadoc/](http://ci.battleplugins.com/job/VirtualPlayers/javadoc/ "javadocs") + + From 496239cc2077bd2bd2487829ba0bae3c0024b25a Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 5 Jul 2014 21:23:16 -0500 Subject: [PATCH 04/74] Parent POM that defines all the modules. --- pom.xml | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7498ae5 --- /dev/null +++ b/pom.xml @@ -0,0 +1,77 @@ + + 4.0.0 + mc.alk + vp-parent + parent + pom + VirtualPlayers Parent POM + http://github.com/alkarinv/VirtualPlayers + + MMdd + UTF-8 + + + modules/util + modules/vpre + modules/v1_4_5 + modules/v1_4_6 + modules/v1_4_R1 + modules/v1_5_R1 + modules/v1_5_R2 + modules/v1_5_R3 + modules/v1_6_R1 + modules/v1_6_R2 + modules/v1_6_R3 + modules/v1_7_R1 + modules/v1_7_R2 + modules/v1_7_R3 + modules/VirtualPlayers + + + + battleplugins-repo + http://server.battleplugins.com/maven/repository/ + + + bukkit-repo + http://repo.bukkit.org/content/groups/public + + + md_5-snapshots + http://repo.md-5.net/content/repositories/snapshots/ + + + sk89q-repo + http://maven.sk89q.com/repo/ + + + vault-repo + http://nexus.theyeticave.net/content/repositories/pub_releases + + + kitteh-repo + http://repo.kitteh.org/content/repositories/public/ + + + + + junit + junit + 3.8.1 + test + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + true + + + + + From 4e89bfc5efe369b21d5209386a6a1366b01e93d9 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 5 Jul 2014 21:28:28 -0500 Subject: [PATCH 05/74] Added backwards compatibility. Tested against craftbukkit 1.2.5 to 1.7.9 All v1_X_RY imports and the corresponding code was moved out of the VirtualPlayers JavaPlugin class. Most methods were moved into mc.alk.virtualplayers.nms.v1_X_RY.VirtualPlayer.java The listener methods were moved into mc.alk.virtualplayers.nms.v1_X_RY.PlayerListener.java API methods implemented: setEventMessages(boolean enable); setPlayerMessages(boolean show); onDisable() functionality: mc.alk.virtualplayers.nms.{version}.VirtualPlayer.deleteVirtualPlayers(); Finally, some classes still need to be refactored out of the nms packages and converted into version independent classes. --- modules/VirtualPlayers/pom.xml | 215 +++++ .../mc/alk/virtualplayers/VirtualPlayers.java | 89 ++ .../VirtualPlayers/src/main/java/plugin.yml | 18 + .../java/mc/alk/virtualplayers/AppTest.java | 38 + modules/util/pom.xml | 52 ++ .../virtualplayers/util/InventoryUtil.java | 778 ++++++++++++++++++ .../mc/alk/virtualplayers/util/AppTest.java | 38 + modules/v1_4_5/pom.xml | 58 ++ .../nms/v1_4_5/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_4_5/PlayerExecutor.java | 403 +++++++++ .../nms/v1_4_5/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_4_5/Util.java | 58 ++ .../nms/v1_4_5/VPBaseExecutor.java | 115 +++ .../virtualplayers/nms/v1_4_5/VPExecutor.java | 74 ++ .../nms/v1_4_5/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_4_6/pom.xml | 58 ++ .../nms/v1_4_6/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_4_6/PlayerExecutor.java | 403 +++++++++ .../nms/v1_4_6/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_4_6/Util.java | 58 ++ .../nms/v1_4_6/VPBaseExecutor.java | 115 +++ .../virtualplayers/nms/v1_4_6/VPExecutor.java | 74 ++ .../nms/v1_4_6/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_4_R1/pom.xml | 58 ++ .../nms/v1_4_R1/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_4_R1/PlayerExecutor.java | 403 +++++++++ .../nms/v1_4_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_4_R1/Util.java | 58 ++ .../nms/v1_4_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_4_R1/VPExecutor.java | 74 ++ .../nms/v1_4_R1/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_5_R1/pom.xml | 64 ++ .../nms/v1_5_R1/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_5_R1/PlayerExecutor.java | 403 +++++++++ .../nms/v1_5_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_5_R1/Util.java | 58 ++ .../nms/v1_5_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_5_R1/VPExecutor.java | 74 ++ .../nms/v1_5_R1/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_5_R2/pom.xml | 64 ++ .../nms/v1_5_R2/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_5_R2/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_5_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_5_R2/Util.java | 58 ++ .../nms/v1_5_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_5_R2/VPExecutor.java | 74 ++ .../nms/v1_5_R2/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_5_R3/pom.xml | 64 ++ .../nms/v1_5_R3/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_5_R3/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_5_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_5_R3/Util.java | 58 ++ .../nms/v1_5_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_5_R3/VPExecutor.java | 74 ++ .../nms/v1_5_R3/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_6_R1/pom.xml | 64 ++ .../nms/v1_6_R1/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_6_R1/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_6_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_6_R1/Util.java | 58 ++ .../nms/v1_6_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_6_R1/VPExecutor.java | 74 ++ .../nms/v1_6_R1/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_6_R2/pom.xml | 64 ++ .../nms/v1_6_R2/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_6_R2/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_6_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_6_R2/Util.java | 58 ++ .../nms/v1_6_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_6_R2/VPExecutor.java | 74 ++ .../nms/v1_6_R2/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_6_R3/pom.xml | 64 ++ .../nms/v1_6_R3/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_6_R3/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_6_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_6_R3/Util.java | 58 ++ .../nms/v1_6_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_6_R3/VPExecutor.java | 74 ++ .../nms/v1_6_R3/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_7_R1/pom.xml | 64 ++ .../nms/v1_7_R1/CustomCommandExecutor.java | 761 +++++++++++++++++ .../nms/v1_7_R1/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_7_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R1/Util.java | 58 ++ .../nms/v1_7_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R1/VPExecutor.java | 74 ++ .../nms/v1_7_R1/VirtualPlayer.java | 386 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_7_R2/pom.xml | 64 ++ .../nms/v1_7_R2/CustomCommandExecutor.java | 761 +++++++++++++++++ .../nms/v1_7_R2/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_7_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R2/Util.java | 59 ++ .../nms/v1_7_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R2/VPExecutor.java | 74 ++ .../nms/v1_7_R2/VirtualPlayer.java | 392 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_7_R3/pom.xml | 64 ++ .../nms/v1_7_R3/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_7_R3/PlayerExecutor.java | 434 ++++++++++ .../nms/v1_7_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R3/Util.java | 58 ++ .../nms/v1_7_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R3/VPExecutor.java | 74 ++ .../nms/v1_7_R3/VirtualPlayer.java | 396 +++++++++ .../alk/virtualplayers/v1_7_R3/AppTest.java | 38 + modules/vpre/pom.xml | 58 ++ .../nms/vpre/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/vpre/PlayerExecutor.java | 403 +++++++++ .../nms/vpre/PlayerListener.java | 55 ++ .../mc/alk/virtualplayers/nms/vpre/Util.java | 58 ++ .../nms/vpre/VPBaseExecutor.java | 115 +++ .../virtualplayers/nms/vpre/VPExecutor.java | 74 ++ .../nms/vpre/VirtualPlayer.java | 354 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + 124 files changed, 26700 insertions(+) create mode 100644 modules/VirtualPlayers/pom.xml create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java create mode 100644 modules/VirtualPlayers/src/main/java/plugin.yml create mode 100644 modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java create mode 100644 modules/util/pom.xml create mode 100644 modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java create mode 100644 modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java create mode 100644 modules/v1_4_5/pom.xml create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java create mode 100644 modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_4_6/pom.xml create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java create mode 100644 modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_4_R1/pom.xml create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java create mode 100644 modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_5_R1/pom.xml create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java create mode 100644 modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_5_R2/pom.xml create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java create mode 100644 modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_5_R3/pom.xml create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java create mode 100644 modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_6_R1/pom.xml create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java create mode 100644 modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_6_R2/pom.xml create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java create mode 100644 modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_6_R3/pom.xml create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java create mode 100644 modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_7_R1/pom.xml create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java create mode 100644 modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_7_R2/pom.xml create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java create mode 100644 modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_7_R3/pom.xml create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java create mode 100644 modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java create mode 100644 modules/vpre/pom.xml create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java create mode 100644 modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml new file mode 100644 index 0000000..564ce45 --- /dev/null +++ b/modules/VirtualPlayers/pom.xml @@ -0,0 +1,215 @@ + + 4.0.0 + + mc.alk + VirtualPlayers + 1.5.9 + jar + + VirtualPlayers + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + mc.alk + vp-util + parent + true + + + mc.alk + vp-vpre + parent + jar + true + + + mc.alk + vp-v1_4_5 + parent + jar + true + + + mc.alk + vp-v1_4_6 + parent + jar + true + + + mc.alk + vp-v1_4_R1 + parent + jar + true + + + mc.alk + vp-v1_5_R1 + parent + jar + true + + + mc.alk + vp-v1_5_R2 + parent + jar + true + + + mc.alk + vp-v1_5_R3 + parent + jar + true + + + mc.alk + vp-v1_6_R1 + parent + jar + true + + + mc.alk + vp-v1_6_R2 + parent + jar + true + + + mc.alk + vp-v1_6_R3 + parent + jar + true + + + mc.alk + vp-v1_7_R1 + parent + jar + true + + + mc.alk + vp-v1_7_R2 + parent + jar + true + + + mc.alk + vp-v1_7_R3 + parent + jar + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers + ../../target + ./src/main/java + + + . + true + ./src/main/java + + *.yml + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + false + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + mc/alk/virtualplayers/nms/** + mc/alk/virtualplayers/api/** + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + *.metrics + + + + org.apache.maven.plugins + maven-shade-plugin + 1.4 + + + package + + shade + + + + + mc.alk:vp-* + + + + + + + + maven-antrun-plugin + + + + + + + + package + + run + + + + + + + diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java new file mode 100644 index 0000000..e556c2f --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -0,0 +1,89 @@ +package mc.alk.virtualplayers; + +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandExecutor; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + + +public class VirtualPlayers extends JavaPlugin implements Listener +{ + + @Override + public void onEnable() + { + // Bukkit.getPluginManager().registerEvents(this, this); + // getCommand("vdc").setExecutor(new PlayerExecutor(this)); + // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); + registerCommands(); + registerListeners(); + } + + @Override + public void onDisable() + { + // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.deleteVirtualPlayers(); + try { + getNmsClass("VirtualPlayer").getDeclaredMethod("deleteVirtualPlayers", new Class[]{}).invoke(null); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void setPlayerMessages(boolean show){ + // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.setGlobalMessages(show); + try { + getNmsClass("VirtualPlayer").getDeclaredMethod("setGlobalMessages", boolean.class).invoke(null, show); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void setEventMessages(boolean show){ + // mc.alk.virtualplayers.nms.{version}.VPBaseExecutor.setShowEventMessages(show); + try { + getNmsClass("VPBaseExecutor").getDeclaredMethod("setShowEventMessages", boolean.class).invoke(null, show); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public static Class getNmsClass(String clazz) throws Exception { + String mcVersion; + try { + mcVersion = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; + } catch (ArrayIndexOutOfBoundsException ex) { + mcVersion = "vpre"; + } + return Class.forName("mc.alk.virtualplayers.nms." + mcVersion + "." + clazz); + } + + private void registerListeners() { + // mc.alk.virtualplayers.nms.{version}.PlayerListener + try { + getServer().getPluginManager().registerEvents( + (Listener) getNmsClass("PlayerListener").getConstructor().newInstance(), this); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private void registerCommands() { + // getCommand("vdc").setExecutor(new PlayerExecutor(this)); + // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); + try { + getCommand("vdc").setExecutor( + (CommandExecutor) getNmsClass("PlayerExecutor") + .getConstructor(new Class[]{Plugin.class}).newInstance(this)); + getCommand("virtualplayers").setExecutor( + (CommandExecutor) getNmsClass("VPExecutor") + .getConstructor(new Class[]{Plugin.class}).newInstance(this)); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + +} diff --git a/modules/VirtualPlayers/src/main/java/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml new file mode 100644 index 0000000..0464d77 --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/plugin.yml @@ -0,0 +1,18 @@ +name: ${project.name} +version: ${project.version} +authors: [Alkarin] +description: Create Virtualplayers for debugging or running commands otherwise unavailable from the console +main: mc.alk.virtualplayers.VirtualPlayers +commands: + virtualplayers: + aliases: [vp,virtualplayer] + ap: + description: add virtual player + usage: /ap [arguments] + vdc: + aliases: [dc] + description: do command as a virtual player + usage: /dc [arguments] + + + diff --git a/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java b/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java new file mode 100644 index 0000000..a46ef6d --- /dev/null +++ b/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/util/pom.xml b/modules/util/pom.xml new file mode 100644 index 0000000..727b6db --- /dev/null +++ b/modules/util/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-util + parent + jar + + virtualplayers-util + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-Util + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java new file mode 100644 index 0000000..f58202c --- /dev/null +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -0,0 +1,778 @@ +package mc.alk.virtualplayers.Util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class InventoryUtil +{ + static final String version = "InventoryUtil 2.1.4"; + static final boolean DEBUG = false; + + public static class Armor + { + public ArmorLevel level; + public ArmorType type; + + Armor(ArmorType at, ArmorLevel al) + { + this.level = al; + this.type = at; + } + } + + public static class EnchantmentWithLevel + { + public EnchantmentWithLevel() + { + } + + public EnchantmentWithLevel(boolean all) + { + this.all = all; + } + + public Enchantment e; + public Integer lvl; + boolean all = false; + + @Override + public String toString() + { + return (e != null ? e.getName() : "null") + ":" + lvl; + } + } + + public enum ArmorLevel + { + WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND + }; + + public enum ArmorType + { + HELM, CHEST, LEGGINGS, BOOTS + }; + + public static Enchantment getEnchantmentByCommonName(String iname) + { + iname = iname.toLowerCase(); + if (iname.contains("smite")) + return Enchantment.getByName("DAMAGE_UNDEAD"); + if (iname.contains("sharp")) + return Enchantment.getByName("DAMAGE_ALL"); + if (iname.contains("fire") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_FIRE"); + if (iname.contains("fire")) + return Enchantment.getByName("FIRE_ASPECT"); + if (iname.contains("exp") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + if (iname.contains("blast") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + if (iname.contains("arrow") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_PROJECTILE"); + if (iname.contains("proj") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_PROJECTILE"); + if (iname.contains("respiration")) + return Enchantment.getByName("OXYGEN"); + if (iname.contains("fall")) + return Enchantment.getByName("PROTECTION_FALL"); + if (iname.contains("prot")) + return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); + if (iname.contains("respiration")) + return Enchantment.getByName("OXYGEN"); + if (iname.contains("oxygen")) return Enchantment.getByName("OXYGEN"); + if (iname.contains("aqua")) + return Enchantment.getByName("WATER_WORKER"); + if (iname.contains("arth")) + return Enchantment.getByName("DAMAGE_ARTHROPODS"); + if (iname.contains("knockback")) + return Enchantment.getByName("KNOCKBACK"); + if (iname.contains("loot")) + return Enchantment.getByName("LOOT_BONUS_MOBS"); + if (iname.contains("dig")) return Enchantment.getByName("DIG_SPEED"); + if (iname.contains("silk")) return Enchantment.getByName("SILK_TOUCH"); + if (iname.contains("unbreaking")) + return Enchantment.getByName("DURABILITY"); + if (iname.contains("dura")) return Enchantment.getByName("DURABILITY"); + return null; + } + + static final HashMap armor; + static + { + armor = new HashMap(); + armor.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); + armor.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.IRON)); + armor.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.CHAINMAIL)); + + armor.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.IRON)); + armor.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.CHAINMAIL)); + + armor.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.IRON)); + armor.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.CHAINMAIL)); + + armor.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.IRON)); + armor.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.CHAINMAIL)); + } + + public static int arrowCount(Player p) + { + return getItemAmount(p.getInventory().getContents(), new ItemStack( + Material.ARROW, 1)); + } + + public static int getItemAmountFromInventory(Inventory inv, ItemStack is) + { + return getItemAmount(inv.getContents(), is); + } + + public static boolean hasArmor(Player p) + { + PlayerInventory pi = p.getInventory(); + return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi + .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); + } + + public static ArmorLevel hasArmorSet(List inv) + { + ArmorLevel armorSet[] = new ArmorLevel[4]; + for (ItemStack is : inv) + { + Armor a = armor.get(is.getType()); + if (a == null) continue; + switch (a.type) + { + case BOOTS: + armorSet[0] = a.level; + break; + case LEGGINGS: + armorSet[1] = a.level; + break; + case CHEST: + armorSet[2] = a.level; + break; + case HELM: + armorSet[3] = a.level; + break; + } + } + ArmorLevel lvl = null; + for (ArmorLevel a : armorSet) + { + if (lvl == null) + lvl = a; + else if (lvl != a) return null; + } + return lvl; + } + + // + // private static Material getMaterial(ArmorLevel level) { + // switch(level){ + // case WOOL: return Material.WOOL; + // case LEATHER : return Material.LEATHER; + // case IRON: return Material.IRON_BOOTS; + // case GOLD : return Material.GOLD_BOOTS; + // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; + // case DIAMOND: return Material.DIAMOND; + // default : return null; + // } + // } + + public static int getItemAmount(ItemStack[] items, ItemStack is) + { + int count = 0; + for (ItemStack item : items) + { + if (item == null) + { + continue; + } + if (item.getType() == is.getType() + && ((item.getDurability() == is.getDurability() || item + .getDurability() == -1))) + { + count += item.getAmount(); + } + } + return count; + } + + public static ItemStack getItemStack(String name) + { + if (name == null || name.isEmpty()) return null; + name = name.replace(" ", "_"); + name = name.replace(":", ";"); + + int dataIndex = name.indexOf(';'); + dataIndex = (dataIndex != -1 ? dataIndex : -1); + int dataValue = 0; + if (dataIndex != -1) + { + dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer + .parseInt(name.substring(dataIndex + 1)) : 0); + name = name.substring(0, dataIndex); + } + + dataValue = dataValue < 0 ? 0 : dataValue; + Material mat = getMat(name); + + if (mat != null && mat != Material.AIR) + { + return new ItemStack(mat, 0, (short) dataValue); + } + return null; + } + + public static boolean isInt(String i) + { + try + { + Integer.parseInt(i); + return true; + } catch (Exception e) + { + return false; + } + } + + public static boolean isFloat(String i) + { + try + { + Float.parseFloat(i); + return true; + } catch (Exception e) + { + return false; + } + } + + // / Get the Material + public static Material getMat(String name) + { + Integer id = null; + try + { + id = Integer.parseInt(name); + } catch (Exception e) + { + } + if (id == null) + { + id = getMaterialID(name); + } + return id != null && id >= 0 ? Material.getMaterial(id) : null; + } + + // / This allows for abbreviations to work, useful for sign etc + public static int getMaterialID(String name) + { + name = name.toUpperCase(); + // / First try just getting it from the Material Name + Material mat = Material.getMaterial(name); + if (mat != null) return mat.getId(); + // / Might be an abbreviation, or a more complicated + int temp = Integer.MAX_VALUE; + mat = null; + name = name.replaceAll("\\s+", "").replaceAll("_", ""); + for (Material m : Material.values()) + { + if (m.name().replaceAll("_", "").startsWith(name)) + { + if (m.name().length() < temp) + { + mat = m; + temp = m.name().length(); + } + } + } + return mat != null ? mat.getId() : -1; + } + + public static boolean hasItem(Player p, ItemStack itemType) + { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) + { + if (is != null && is.getType() == itemType.getType()) + { + return true; + } + } + for (ItemStack is : inv.getArmorContents()) + { + if (is != null && is.getType() == itemType.getType()) + { + return true; + } + } + return false; + } + + public static boolean hasAnyItem(Player p) + { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) + { + if (is != null && is.getType() != Material.AIR) + { + // System.out.println("item=" + is); + return true; + } + } + for (ItemStack is : inv.getArmorContents()) + { + if (is != null && is.getType() != Material.AIR) + { + // System.out.println("item=" + is); + return true; + } + } + + return false; + } + + public static void addItemToInventory(Player player, ItemStack itemStack) + { + addItemToInventory(player, itemStack, itemStack.getAmount(), true, + false); + } + + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount) + { + addItemToInventory(player, itemStack, stockAmount, true, false); + } + + @SuppressWarnings("deprecation") + public static void addItemsToInventory(Player p, List items, + boolean ignoreHelmet) + { + for (ItemStack is : items) + InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), + false, false); + try + { + p.updateInventory(); + } catch (Exception e) + { + } + } + + @SuppressWarnings("deprecation") + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount, boolean update, boolean ignoreHelmet) + { + PlayerInventory inv = player.getInventory(); + Material itemType = itemStack.getType(); + if (armor.containsKey(itemType)) + { + // / no item: add to armor slot + // / item better: add old to inventory, new to armor slot + // / item notbetter: add to inventory + ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); + boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); + boolean better = empty ? false : armorSlotBetter( + armor.get(oldArmor.getType()), armor.get(itemType)); + final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; + if (empty || better) + { + switch (armor.get(itemType).type) + { + case HELM: + inv.setHelmet(itemStack); + break; + case CHEST: + inv.setChestplate(itemStack); + break; + case LEGGINGS: + inv.setLeggings(itemStack); + break; + case BOOTS: + inv.setBoots(itemStack); + break; + } + } + if (!empty) + { + if (better && (!isHelmet && ignoreHelmet)) + { + addItemToInventory(inv, oldArmor, oldArmor.getAmount()); + } + else + { + addItemToInventory(inv, itemStack, stockAmount); + } + } + } + else + { + addItemToInventory(inv, itemStack, stockAmount); + } + if (update) try + { + player.updateInventory(); + } catch (Exception e) + { + } + } + + private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) + { + if (oldArmor == null || newArmor == null) // / technically we could + // throw an exception.. but + // nah + return false; + return oldArmor.level.ordinal() < newArmor.level.ordinal(); + } + + private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) + { + switch (armor.type) + { + case HELM: + return inv.getHelmet(); + case CHEST: + return inv.getChestplate(); + case LEGGINGS: + return inv.getLeggings(); + case BOOTS: + return inv.getBoots(); + } + return null; + } + + // /Adds item to inventory + public static void addItemToInventory(Inventory inv, ItemStack is, int left) + { + int maxStackSize = is.getType().getMaxStackSize(); + if (left <= maxStackSize) + { + is.setAmount(left); + inv.addItem(is); + return; + } + + if (maxStackSize != 64) + { + ArrayList items = new ArrayList(); + for (int i = 0; i < Math.ceil(left / maxStackSize); i++) + { + if (left < maxStackSize) + { + is.setAmount(left); + items.add(is); + return; + } + else + { + is.setAmount(maxStackSize); + items.add(is); + } + } + Object[] iArray = items.toArray(); + for (Object o : iArray) + { + inv.addItem((ItemStack) o); + } + } + else + { + inv.addItem(is); + } + } + + public static void closeInventory(Player p) + { + + try + { + p.closeInventory(); + } catch (Exception closeInventoryError) + { + // / This almost always throws an NPE, but does its job so ignore + } + } + + public static void clearInventory(Player p) + { + try + { + PlayerInventory inv = p.getInventory(); + closeInventory(p); + + if (inv != null) + { + inv.clear(); + inv.setArmorContents(null); + inv.setItemInHand(null); + } + } catch (Exception ee) + { + ee.printStackTrace(); + } + } + + public static Object getCommonName(ItemStack is) + { + int id = is.getTypeId(); + int datavalue = is.getDurability(); + if (datavalue > 0) + { + return Material.getMaterial(id).toString() + ":" + datavalue; + } + return Material.getMaterial(id).toString(); + } + + public static boolean isItem(String str) + { + // System.out.println("string = " + str); + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + if (DEBUG) System.out.println("item=" + str); + ItemStack is = null; + try + { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + is.setAmount(Integer.valueOf(split[split.length - 1])); + for (int i = 1; i < split.length - 1; i++) + { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try + { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) + { + return false; + } + } + } catch (Exception e) + { + return false; + } + return true; + } + + public static ItemStack parseItem(String str) throws Exception + { + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + if (DEBUG) System.out.println("item=" + str); + ItemStack is = null; + try + { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + // System.out.println(" split = " + split); + final int amt = split.length > 1 ? Integer + .valueOf(split[split.length - 1]) : 1; + is.setAmount(amt); + for (int i = 1; i < split.length - 1; i++) + { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try + { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) + { + Logger.getLogger("minecraft").warning( + ewl + " can not be applied to the item " + str); + } + } + } catch (Exception e) + { + e.printStackTrace(); + Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); + throw new Exception("parse item was bad"); + } + return is; + } + + public static EnchantmentWithLevel getEnchantment(String str) + { + if (str.equalsIgnoreCase("all")) + { + return new EnchantmentWithLevel(true); + } + Enchantment e = null; + str = str.replaceAll(",", ":"); + int index = str.indexOf(':'); + index = (index != -1 ? index : -1); + int lvl = -1; + if (index != -1) + { + try + { + lvl = Integer.parseInt(str.substring(index + 1)); + } catch (Exception err) + { + } + str = str.substring(0, index); + } + + // System.out.println("String = <" + str +"> " + lvl); + try + { + e = Enchantment.getById(Integer.valueOf(str)); + } catch (Exception err) + { + } + if (e == null) e = Enchantment.getByName(str); + if (e == null) e = getEnchantmentByCommonName(str); + if (e == null) return null; + EnchantmentWithLevel ewl = new EnchantmentWithLevel(); + ewl.e = e; + if (lvl < e.getStartLevel()) + { + lvl = e.getStartLevel(); + } + if (lvl > e.getMaxLevel()) + { + lvl = e.getMaxLevel(); + } + ewl.lvl = lvl; + return ewl; + } + + public boolean addEnchantments(ItemStack is, String[] args) + { + Map encs = new HashMap(); + for (String s : args) + { + EnchantmentWithLevel ewl = getEnchantment(s); + if (ewl != null) + { + if (ewl.all) + { + return addAllEnchantments(is); + } + encs.put(ewl.e, ewl.lvl); + } + } + addEnchantments(is, encs); + return true; + } + + public void addEnchantments(ItemStack is, + Map enchantments) + { + for (Enchantment e : enchantments.keySet()) + { + if (e.canEnchantItem(is)) + { + is.addUnsafeEnchantment(e, enchantments.get(e)); + } + } + } + + public boolean addAllEnchantments(ItemStack is) + { + for (Enchantment enc : Enchantment.values()) + { + if (enc.canEnchantItem(is)) + { + is.addUnsafeEnchantment(enc, enc.getMaxLevel()); + } + } + return true; + } + + /** + * For Serializing an item or printing + * + * @param is + * @return + */ + public static String getItemString(ItemStack is) + { + if (is == null) return null; + StringBuilder sb = new StringBuilder(); + sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); + Map encs = is.getEnchantments(); + for (Enchantment enc : encs.keySet()) + { + sb.append(enc.getName() + ":" + encs.get(enc) + " "); + } + sb.append(is.getAmount()); + return sb.toString(); + } + + public static boolean hasEnchantedItem(Player p) + { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) + { + if (is != null && is.getType() != Material.AIR) + { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) return true; + } + } + for (ItemStack is : inv.getArmorContents()) + { + if (is != null && is.getType() != Material.AIR) + { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) return true; + } + } + return false; + } + + public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) + { + Armor a = armor.get(is.getType()); + if (a == null) return false; + return a.level == lvl; + } + + public static ItemStack getWool(int color) + { + return new ItemStack(Material.WOOL, 1, (short) color); + } +} diff --git a/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java b/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java new file mode 100644 index 0000000..06f0fef --- /dev/null +++ b/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.util; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + * + public static Test suite() + { + return new TestSuite( InventoryUtil.class ); + } */ + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml new file mode 100644 index 0000000..f1cb470 --- /dev/null +++ b/modules/v1_4_5/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_5 + parent + jar + + virtualplayers-v1_4_5 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.4.5-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_5 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java new file mode 100644 index 0000000..956bebb --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java new file mode 100644 index 0000000..1a176e8 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_4_5.DamageSource; +import net.minecraft.server.v1_4_5.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_4_5.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java new file mode 100644 index 0000000..d6b8746 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java new file mode 100644 index 0000000..856fba0 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java new file mode 100644 index 0000000..488d838 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java new file mode 100644 index 0000000..10a671f --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java new file mode 100644 index 0000000..a41f22a --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_4_5.EntityPlayer; +import net.minecraft.server.v1_4_5.ItemInWorldManager; +import net.minecraft.server.v1_4_5.MinecraftServer; +import net.minecraft.server.v1_4_5.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_5.CraftServer; +import org.bukkit.craftbukkit.v1_4_5.CraftWorld; +import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml new file mode 100644 index 0000000..a85e114 --- /dev/null +++ b/modules/v1_4_6/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_6 + parent + jar + + virtualplayers-v1_4_6 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.4.6-R0.3 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_6 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java new file mode 100644 index 0000000..b8f406e --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java new file mode 100644 index 0000000..369b549 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_4_6.DamageSource; +import net.minecraft.server.v1_4_6.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_4_6.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java new file mode 100644 index 0000000..97e37de --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java new file mode 100644 index 0000000..5b9509e --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java new file mode 100644 index 0000000..910e559 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java new file mode 100644 index 0000000..82206ae --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java new file mode 100644 index 0000000..bc46c99 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_4_6.EntityPlayer; +import net.minecraft.server.v1_4_6.MinecraftServer; +import net.minecraft.server.v1_4_6.PlayerInteractManager; +import net.minecraft.server.v1_4_6.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_6.CraftServer; +import org.bukkit.craftbukkit.v1_4_6.CraftWorld; +import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml new file mode 100644 index 0000000..83d7975 --- /dev/null +++ b/modules/v1_4_R1/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_R1 + parent + jar + + virtualplayers-v1_4_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.4.7-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..48999df --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java new file mode 100644 index 0000000..2328e8f --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_4_R1.DamageSource; +import net.minecraft.server.v1_4_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java new file mode 100644 index 0000000..7283146 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java new file mode 100644 index 0000000..2b7837b --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java new file mode 100644 index 0000000..9b9e3f1 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java new file mode 100644 index 0000000..a134b82 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java new file mode 100644 index 0000000..02bf915 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_4_R1.EntityPlayer; +import net.minecraft.server.v1_4_R1.MinecraftServer; +import net.minecraft.server.v1_4_R1.PlayerInteractManager; +import net.minecraft.server.v1_4_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_R1.CraftServer; +import org.bukkit.craftbukkit.v1_4_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml new file mode 100644 index 0000000..59d8881 --- /dev/null +++ b/modules/v1_5_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_5_R1 + parent + jar + + virtualplayers-v1_5_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.5-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.5-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_5_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..dec575a --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java new file mode 100644 index 0000000..98a8d1b --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_5_R1.DamageSource; +import net.minecraft.server.v1_5_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java new file mode 100644 index 0000000..96c1403 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java new file mode 100644 index 0000000..3a57f82 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java new file mode 100644 index 0000000..7d4d263 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java new file mode 100644 index 0000000..d786283 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java new file mode 100644 index 0000000..244f071 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_5_R1.EntityPlayer; +import net.minecraft.server.v1_5_R1.MinecraftServer; +import net.minecraft.server.v1_5_R1.PlayerInteractManager; +import net.minecraft.server.v1_5_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R1.CraftServer; +import org.bukkit.craftbukkit.v1_5_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_5_R2/pom.xml b/modules/v1_5_R2/pom.xml new file mode 100644 index 0000000..dc19298 --- /dev/null +++ b/modules/v1_5_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_5_R2 + parent + jar + + virtualplayers-v1_5_R2 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.5.1-R0.2 + provided + + + org.bukkit + craftbukkit + 1.5.1-R0.2 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_5_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..d977b9e --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java new file mode 100644 index 0000000..708a5b0 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_5_R2.DamageSource; +import net.minecraft.server.v1_5_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java new file mode 100644 index 0000000..d485405 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java new file mode 100644 index 0000000..c31484c --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java new file mode 100644 index 0000000..1da776b --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java new file mode 100644 index 0000000..6f92eca --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java new file mode 100644 index 0000000..29296c9 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_5_R2.EntityPlayer; +import net.minecraft.server.v1_5_R2.MinecraftServer; +import net.minecraft.server.v1_5_R2.PlayerInteractManager; +import net.minecraft.server.v1_5_R2.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R2.CraftServer; +import org.bukkit.craftbukkit.v1_5_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_5_R3/pom.xml b/modules/v1_5_R3/pom.xml new file mode 100644 index 0000000..7e8f7f4 --- /dev/null +++ b/modules/v1_5_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_5_R3 + parent + jar + + virtualplayers-v1_5_R3 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.5.2-R1.0 + provided + + + org.bukkit + craftbukkit + 1.5.2-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_5_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..d355e84 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java new file mode 100644 index 0000000..01f9aa1 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_5_R3.DamageSource; +import net.minecraft.server.v1_5_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java new file mode 100644 index 0000000..030de7c --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java new file mode 100644 index 0000000..6c07170 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java new file mode 100644 index 0000000..f8a6a34 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java new file mode 100644 index 0000000..08f34f5 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java new file mode 100644 index 0000000..427c7df --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_5_R3.EntityPlayer; +import net.minecraft.server.v1_5_R3.MinecraftServer; +import net.minecraft.server.v1_5_R3.PlayerInteractManager; +import net.minecraft.server.v1_5_R3.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R3.CraftServer; +import org.bukkit.craftbukkit.v1_5_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml new file mode 100644 index 0000000..806fd6f --- /dev/null +++ b/modules/v1_6_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_6_R1 + parent + jar + + virtualplayers-v1_6_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.6.1-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.6.1-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_6_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..241d07e --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java new file mode 100644 index 0000000..bc6b447 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_6_R1.DamageSource; +import net.minecraft.server.v1_6_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java new file mode 100644 index 0000000..09feb10 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java new file mode 100644 index 0000000..221b4d1 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java new file mode 100644 index 0000000..2b0c612 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java new file mode 100644 index 0000000..12830da --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java new file mode 100644 index 0000000..4facf49 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_6_R1.EntityPlayer; +import net.minecraft.server.v1_6_R1.MinecraftServer; +import net.minecraft.server.v1_6_R1.PlayerInteractManager; +import net.minecraft.server.v1_6_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R1.CraftServer; +import org.bukkit.craftbukkit.v1_6_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20D; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_6_R2/pom.xml b/modules/v1_6_R2/pom.xml new file mode 100644 index 0000000..44156ce --- /dev/null +++ b/modules/v1_6_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_6_R2 + parent + jar + + virtualplayers-v1_6_R2 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.6.2-R1.0 + provided + + + org.bukkit + craftbukkit + 1.6.2-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_6_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..ef1b1fa --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java new file mode 100644 index 0000000..cb00192 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_6_R2.DamageSource; +import net.minecraft.server.v1_6_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R2.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java new file mode 100644 index 0000000..0f5f314 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java new file mode 100644 index 0000000..8db50d8 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java new file mode 100644 index 0000000..b58f96d --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java new file mode 100644 index 0000000..74ee57c --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java new file mode 100644 index 0000000..4410038 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_6_R2.EntityPlayer; +import net.minecraft.server.v1_6_R2.MinecraftServer; +import net.minecraft.server.v1_6_R2.PlayerInteractManager; +import net.minecraft.server.v1_6_R2.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R2.CraftServer; +import org.bukkit.craftbukkit.v1_6_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20D; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_6_R3/pom.xml b/modules/v1_6_R3/pom.xml new file mode 100644 index 0000000..2982e05 --- /dev/null +++ b/modules/v1_6_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_6_R3 + parent + jar + + virtualplayers-v1_6_R3 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.6.4-R2.0 + provided + + + org.bukkit + craftbukkit + 1.6.4-R2.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_6_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..1534152 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java new file mode 100644 index 0000000..7ca264b --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_6_R3.DamageSource; +import net.minecraft.server.v1_6_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java new file mode 100644 index 0000000..a59561d --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java new file mode 100644 index 0000000..41e492b --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java new file mode 100644 index 0000000..e6aef4a --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java new file mode 100644 index 0000000..95d4c29 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java new file mode 100644 index 0000000..31cbe18 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_6_R3.EntityPlayer; +import net.minecraft.server.v1_6_R3.MinecraftServer; +import net.minecraft.server.v1_6_R3.PlayerInteractManager; +import net.minecraft.server.v1_6_R3.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R3.CraftServer; +import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_7_R1/pom.xml b/modules/v1_7_R1/pom.xml new file mode 100644 index 0000000..2545f2c --- /dev/null +++ b/modules/v1_7_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R1 + parent + jar + + virtualplayers-v1_7_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + org.bukkit + craftbukkit + 1.7.2-R0.3 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..1ad6dae --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java @@ -0,0 +1,761 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; +import mc.alk.virtualplayers.nms.v1_7_R1.VirtualPlayer; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java new file mode 100644 index 0000000..dc941a9 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_7_R1.DamageSource; +import net.minecraft.server.v1_7_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java new file mode 100644 index 0000000..ddf255b --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java new file mode 100644 index 0000000..7b1bc7d --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java new file mode 100644 index 0000000..6f49191 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java new file mode 100644 index 0000000..728c428 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java new file mode 100644 index 0000000..d6eec73 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java @@ -0,0 +1,386 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R1.EntityPlayer; +import net.minecraft.server.v1_7_R1.MinecraftServer; +import net.minecraft.server.v1_7_R1.PlayerInteractManager; +import net.minecraft.server.v1_7_R1.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R1.CraftServer; +import org.bukkit.craftbukkit.v1_7_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml new file mode 100644 index 0000000..d67c77f --- /dev/null +++ b/modules/v1_7_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R2 + parent + jar + + virtualplayers-v1_7_R2 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..880b954 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java @@ -0,0 +1,761 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; +import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java new file mode 100644 index 0000000..1455418 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_7_R2.DamageSource; +import net.minecraft.server.v1_7_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java new file mode 100644 index 0000000..99417d1 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java new file mode 100644 index 0000000..8a7f897 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java @@ -0,0 +1,59 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java new file mode 100644 index 0000000..de964cd --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java new file mode 100644 index 0000000..8232635 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java new file mode 100644 index 0000000..57a6fa2 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java @@ -0,0 +1,392 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R2.EntityPlayer; +import net.minecraft.server.v1_7_R2.MinecraftServer; +import net.minecraft.server.v1_7_R2.PlayerInteractManager; +import net.minecraft.server.v1_7_R2.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R2.CraftServer; +import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) vp = vps.get(id); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_7_R3/pom.xml b/modules/v1_7_R3/pom.xml new file mode 100644 index 0000000..1d00cb8 --- /dev/null +++ b/modules/v1_7_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R3 + parent + jar + + virtualplayers-v1_7_R3 + http://maven.apache.org + + + UTF-8 + + + + + mc.alk + vp-util + parent + true + + + org.bukkit + bukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.7.9-R0.1 + provided + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..03ba980 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java new file mode 100644 index 0000000..b347d7c --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java @@ -0,0 +1,434 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_7_R3.DamageSource; +import net.minecraft.server.v1_7_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin p) { + super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"),1); + super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java new file mode 100644 index 0000000..2d4bdc2 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java new file mode 100644 index 0000000..ea4d748 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java new file mode 100644 index 0000000..57dd9a0 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java new file mode 100644 index 0000000..3b0b617 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.command.CommandSender; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java new file mode 100644 index 0000000..66eedf8 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java @@ -0,0 +1,396 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R3.EntityPlayer; +import net.minecraft.server.v1_7_R3.MinecraftServer; +import net.minecraft.server.v1_7_R3.PlayerInteractManager; +import net.minecraft.server.v1_7_R3.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R3.CraftServer; +import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer implements Listener { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) vp = vps.get(id); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} diff --git a/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java b/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java new file mode 100644 index 0000000..aad11e8 --- /dev/null +++ b/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R3; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml new file mode 100644 index 0000000..05d1fc6 --- /dev/null +++ b/modules/vpre/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-vpre + parent + jar + + virtualplayers-vPre + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.3.2-R3.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-vPre + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java new file mode 100644 index 0000000..df6d049 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.vpre; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java new file mode 100644 index 0000000..1271c74 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.vpre; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.DamageSource; +import net.minecraft.server.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java new file mode 100644 index 0000000..17b6abe --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java new file mode 100644 index 0000000..e07b026 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java new file mode 100644 index 0000000..0873de4 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java new file mode 100644 index 0000000..bf0c64f --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java new file mode 100644 index 0000000..ae259f5 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java @@ -0,0 +1,354 @@ +package mc.alk.virtualplayers.nms.vpre; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was factored out of VirtualPlayers JavaPlugin class. + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} From eb848273f6c96f0c62a4071d308e8930bd270f79 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 5 Jul 2014 22:21:19 -0500 Subject: [PATCH 06/74] Whoops. Originally, I created a new branch to play around with changes... Then later, I decided to make a new repository to make changes. Went back to original repo and I accidentally commited the changes to branch '175' instead of the master branch. Tried to merge the two branches, but didn't work out. --- README.md | 113 --- VirtualPlayers/pom.xml | 73 -- .../mc/alk/virtualPlayer/VirtualPlayers.java | 65 -- .../nms/v1_7_R3/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_7_R3/PlayerExecutor.java | 433 ---------- .../alk/virtualplayers/nms/v1_7_R3/Util.java | 58 -- .../nms/v1_7_R3/VPBaseExecutor.java | 115 --- .../nms/v1_7_R3/VPExecutor.java | 74 -- .../nms/v1_7_R3/VirtualPlayer.java | 426 ---------- modules/VirtualPlayers/pom.xml | 215 ----- .../mc/alk/virtualplayers/VirtualPlayers.java | 89 -- .../VirtualPlayers/src/main/java/plugin.yml | 18 - .../java/mc/alk/virtualplayers/AppTest.java | 38 - modules/util/pom.xml | 52 -- .../virtualplayers/util/InventoryUtil.java | 778 ------------------ .../mc/alk/virtualplayers/util/AppTest.java | 38 - modules/v1_4_5/pom.xml | 58 -- .../nms/v1_4_5/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_4_5/PlayerExecutor.java | 403 --------- .../nms/v1_4_5/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_4_5/Util.java | 58 -- .../nms/v1_4_5/VPBaseExecutor.java | 115 --- .../virtualplayers/nms/v1_4_5/VPExecutor.java | 74 -- .../nms/v1_4_5/VirtualPlayer.java | 357 -------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_4_6/pom.xml | 58 -- .../nms/v1_4_6/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_4_6/PlayerExecutor.java | 403 --------- .../nms/v1_4_6/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_4_6/Util.java | 58 -- .../nms/v1_4_6/VPBaseExecutor.java | 115 --- .../virtualplayers/nms/v1_4_6/VPExecutor.java | 74 -- .../nms/v1_4_6/VirtualPlayer.java | 357 -------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_4_R1/pom.xml | 58 -- .../nms/v1_4_R1/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_4_R1/PlayerExecutor.java | 403 --------- .../nms/v1_4_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_4_R1/Util.java | 58 -- .../nms/v1_4_R1/VPBaseExecutor.java | 115 --- .../nms/v1_4_R1/VPExecutor.java | 74 -- .../nms/v1_4_R1/VirtualPlayer.java | 357 -------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_5_R1/pom.xml | 64 -- .../nms/v1_5_R1/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_5_R1/PlayerExecutor.java | 403 --------- .../nms/v1_5_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_5_R1/Util.java | 58 -- .../nms/v1_5_R1/VPBaseExecutor.java | 115 --- .../nms/v1_5_R1/VPExecutor.java | 74 -- .../nms/v1_5_R1/VirtualPlayer.java | 357 -------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_5_R2/pom.xml | 64 -- .../nms/v1_5_R2/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_5_R2/PlayerExecutor.java | 433 ---------- .../nms/v1_5_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_5_R2/Util.java | 58 -- .../nms/v1_5_R2/VPBaseExecutor.java | 115 --- .../nms/v1_5_R2/VPExecutor.java | 74 -- .../nms/v1_5_R2/VirtualPlayer.java | 385 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_5_R3/pom.xml | 64 -- .../nms/v1_5_R3/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_5_R3/PlayerExecutor.java | 433 ---------- .../nms/v1_5_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_5_R3/Util.java | 58 -- .../nms/v1_5_R3/VPBaseExecutor.java | 115 --- .../nms/v1_5_R3/VPExecutor.java | 74 -- .../nms/v1_5_R3/VirtualPlayer.java | 385 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_6_R1/pom.xml | 64 -- .../nms/v1_6_R1/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_6_R1/PlayerExecutor.java | 433 ---------- .../nms/v1_6_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_6_R1/Util.java | 58 -- .../nms/v1_6_R1/VPBaseExecutor.java | 115 --- .../nms/v1_6_R1/VPExecutor.java | 74 -- .../nms/v1_6_R1/VirtualPlayer.java | 385 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_6_R2/pom.xml | 64 -- .../nms/v1_6_R2/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_6_R2/PlayerExecutor.java | 433 ---------- .../nms/v1_6_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_6_R2/Util.java | 58 -- .../nms/v1_6_R2/VPBaseExecutor.java | 115 --- .../nms/v1_6_R2/VPExecutor.java | 74 -- .../nms/v1_6_R2/VirtualPlayer.java | 385 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_6_R3/pom.xml | 64 -- .../nms/v1_6_R3/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_6_R3/PlayerExecutor.java | 433 ---------- .../nms/v1_6_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_6_R3/Util.java | 58 -- .../nms/v1_6_R3/VPBaseExecutor.java | 115 --- .../nms/v1_6_R3/VPExecutor.java | 74 -- .../nms/v1_6_R3/VirtualPlayer.java | 385 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_7_R1/pom.xml | 64 -- .../nms/v1_7_R1/CustomCommandExecutor.java | 761 ----------------- .../nms/v1_7_R1/PlayerExecutor.java | 433 ---------- .../nms/v1_7_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R1/Util.java | 58 -- .../nms/v1_7_R1/VPBaseExecutor.java | 115 --- .../nms/v1_7_R1/VPExecutor.java | 74 -- .../nms/v1_7_R1/VirtualPlayer.java | 386 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_7_R2/pom.xml | 64 -- .../nms/v1_7_R2/CustomCommandExecutor.java | 761 ----------------- .../nms/v1_7_R2/PlayerExecutor.java | 433 ---------- .../nms/v1_7_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R2/Util.java | 59 -- .../nms/v1_7_R2/VPBaseExecutor.java | 115 --- .../nms/v1_7_R2/VPExecutor.java | 74 -- .../nms/v1_7_R2/VirtualPlayer.java | 392 --------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - modules/v1_7_R3/pom.xml | 64 -- .../nms/v1_7_R3/CustomCommandExecutor.java | 760 ----------------- .../nms/v1_7_R3/PlayerExecutor.java | 434 ---------- .../nms/v1_7_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R3/Util.java | 58 -- .../nms/v1_7_R3/VPBaseExecutor.java | 115 --- .../nms/v1_7_R3/VPExecutor.java | 74 -- .../nms/v1_7_R3/VirtualPlayer.java | 396 --------- .../alk/virtualplayers/v1_7_R3/AppTest.java | 38 - modules/vpre/pom.xml | 58 -- .../nms/vpre/CustomCommandExecutor.java | 760 ----------------- .../nms/vpre/PlayerExecutor.java | 403 --------- .../nms/vpre/PlayerListener.java | 55 -- .../mc/alk/virtualplayers/nms/vpre/Util.java | 58 -- .../nms/vpre/VPBaseExecutor.java | 115 --- .../virtualplayers/nms/vpre/VPExecutor.java | 74 -- .../nms/vpre/VirtualPlayer.java | 354 -------- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 - pom.xml | 77 -- 134 files changed, 28894 deletions(-) delete mode 100644 README.md delete mode 100644 VirtualPlayers/pom.xml delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java delete mode 100644 VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java delete mode 100644 modules/VirtualPlayers/pom.xml delete mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java delete mode 100644 modules/VirtualPlayers/src/main/java/plugin.yml delete mode 100644 modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java delete mode 100644 modules/util/pom.xml delete mode 100644 modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java delete mode 100644 modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java delete mode 100644 modules/v1_4_5/pom.xml delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java delete mode 100644 modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_4_6/pom.xml delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java delete mode 100644 modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_4_R1/pom.xml delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java delete mode 100644 modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_5_R1/pom.xml delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java delete mode 100644 modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_5_R2/pom.xml delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java delete mode 100644 modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_5_R3/pom.xml delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java delete mode 100644 modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_6_R1/pom.xml delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java delete mode 100644 modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_6_R2/pom.xml delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java delete mode 100644 modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_6_R3/pom.xml delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java delete mode 100644 modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_7_R1/pom.xml delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java delete mode 100644 modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_7_R2/pom.xml delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java delete mode 100644 modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 modules/v1_7_R3/pom.xml delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java delete mode 100644 modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java delete mode 100644 modules/vpre/pom.xml delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java delete mode 100644 modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java delete mode 100644 pom.xml diff --git a/README.md b/README.md deleted file mode 100644 index 9c65c50..0000000 --- a/README.md +++ /dev/null @@ -1,113 +0,0 @@ -VirtualPlayers2 -====== -Bukkit plugin that creates virtual players: -Used for easy debugging of plugins through the console. - - -VirtualPlayers2 was made for developers who need to easily test -their plugins against multiple versions of craftbukkit. - - -Commands as Players ---- - -|command|description| -|:------|:----------| -|`dc ` | any command you would normally do as a player | -|`dc op` | op virtual player | -|`dc deop` | deop virtual player | -|`dc respawn` | respawn the virtual player | -|`dc connect` | virtual player connects to the server | -|`dc disconnect` | virtual player disconnects from the server | -|`dc reconnect` | virtual player reconnects to the server | -|`dc health ` | give the virtual player some health ( or kill them if 0 ) | -|`dc inv` | print out their inventory | -|`dc giveinv ` | give them an item | -|`dc tp ` | teleport them to the given location ( "world,3,3,3" ) | -|`dc chat my message` | have the virtual player talk in chat | -|`dc hit [damage]` | attack other players, defaults to 5 damage | -|`dc interact ` | do a PlayerInteractEvent on the specified block location | -|`/dc bpe ` | do a BlockPlaceEvent of the given material at the given location | -|`/dc bbe ` | do a BlockBreakEvent at the given location | - - -Other Commands ---- - -|command|description| -|:------|:----------| -|`/virtualplayers hideMessages` | hide messages from players | -|`/virtualplayers showMessages` | show messages from players | - - -Change Log ---- - -- **v1.5.9** - * Added backwards compatibility. - * You can now use one JAR for all craftbukkit versions. - * Tested against craftbukkit versions 1.2.5 to 1.7.9 -- **v1.5.6** - * `/dc help`: now shows help - * `/dc sneak ` : now sneaks and unsneaks -- **v1.4.3** - * Fixes for cross world moves -- **v1.4.1.1** - * Command is now vdc, with an alias for dc -- **v1.4** - * More API commands for making virtual players -- **v1.3.1** - * Fixes for bpe and bbe -- **v1.3** - * new command : `/dc bpe ` : do a BlockPlaceEvent of the given material at the given location - * new command : `/dc bbe ` : do a BlockBreakEvent at the given location -- **v1.2.5** - * new command : `/dc interact ` : interact with the location with a left or right click, with whatever item they have in hand. -- **v1.2.4** - * new command. givehelm. Set the virtual players helm - * Fix for creating virtual players in servers that don't have world -- **v1.2.3** - * new command: `/dc hit [damage]` <- attack other players - * new command: `/dc interact ` <- do a block click event -- **v1.2.0** - * Add ability for virtual players to fire AsyncPlayerChat events by the use of `/dc chat ` - - -Downloads: ---- - -**Official builds** - -You can find the official builds at dev.bukkit.org - -[http://dev.bukkit.org/bukkit-plugins/virtualplayers/] (http://dev.bukkit.org/bukkit-plugins/virtualplayers/ "Official builds") - - -**Development builds** - -```python -"Development builds of this project can be acquired at the provided continuous integration server." -"These builds have not been approved by the BukkitDev staff. Use them at your own risk." -``` - -[http://ci.battleplugins.com/job/VirtualPlayers/](http://ci.battleplugins.com/job/VirtualPlayers/ "dev builds") - -The dev builds are primarily for testing purposes. - - -Contact: -====== - -[Author: alkarin](https://github.com/alkarinv/VirtualPlayers "alkarin/VirtualPlayers") - -[alkarin on IRC](http://webchat.esper.net/?nick=&channels=battleplugins "battleplugins IRC") - -Conversion to a Maven multi-module project [by Europia79](http://dev.bukkit.org/profiles/Europia79 "Europia79 on dev.bukkit.org") - - -Javadocs ---- - -[http://ci.battleplugins.com/job/VirtualPlayers/javadoc/](http://ci.battleplugins.com/job/VirtualPlayers/javadoc/ "javadocs") - - diff --git a/VirtualPlayers/pom.xml b/VirtualPlayers/pom.xml deleted file mode 100644 index 6977b6d..0000000 --- a/VirtualPlayers/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - 4.0.0 - mc.alk - VirtualPlayers - jar - 1.5.8 - VirtualPlayers-master - - UTF-8 - - http://maven.apache.org - - - - bukkit-repo - http://repo.bukkit.org/content/groups/public - - - - - - - org.bukkit - bukkit - 1.7.5-R0.1-SNAPSHOT - provided - - - org.bukkit - craftbukkit - 1.7.8-R0.1-SNAPSHOT - provided - - - - - - - ${project.name} - - - org.apache.maven.wagon - wagon-ssh - 2.4 - - - install - - ${basedir}/src/java - - - - . - true - ${basedir} - - plugin.yml - default_files/* - - - - - - - - - - battleplugins-repo - scp://server.battleplugins.com/var/www/server.battleplugins.com/htdocs/maven/repository - - - diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java b/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java deleted file mode 100644 index f6875c1..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/VirtualPlayers.java +++ /dev/null @@ -1,65 +0,0 @@ -package mc.alk.virtualPlayer; - -import org.bukkit.Bukkit; -import org.bukkit.event.Listener; -import org.bukkit.plugin.java.JavaPlugin; - - -public class VirtualPlayers extends JavaPlugin implements Listener -{ - - - - @Override - public void onEnable() - { - Bukkit.getPluginManager().registerEvents(this, this); - // getCommand("vdc").setExecutor(new PlayerExecutor(this)); - // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); - } - - @Override - public void onDisable() - { - // VirtualPlayer.deleteVirtualPlayers(); - } - - public static void setPlayerMessages(boolean show){ - // VirtualPlayer.setGlobalMessages(show); - } - - public static void setEventMessages(boolean show){ - // VPBaseExecutor.setShowEventMessages(show); - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java deleted file mode 100644 index f3e101f..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import mc.alk.virtualPlayer.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java deleted file mode 100644 index 562e2dc..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import mc.alk.virtualPlayer.Util.InventoryUtil; -import net.minecraft.server.v1_7_R3.DamageSource; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java deleted file mode 100644 index a3825cb..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java deleted file mode 100644 index 57dd9a0..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java deleted file mode 100644 index 9beda33..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java deleted file mode 100644 index 190c936..0000000 --- a/VirtualPlayers/src/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java +++ /dev/null @@ -1,426 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import net.minecraft.server.v1_7_R3.MinecraftServer; -import net.minecraft.server.v1_7_R3.PlayerInteractManager; -import net.minecraft.server.v1_7_R3.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; -import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer implements Listener { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, - GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Added stuff below. - */ - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (vps.containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!vps.containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } -} diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml deleted file mode 100644 index 564ce45..0000000 --- a/modules/VirtualPlayers/pom.xml +++ /dev/null @@ -1,215 +0,0 @@ - - 4.0.0 - - mc.alk - VirtualPlayers - 1.5.9 - jar - - VirtualPlayers - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.7.2-R0.3 - provided - - - mc.alk - vp-util - parent - true - - - mc.alk - vp-vpre - parent - jar - true - - - mc.alk - vp-v1_4_5 - parent - jar - true - - - mc.alk - vp-v1_4_6 - parent - jar - true - - - mc.alk - vp-v1_4_R1 - parent - jar - true - - - mc.alk - vp-v1_5_R1 - parent - jar - true - - - mc.alk - vp-v1_5_R2 - parent - jar - true - - - mc.alk - vp-v1_5_R3 - parent - jar - true - - - mc.alk - vp-v1_6_R1 - parent - jar - true - - - mc.alk - vp-v1_6_R2 - parent - jar - true - - - mc.alk - vp-v1_6_R3 - parent - jar - true - - - mc.alk - vp-v1_7_R1 - parent - jar - true - - - mc.alk - vp-v1_7_R2 - parent - jar - true - - - mc.alk - vp-v1_7_R3 - parent - jar - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers - ../../target - ./src/main/java - - - . - true - ./src/main/java - - *.yml - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - false - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - mc/alk/virtualplayers/nms/** - mc/alk/virtualplayers/api/** - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8.1 - - *.metrics - - - - org.apache.maven.plugins - maven-shade-plugin - 1.4 - - - package - - shade - - - - - mc.alk:vp-* - - - - - - - - maven-antrun-plugin - - - - - - - - package - - run - - - - - - - diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java deleted file mode 100644 index e556c2f..0000000 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ /dev/null @@ -1,89 +0,0 @@ -package mc.alk.virtualplayers; - -import java.util.logging.Level; -import java.util.logging.Logger; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandExecutor; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPlugin; - - -public class VirtualPlayers extends JavaPlugin implements Listener -{ - - @Override - public void onEnable() - { - // Bukkit.getPluginManager().registerEvents(this, this); - // getCommand("vdc").setExecutor(new PlayerExecutor(this)); - // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); - registerCommands(); - registerListeners(); - } - - @Override - public void onDisable() - { - // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.deleteVirtualPlayers(); - try { - getNmsClass("VirtualPlayer").getDeclaredMethod("deleteVirtualPlayers", new Class[]{}).invoke(null); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } - } - - public void setPlayerMessages(boolean show){ - // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.setGlobalMessages(show); - try { - getNmsClass("VirtualPlayer").getDeclaredMethod("setGlobalMessages", boolean.class).invoke(null, show); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } - } - - public void setEventMessages(boolean show){ - // mc.alk.virtualplayers.nms.{version}.VPBaseExecutor.setShowEventMessages(show); - try { - getNmsClass("VPBaseExecutor").getDeclaredMethod("setShowEventMessages", boolean.class).invoke(null, show); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } - } - - public static Class getNmsClass(String clazz) throws Exception { - String mcVersion; - try { - mcVersion = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; - } catch (ArrayIndexOutOfBoundsException ex) { - mcVersion = "vpre"; - } - return Class.forName("mc.alk.virtualplayers.nms." + mcVersion + "." + clazz); - } - - private void registerListeners() { - // mc.alk.virtualplayers.nms.{version}.PlayerListener - try { - getServer().getPluginManager().registerEvents( - (Listener) getNmsClass("PlayerListener").getConstructor().newInstance(), this); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } - } - - private void registerCommands() { - // getCommand("vdc").setExecutor(new PlayerExecutor(this)); - // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); - try { - getCommand("vdc").setExecutor( - (CommandExecutor) getNmsClass("PlayerExecutor") - .getConstructor(new Class[]{Plugin.class}).newInstance(this)); - getCommand("virtualplayers").setExecutor( - (CommandExecutor) getNmsClass("VPExecutor") - .getConstructor(new Class[]{Plugin.class}).newInstance(this)); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } - } - -} diff --git a/modules/VirtualPlayers/src/main/java/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml deleted file mode 100644 index 0464d77..0000000 --- a/modules/VirtualPlayers/src/main/java/plugin.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: ${project.name} -version: ${project.version} -authors: [Alkarin] -description: Create Virtualplayers for debugging or running commands otherwise unavailable from the console -main: mc.alk.virtualplayers.VirtualPlayers -commands: - virtualplayers: - aliases: [vp,virtualplayer] - ap: - description: add virtual player - usage: /ap [arguments] - vdc: - aliases: [dc] - description: do command as a virtual player - usage: /dc [arguments] - - - diff --git a/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java b/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java deleted file mode 100644 index a46ef6d..0000000 --- a/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/util/pom.xml b/modules/util/pom.xml deleted file mode 100644 index 727b6db..0000000 --- a/modules/util/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-util - parent - jar - - virtualplayers-util - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.7.2-R0.3 - provided - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-Util - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java deleted file mode 100644 index f58202c..0000000 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java +++ /dev/null @@ -1,778 +0,0 @@ -package mc.alk.virtualplayers.Util; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; - -public class InventoryUtil -{ - static final String version = "InventoryUtil 2.1.4"; - static final boolean DEBUG = false; - - public static class Armor - { - public ArmorLevel level; - public ArmorType type; - - Armor(ArmorType at, ArmorLevel al) - { - this.level = al; - this.type = at; - } - } - - public static class EnchantmentWithLevel - { - public EnchantmentWithLevel() - { - } - - public EnchantmentWithLevel(boolean all) - { - this.all = all; - } - - public Enchantment e; - public Integer lvl; - boolean all = false; - - @Override - public String toString() - { - return (e != null ? e.getName() : "null") + ":" + lvl; - } - } - - public enum ArmorLevel - { - WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND - }; - - public enum ArmorType - { - HELM, CHEST, LEGGINGS, BOOTS - }; - - public static Enchantment getEnchantmentByCommonName(String iname) - { - iname = iname.toLowerCase(); - if (iname.contains("smite")) - return Enchantment.getByName("DAMAGE_UNDEAD"); - if (iname.contains("sharp")) - return Enchantment.getByName("DAMAGE_ALL"); - if (iname.contains("fire") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_FIRE"); - if (iname.contains("fire")) - return Enchantment.getByName("FIRE_ASPECT"); - if (iname.contains("exp") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - if (iname.contains("blast") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - if (iname.contains("arrow") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_PROJECTILE"); - if (iname.contains("proj") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_PROJECTILE"); - if (iname.contains("respiration")) - return Enchantment.getByName("OXYGEN"); - if (iname.contains("fall")) - return Enchantment.getByName("PROTECTION_FALL"); - if (iname.contains("prot")) - return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); - if (iname.contains("respiration")) - return Enchantment.getByName("OXYGEN"); - if (iname.contains("oxygen")) return Enchantment.getByName("OXYGEN"); - if (iname.contains("aqua")) - return Enchantment.getByName("WATER_WORKER"); - if (iname.contains("arth")) - return Enchantment.getByName("DAMAGE_ARTHROPODS"); - if (iname.contains("knockback")) - return Enchantment.getByName("KNOCKBACK"); - if (iname.contains("loot")) - return Enchantment.getByName("LOOT_BONUS_MOBS"); - if (iname.contains("dig")) return Enchantment.getByName("DIG_SPEED"); - if (iname.contains("silk")) return Enchantment.getByName("SILK_TOUCH"); - if (iname.contains("unbreaking")) - return Enchantment.getByName("DURABILITY"); - if (iname.contains("dura")) return Enchantment.getByName("DURABILITY"); - return null; - } - - static final HashMap armor; - static - { - armor = new HashMap(); - armor.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); - armor.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.IRON)); - armor.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.IRON)); - armor.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.IRON)); - armor.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.IRON)); - armor.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.CHAINMAIL)); - } - - public static int arrowCount(Player p) - { - return getItemAmount(p.getInventory().getContents(), new ItemStack( - Material.ARROW, 1)); - } - - public static int getItemAmountFromInventory(Inventory inv, ItemStack is) - { - return getItemAmount(inv.getContents(), is); - } - - public static boolean hasArmor(Player p) - { - PlayerInventory pi = p.getInventory(); - return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi - .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); - } - - public static ArmorLevel hasArmorSet(List inv) - { - ArmorLevel armorSet[] = new ArmorLevel[4]; - for (ItemStack is : inv) - { - Armor a = armor.get(is.getType()); - if (a == null) continue; - switch (a.type) - { - case BOOTS: - armorSet[0] = a.level; - break; - case LEGGINGS: - armorSet[1] = a.level; - break; - case CHEST: - armorSet[2] = a.level; - break; - case HELM: - armorSet[3] = a.level; - break; - } - } - ArmorLevel lvl = null; - for (ArmorLevel a : armorSet) - { - if (lvl == null) - lvl = a; - else if (lvl != a) return null; - } - return lvl; - } - - // - // private static Material getMaterial(ArmorLevel level) { - // switch(level){ - // case WOOL: return Material.WOOL; - // case LEATHER : return Material.LEATHER; - // case IRON: return Material.IRON_BOOTS; - // case GOLD : return Material.GOLD_BOOTS; - // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; - // case DIAMOND: return Material.DIAMOND; - // default : return null; - // } - // } - - public static int getItemAmount(ItemStack[] items, ItemStack is) - { - int count = 0; - for (ItemStack item : items) - { - if (item == null) - { - continue; - } - if (item.getType() == is.getType() - && ((item.getDurability() == is.getDurability() || item - .getDurability() == -1))) - { - count += item.getAmount(); - } - } - return count; - } - - public static ItemStack getItemStack(String name) - { - if (name == null || name.isEmpty()) return null; - name = name.replace(" ", "_"); - name = name.replace(":", ";"); - - int dataIndex = name.indexOf(';'); - dataIndex = (dataIndex != -1 ? dataIndex : -1); - int dataValue = 0; - if (dataIndex != -1) - { - dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer - .parseInt(name.substring(dataIndex + 1)) : 0); - name = name.substring(0, dataIndex); - } - - dataValue = dataValue < 0 ? 0 : dataValue; - Material mat = getMat(name); - - if (mat != null && mat != Material.AIR) - { - return new ItemStack(mat, 0, (short) dataValue); - } - return null; - } - - public static boolean isInt(String i) - { - try - { - Integer.parseInt(i); - return true; - } catch (Exception e) - { - return false; - } - } - - public static boolean isFloat(String i) - { - try - { - Float.parseFloat(i); - return true; - } catch (Exception e) - { - return false; - } - } - - // / Get the Material - public static Material getMat(String name) - { - Integer id = null; - try - { - id = Integer.parseInt(name); - } catch (Exception e) - { - } - if (id == null) - { - id = getMaterialID(name); - } - return id != null && id >= 0 ? Material.getMaterial(id) : null; - } - - // / This allows for abbreviations to work, useful for sign etc - public static int getMaterialID(String name) - { - name = name.toUpperCase(); - // / First try just getting it from the Material Name - Material mat = Material.getMaterial(name); - if (mat != null) return mat.getId(); - // / Might be an abbreviation, or a more complicated - int temp = Integer.MAX_VALUE; - mat = null; - name = name.replaceAll("\\s+", "").replaceAll("_", ""); - for (Material m : Material.values()) - { - if (m.name().replaceAll("_", "").startsWith(name)) - { - if (m.name().length() < temp) - { - mat = m; - temp = m.name().length(); - } - } - } - return mat != null ? mat.getId() : -1; - } - - public static boolean hasItem(Player p, ItemStack itemType) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() == itemType.getType()) - { - return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() == itemType.getType()) - { - return true; - } - } - return false; - } - - public static boolean hasAnyItem(Player p) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() != Material.AIR) - { - // System.out.println("item=" + is); - return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() != Material.AIR) - { - // System.out.println("item=" + is); - return true; - } - } - - return false; - } - - public static void addItemToInventory(Player player, ItemStack itemStack) - { - addItemToInventory(player, itemStack, itemStack.getAmount(), true, - false); - } - - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount) - { - addItemToInventory(player, itemStack, stockAmount, true, false); - } - - @SuppressWarnings("deprecation") - public static void addItemsToInventory(Player p, List items, - boolean ignoreHelmet) - { - for (ItemStack is : items) - InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), - false, false); - try - { - p.updateInventory(); - } catch (Exception e) - { - } - } - - @SuppressWarnings("deprecation") - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount, boolean update, boolean ignoreHelmet) - { - PlayerInventory inv = player.getInventory(); - Material itemType = itemStack.getType(); - if (armor.containsKey(itemType)) - { - // / no item: add to armor slot - // / item better: add old to inventory, new to armor slot - // / item notbetter: add to inventory - ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); - boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); - boolean better = empty ? false : armorSlotBetter( - armor.get(oldArmor.getType()), armor.get(itemType)); - final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; - if (empty || better) - { - switch (armor.get(itemType).type) - { - case HELM: - inv.setHelmet(itemStack); - break; - case CHEST: - inv.setChestplate(itemStack); - break; - case LEGGINGS: - inv.setLeggings(itemStack); - break; - case BOOTS: - inv.setBoots(itemStack); - break; - } - } - if (!empty) - { - if (better && (!isHelmet && ignoreHelmet)) - { - addItemToInventory(inv, oldArmor, oldArmor.getAmount()); - } - else - { - addItemToInventory(inv, itemStack, stockAmount); - } - } - } - else - { - addItemToInventory(inv, itemStack, stockAmount); - } - if (update) try - { - player.updateInventory(); - } catch (Exception e) - { - } - } - - private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) - { - if (oldArmor == null || newArmor == null) // / technically we could - // throw an exception.. but - // nah - return false; - return oldArmor.level.ordinal() < newArmor.level.ordinal(); - } - - private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) - { - switch (armor.type) - { - case HELM: - return inv.getHelmet(); - case CHEST: - return inv.getChestplate(); - case LEGGINGS: - return inv.getLeggings(); - case BOOTS: - return inv.getBoots(); - } - return null; - } - - // /Adds item to inventory - public static void addItemToInventory(Inventory inv, ItemStack is, int left) - { - int maxStackSize = is.getType().getMaxStackSize(); - if (left <= maxStackSize) - { - is.setAmount(left); - inv.addItem(is); - return; - } - - if (maxStackSize != 64) - { - ArrayList items = new ArrayList(); - for (int i = 0; i < Math.ceil(left / maxStackSize); i++) - { - if (left < maxStackSize) - { - is.setAmount(left); - items.add(is); - return; - } - else - { - is.setAmount(maxStackSize); - items.add(is); - } - } - Object[] iArray = items.toArray(); - for (Object o : iArray) - { - inv.addItem((ItemStack) o); - } - } - else - { - inv.addItem(is); - } - } - - public static void closeInventory(Player p) - { - - try - { - p.closeInventory(); - } catch (Exception closeInventoryError) - { - // / This almost always throws an NPE, but does its job so ignore - } - } - - public static void clearInventory(Player p) - { - try - { - PlayerInventory inv = p.getInventory(); - closeInventory(p); - - if (inv != null) - { - inv.clear(); - inv.setArmorContents(null); - inv.setItemInHand(null); - } - } catch (Exception ee) - { - ee.printStackTrace(); - } - } - - public static Object getCommonName(ItemStack is) - { - int id = is.getTypeId(); - int datavalue = is.getDurability(); - if (datavalue > 0) - { - return Material.getMaterial(id).toString() + ":" + datavalue; - } - return Material.getMaterial(id).toString(); - } - - public static boolean isItem(String str) - { - // System.out.println("string = " + str); - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - if (DEBUG) System.out.println("item=" + str); - ItemStack is = null; - try - { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - is.setAmount(Integer.valueOf(split[split.length - 1])); - for (int i = 1; i < split.length - 1; i++) - { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try - { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) - { - return false; - } - } - } catch (Exception e) - { - return false; - } - return true; - } - - public static ItemStack parseItem(String str) throws Exception - { - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - if (DEBUG) System.out.println("item=" + str); - ItemStack is = null; - try - { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - // System.out.println(" split = " + split); - final int amt = split.length > 1 ? Integer - .valueOf(split[split.length - 1]) : 1; - is.setAmount(amt); - for (int i = 1; i < split.length - 1; i++) - { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try - { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) - { - Logger.getLogger("minecraft").warning( - ewl + " can not be applied to the item " + str); - } - } - } catch (Exception e) - { - e.printStackTrace(); - Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); - throw new Exception("parse item was bad"); - } - return is; - } - - public static EnchantmentWithLevel getEnchantment(String str) - { - if (str.equalsIgnoreCase("all")) - { - return new EnchantmentWithLevel(true); - } - Enchantment e = null; - str = str.replaceAll(",", ":"); - int index = str.indexOf(':'); - index = (index != -1 ? index : -1); - int lvl = -1; - if (index != -1) - { - try - { - lvl = Integer.parseInt(str.substring(index + 1)); - } catch (Exception err) - { - } - str = str.substring(0, index); - } - - // System.out.println("String = <" + str +"> " + lvl); - try - { - e = Enchantment.getById(Integer.valueOf(str)); - } catch (Exception err) - { - } - if (e == null) e = Enchantment.getByName(str); - if (e == null) e = getEnchantmentByCommonName(str); - if (e == null) return null; - EnchantmentWithLevel ewl = new EnchantmentWithLevel(); - ewl.e = e; - if (lvl < e.getStartLevel()) - { - lvl = e.getStartLevel(); - } - if (lvl > e.getMaxLevel()) - { - lvl = e.getMaxLevel(); - } - ewl.lvl = lvl; - return ewl; - } - - public boolean addEnchantments(ItemStack is, String[] args) - { - Map encs = new HashMap(); - for (String s : args) - { - EnchantmentWithLevel ewl = getEnchantment(s); - if (ewl != null) - { - if (ewl.all) - { - return addAllEnchantments(is); - } - encs.put(ewl.e, ewl.lvl); - } - } - addEnchantments(is, encs); - return true; - } - - public void addEnchantments(ItemStack is, - Map enchantments) - { - for (Enchantment e : enchantments.keySet()) - { - if (e.canEnchantItem(is)) - { - is.addUnsafeEnchantment(e, enchantments.get(e)); - } - } - } - - public boolean addAllEnchantments(ItemStack is) - { - for (Enchantment enc : Enchantment.values()) - { - if (enc.canEnchantItem(is)) - { - is.addUnsafeEnchantment(enc, enc.getMaxLevel()); - } - } - return true; - } - - /** - * For Serializing an item or printing - * - * @param is - * @return - */ - public static String getItemString(ItemStack is) - { - if (is == null) return null; - StringBuilder sb = new StringBuilder(); - sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); - Map encs = is.getEnchantments(); - for (Enchantment enc : encs.keySet()) - { - sb.append(enc.getName() + ":" + encs.get(enc) + " "); - } - sb.append(is.getAmount()); - return sb.toString(); - } - - public static boolean hasEnchantedItem(Player p) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() != Material.AIR) - { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() != Material.AIR) - { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) return true; - } - } - return false; - } - - public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) - { - Armor a = armor.get(is.getType()); - if (a == null) return false; - return a.level == lvl; - } - - public static ItemStack getWool(int color) - { - return new ItemStack(Material.WOOL, 1, (short) color); - } -} diff --git a/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java b/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java deleted file mode 100644 index 06f0fef..0000000 --- a/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.util; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - * - public static Test suite() - { - return new TestSuite( InventoryUtil.class ); - } */ - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml deleted file mode 100644 index f1cb470..0000000 --- a/modules/v1_4_5/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_4_5 - parent - jar - - virtualplayers-v1_4_5 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - craftbukkit - 1.4.5-R1.0 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_4_5 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java deleted file mode 100644 index 956bebb..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java deleted file mode 100644 index 1a176e8..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_4_5.DamageSource; -import net.minecraft.server.v1_4_5.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_4_5.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java deleted file mode 100644 index d6b8746..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java deleted file mode 100644 index 856fba0..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java deleted file mode 100644 index 488d838..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java deleted file mode 100644 index 10a671f..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java deleted file mode 100644 index a41f22a..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java +++ /dev/null @@ -1,357 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_4_5.EntityPlayer; -import net.minecraft.server.v1_4_5.ItemInWorldManager; -import net.minecraft.server.v1_4_5.MinecraftServer; -import net.minecraft.server.v1_4_5.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_4_5.CraftServer; -import org.bukkit.craftbukkit.v1_4_5.CraftWorld; -import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, ItemInWorldManager iiw) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, iiw)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - ItemInWorldManager iiw = new ItemInWorldManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml deleted file mode 100644 index a85e114..0000000 --- a/modules/v1_4_6/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_4_6 - parent - jar - - virtualplayers-v1_4_6 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - craftbukkit - 1.4.6-R0.3 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_4_6 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java deleted file mode 100644 index b8f406e..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java deleted file mode 100644 index 369b549..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_4_6.DamageSource; -import net.minecraft.server.v1_4_6.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_4_6.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java deleted file mode 100644 index 97e37de..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java deleted file mode 100644 index 5b9509e..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java deleted file mode 100644 index 910e559..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java deleted file mode 100644 index 82206ae..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java deleted file mode 100644 index bc46c99..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java +++ /dev/null @@ -1,357 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_4_6.EntityPlayer; -import net.minecraft.server.v1_4_6.MinecraftServer; -import net.minecraft.server.v1_4_6.PlayerInteractManager; -import net.minecraft.server.v1_4_6.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_4_6.CraftServer; -import org.bukkit.craftbukkit.v1_4_6.CraftWorld; -import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml deleted file mode 100644 index 83d7975..0000000 --- a/modules/v1_4_R1/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_4_R1 - parent - jar - - virtualplayers-v1_4_R1 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - craftbukkit - 1.4.7-R1.0 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_4_R1 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java deleted file mode 100644 index 48999df..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java deleted file mode 100644 index 2328e8f..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_4_R1.DamageSource; -import net.minecraft.server.v1_4_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java deleted file mode 100644 index 7283146..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java deleted file mode 100644 index 2b7837b..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java deleted file mode 100644 index 9b9e3f1..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java deleted file mode 100644 index a134b82..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java deleted file mode 100644 index 02bf915..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java +++ /dev/null @@ -1,357 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_4_R1.EntityPlayer; -import net.minecraft.server.v1_4_R1.MinecraftServer; -import net.minecraft.server.v1_4_R1.PlayerInteractManager; -import net.minecraft.server.v1_4_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_4_R1.CraftServer; -import org.bukkit.craftbukkit.v1_4_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml deleted file mode 100644 index 59d8881..0000000 --- a/modules/v1_5_R1/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_5_R1 - parent - jar - - virtualplayers-v1_5_R1 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.5-R0.1-SNAPSHOT - provided - - - org.bukkit - craftbukkit - 1.5-R0.1-SNAPSHOT - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_5_R1 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java deleted file mode 100644 index dec575a..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java deleted file mode 100644 index 98a8d1b..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_5_R1.DamageSource; -import net.minecraft.server.v1_5_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java deleted file mode 100644 index 96c1403..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java deleted file mode 100644 index 3a57f82..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java deleted file mode 100644 index 7d4d263..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java deleted file mode 100644 index d786283..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java deleted file mode 100644 index 244f071..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java +++ /dev/null @@ -1,357 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_5_R1.EntityPlayer; -import net.minecraft.server.v1_5_R1.MinecraftServer; -import net.minecraft.server.v1_5_R1.PlayerInteractManager; -import net.minecraft.server.v1_5_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_5_R1.CraftServer; -import org.bukkit.craftbukkit.v1_5_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_5_R2/pom.xml b/modules/v1_5_R2/pom.xml deleted file mode 100644 index dc19298..0000000 --- a/modules/v1_5_R2/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_5_R2 - parent - jar - - virtualplayers-v1_5_R2 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.5.1-R0.2 - provided - - - org.bukkit - craftbukkit - 1.5.1-R0.2 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_5_R2 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java deleted file mode 100644 index d977b9e..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java deleted file mode 100644 index 708a5b0..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_5_R2.DamageSource; -import net.minecraft.server.v1_5_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java deleted file mode 100644 index d485405..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java deleted file mode 100644 index c31484c..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java deleted file mode 100644 index 1da776b..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java deleted file mode 100644 index 6f92eca..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java deleted file mode 100644 index 29296c9..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java +++ /dev/null @@ -1,385 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_5_R2.EntityPlayer; -import net.minecraft.server.v1_5_R2.MinecraftServer; -import net.minecraft.server.v1_5_R2.PlayerInteractManager; -import net.minecraft.server.v1_5_R2.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_5_R2.CraftServer; -import org.bukkit.craftbukkit.v1_5_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R2.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_5_R3/pom.xml b/modules/v1_5_R3/pom.xml deleted file mode 100644 index 7e8f7f4..0000000 --- a/modules/v1_5_R3/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_5_R3 - parent - jar - - virtualplayers-v1_5_R3 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.5.2-R1.0 - provided - - - org.bukkit - craftbukkit - 1.5.2-R1.0 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_5_R3 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java deleted file mode 100644 index d355e84..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java deleted file mode 100644 index 01f9aa1..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_5_R3.DamageSource; -import net.minecraft.server.v1_5_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java deleted file mode 100644 index 030de7c..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java deleted file mode 100644 index 6c07170..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java deleted file mode 100644 index f8a6a34..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java deleted file mode 100644 index 08f34f5..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java deleted file mode 100644 index 427c7df..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java +++ /dev/null @@ -1,385 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_5_R3.EntityPlayer; -import net.minecraft.server.v1_5_R3.MinecraftServer; -import net.minecraft.server.v1_5_R3.PlayerInteractManager; -import net.minecraft.server.v1_5_R3.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_5_R3.CraftServer; -import org.bukkit.craftbukkit.v1_5_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R3.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml deleted file mode 100644 index 806fd6f..0000000 --- a/modules/v1_6_R1/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_6_R1 - parent - jar - - virtualplayers-v1_6_R1 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.6.1-R0.1-SNAPSHOT - provided - - - org.bukkit - craftbukkit - 1.6.1-R0.1-SNAPSHOT - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_6_R1 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java deleted file mode 100644 index 241d07e..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java deleted file mode 100644 index bc6b447..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_6_R1.DamageSource; -import net.minecraft.server.v1_6_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java deleted file mode 100644 index 09feb10..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java deleted file mode 100644 index 221b4d1..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java deleted file mode 100644 index 2b0c612..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java deleted file mode 100644 index 12830da..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java deleted file mode 100644 index 4facf49..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java +++ /dev/null @@ -1,385 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_6_R1.EntityPlayer; -import net.minecraft.server.v1_6_R1.MinecraftServer; -import net.minecraft.server.v1_6_R1.PlayerInteractManager; -import net.minecraft.server.v1_6_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_6_R1.CraftServer; -import org.bukkit.craftbukkit.v1_6_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R1.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20D; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_6_R2/pom.xml b/modules/v1_6_R2/pom.xml deleted file mode 100644 index 44156ce..0000000 --- a/modules/v1_6_R2/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_6_R2 - parent - jar - - virtualplayers-v1_6_R2 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.6.2-R1.0 - provided - - - org.bukkit - craftbukkit - 1.6.2-R1.0 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_6_R2 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java deleted file mode 100644 index ef1b1fa..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java deleted file mode 100644 index cb00192..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_6_R2.DamageSource; -import net.minecraft.server.v1_6_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java deleted file mode 100644 index 0f5f314..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java deleted file mode 100644 index 8db50d8..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java deleted file mode 100644 index b58f96d..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java deleted file mode 100644 index 74ee57c..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java deleted file mode 100644 index 4410038..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java +++ /dev/null @@ -1,385 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_6_R2.EntityPlayer; -import net.minecraft.server.v1_6_R2.MinecraftServer; -import net.minecraft.server.v1_6_R2.PlayerInteractManager; -import net.minecraft.server.v1_6_R2.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_6_R2.CraftServer; -import org.bukkit.craftbukkit.v1_6_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R2.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20D; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_6_R3/pom.xml b/modules/v1_6_R3/pom.xml deleted file mode 100644 index 2982e05..0000000 --- a/modules/v1_6_R3/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_6_R3 - parent - jar - - virtualplayers-v1_6_R3 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.6.4-R2.0 - provided - - - org.bukkit - craftbukkit - 1.6.4-R2.0 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_6_R3 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java deleted file mode 100644 index 1534152..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java deleted file mode 100644 index 7ca264b..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_6_R3.DamageSource; -import net.minecraft.server.v1_6_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java deleted file mode 100644 index a59561d..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java deleted file mode 100644 index 41e492b..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java deleted file mode 100644 index e6aef4a..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java deleted file mode 100644 index 95d4c29..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java deleted file mode 100644 index 31cbe18..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java +++ /dev/null @@ -1,385 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_6_R3.EntityPlayer; -import net.minecraft.server.v1_6_R3.MinecraftServer; -import net.minecraft.server.v1_6_R3.PlayerInteractManager; -import net.minecraft.server.v1_6_R3.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_6_R3.CraftServer; -import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R3.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_7_R1/pom.xml b/modules/v1_7_R1/pom.xml deleted file mode 100644 index 2545f2c..0000000 --- a/modules/v1_7_R1/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_7_R1 - parent - jar - - virtualplayers-v1_7_R1 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.7.2-R0.3 - provided - - - org.bukkit - craftbukkit - 1.7.2-R0.3 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_7_R1 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java deleted file mode 100644 index 1ad6dae..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,761 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; -import mc.alk.virtualplayers.nms.v1_7_R1.VirtualPlayer; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java deleted file mode 100644 index dc941a9..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_7_R1.DamageSource; -import net.minecraft.server.v1_7_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java deleted file mode 100644 index ddf255b..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java deleted file mode 100644 index 7b1bc7d..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java deleted file mode 100644 index 6f49191..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java deleted file mode 100644 index 728c428..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java deleted file mode 100644 index d6eec73..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java +++ /dev/null @@ -1,386 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_7_R1.EntityPlayer; -import net.minecraft.server.v1_7_R1.MinecraftServer; -import net.minecraft.server.v1_7_R1.PlayerInteractManager; -import net.minecraft.server.v1_7_R1.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R1.CraftServer; -import org.bukkit.craftbukkit.v1_7_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R1.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, - GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml deleted file mode 100644 index d67c77f..0000000 --- a/modules/v1_7_R2/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_7_R2 - parent - jar - - virtualplayers-v1_7_R2 - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - bukkit - 1.7.5-R0.1-SNAPSHOT - provided - - - org.bukkit - craftbukkit - 1.7.5-R0.1-SNAPSHOT - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_7_R2 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java deleted file mode 100644 index 880b954..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,761 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; -import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java deleted file mode 100644 index 1455418..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_7_R2.DamageSource; -import net.minecraft.server.v1_7_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java deleted file mode 100644 index 99417d1..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java deleted file mode 100644 index 8a7f897..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java +++ /dev/null @@ -1,59 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java deleted file mode 100644 index de964cd..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java deleted file mode 100644 index 8232635..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java deleted file mode 100644 index 57a6fa2..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java +++ /dev/null @@ -1,392 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_7_R2.EntityPlayer; -import net.minecraft.server.v1_7_R2.MinecraftServer; -import net.minecraft.server.v1_7_R2.PlayerInteractManager; -import net.minecraft.server.v1_7_R2.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R2.CraftServer; -import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R2.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, - GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_7_R3/pom.xml b/modules/v1_7_R3/pom.xml deleted file mode 100644 index 1d00cb8..0000000 --- a/modules/v1_7_R3/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-v1_7_R3 - parent - jar - - virtualplayers-v1_7_R3 - http://maven.apache.org - - - UTF-8 - - - - - mc.alk - vp-util - parent - true - - - org.bukkit - bukkit - 1.7.5-R0.1-SNAPSHOT - provided - - - org.bukkit - craftbukkit - 1.7.9-R0.1 - provided - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-v1_7_R3 - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java deleted file mode 100644 index 03ba980..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java deleted file mode 100644 index b347d7c..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java +++ /dev/null @@ -1,434 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.v1_7_R3.DamageSource; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin p) { - super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"),1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java deleted file mode 100644 index 2d4bdc2..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java deleted file mode 100644 index ea4d748..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java deleted file mode 100644 index 57dd9a0..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java deleted file mode 100644 index 3b0b617..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.command.CommandSender; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java deleted file mode 100644 index 66eedf8..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java +++ /dev/null @@ -1,396 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import net.minecraft.server.v1_7_R3.MinecraftServer; -import net.minecraft.server.v1_7_R3.PlayerInteractManager; -import net.minecraft.server.v1_7_R3.WorldServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; -import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Scoreboard; - -public class VirtualPlayer extends CraftPlayer implements Listener { - - Player keepInformed; // / who to send the messages to - boolean online = true; - double health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - CraftScoreboard scoreboard; - - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, - GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public double getHealth() { - return health; - } - - @Override - public void setHealth(double h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth((float) h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - @Override - public void setScoreboard(Scoreboard scoreboard) { - Object s = null; - this.scoreboard = (CraftScoreboard) scoreboard; - if (scoreboard != null) { - if (Bukkit.getScoreboardManager().getMainScoreboard() != null - && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { - s = "BukkitMainScoreboard"; - } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { - s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); - } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { - s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); - } - } - if (enableMessages) { - Util.sendMessage(this, getName() + " setting scoreboard " + s); - } - } - - @Override - public CraftScoreboard getScoreboard() { - return this.scoreboard; - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } - - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } -} diff --git a/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java b/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java deleted file mode 100644 index aad11e8..0000000 --- a/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R3; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml deleted file mode 100644 index 05d1fc6..0000000 --- a/modules/vpre/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-vpre - parent - jar - - virtualplayers-vPre - http://maven.apache.org - - - UTF-8 - - - - - org.bukkit - craftbukkit - 1.3.2-R3.0 - provided - - - mc.alk - vp-util - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-vPre - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java deleted file mode 100644 index df6d049..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java +++ /dev/null @@ -1,760 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } - return null; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java deleted file mode 100644 index 1271c74..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import mc.alk.virtualplayers.Util.InventoryUtil; -import net.minecraft.server.DamageSource; -import net.minecraft.server.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java deleted file mode 100644 index 17b6abe..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java deleted file mode 100644 index e07b026..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java deleted file mode 100644 index 0873de4..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java deleted file mode 100644 index bf0c64f..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java deleted file mode 100644 index ae259f5..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java +++ /dev/null @@ -1,354 +0,0 @@ -package mc.alk.virtualplayers.nms.vpre; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.ItemInWorldManager; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldServer; -import org.apache.commons.lang.ArrayUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffectType; - -public class VirtualPlayer extends CraftPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - static boolean enableMessages = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, ItemInWorldManager iiw) { - /// mcserver, worldserver, string, PlayerInteractManager - super(cserver, new EntityPlayer(mcserver, world, s, iiw)); - this.loc = this.getLocation(); - } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages && enableMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - public void setOnline(boolean b) { - if (enableMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - public void setLocation(Location l) { - loc = l; - } - - public Player getInformed() { - return keepInformed; - } - - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was factored out of VirtualPlayers JavaPlugin class. - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - ItemInWorldManager iiw = new ItemInWorldManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } - } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } -} diff --git a/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 7498ae5..0000000 --- a/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - 4.0.0 - mc.alk - vp-parent - parent - pom - VirtualPlayers Parent POM - http://github.com/alkarinv/VirtualPlayers - - MMdd - UTF-8 - - - modules/util - modules/vpre - modules/v1_4_5 - modules/v1_4_6 - modules/v1_4_R1 - modules/v1_5_R1 - modules/v1_5_R2 - modules/v1_5_R3 - modules/v1_6_R1 - modules/v1_6_R2 - modules/v1_6_R3 - modules/v1_7_R1 - modules/v1_7_R2 - modules/v1_7_R3 - modules/VirtualPlayers - - - - battleplugins-repo - http://server.battleplugins.com/maven/repository/ - - - bukkit-repo - http://repo.bukkit.org/content/groups/public - - - md_5-snapshots - http://repo.md-5.net/content/repositories/snapshots/ - - - sk89q-repo - http://maven.sk89q.com/repo/ - - - vault-repo - http://nexus.theyeticave.net/content/repositories/pub_releases - - - kitteh-repo - http://repo.kitteh.org/content/repositories/public/ - - - - - junit - junit - 3.8.1 - test - - - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - true - - - - - From d9b067d811ceabe4cf099f8697c45d6bafe8465d Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 5 Jul 2014 22:25:32 -0500 Subject: [PATCH 07/74] Added backwards compatibility. Tested against craftbukkit 1.2.5 to 1.7.9 All v1_X_RY imports and the corresponding code was moved out of the VirtualPlayers JavaPlugin class. Most methods were moved into mc.alk.virtualplayers.nms.v1_X_RY.VirtualPlayer.java The listener methods were moved into mc.alk.virtualplayers.nms.v1_X_RY.PlayerListener.java API methods implemented and tested: setEventMessages(boolean enable); setPlayerMessages(boolean show); onDisable() functionality: mc.alk.virtualplayers.nms.{version}.VirtualPlayer.deleteVirtualPlayers(); Finally, some classes still need to be refactored out of the nms packages and converted into version independent classes. --- README.md | 113 +++ modules/VirtualPlayers/pom.xml | 215 +++++ .../mc/alk/virtualplayers/VirtualPlayers.java | 89 ++ .../VirtualPlayers/src/main/java/plugin.yml | 18 + .../java/mc/alk/virtualplayers/AppTest.java | 38 + modules/util/pom.xml | 52 ++ .../virtualplayers/util/InventoryUtil.java | 778 ++++++++++++++++++ .../mc/alk/virtualplayers/util/AppTest.java | 38 + modules/v1_4_5/pom.xml | 58 ++ .../nms/v1_4_5/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_4_5/PlayerExecutor.java | 403 +++++++++ .../nms/v1_4_5/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_4_5/Util.java | 58 ++ .../nms/v1_4_5/VPBaseExecutor.java | 115 +++ .../virtualplayers/nms/v1_4_5/VPExecutor.java | 74 ++ .../nms/v1_4_5/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_4_6/pom.xml | 58 ++ .../nms/v1_4_6/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_4_6/PlayerExecutor.java | 403 +++++++++ .../nms/v1_4_6/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_4_6/Util.java | 58 ++ .../nms/v1_4_6/VPBaseExecutor.java | 115 +++ .../virtualplayers/nms/v1_4_6/VPExecutor.java | 74 ++ .../nms/v1_4_6/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_4_R1/pom.xml | 58 ++ .../nms/v1_4_R1/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_4_R1/PlayerExecutor.java | 403 +++++++++ .../nms/v1_4_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_4_R1/Util.java | 58 ++ .../nms/v1_4_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_4_R1/VPExecutor.java | 74 ++ .../nms/v1_4_R1/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_5_R1/pom.xml | 64 ++ .../nms/v1_5_R1/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_5_R1/PlayerExecutor.java | 403 +++++++++ .../nms/v1_5_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_5_R1/Util.java | 58 ++ .../nms/v1_5_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_5_R1/VPExecutor.java | 74 ++ .../nms/v1_5_R1/VirtualPlayer.java | 357 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_5_R2/pom.xml | 64 ++ .../nms/v1_5_R2/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_5_R2/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_5_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_5_R2/Util.java | 58 ++ .../nms/v1_5_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_5_R2/VPExecutor.java | 74 ++ .../nms/v1_5_R2/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_5_R3/pom.xml | 64 ++ .../nms/v1_5_R3/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_5_R3/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_5_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_5_R3/Util.java | 58 ++ .../nms/v1_5_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_5_R3/VPExecutor.java | 74 ++ .../nms/v1_5_R3/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_6_R1/pom.xml | 64 ++ .../nms/v1_6_R1/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_6_R1/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_6_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_6_R1/Util.java | 58 ++ .../nms/v1_6_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_6_R1/VPExecutor.java | 74 ++ .../nms/v1_6_R1/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_6_R2/pom.xml | 64 ++ .../nms/v1_6_R2/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_6_R2/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_6_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_6_R2/Util.java | 58 ++ .../nms/v1_6_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_6_R2/VPExecutor.java | 74 ++ .../nms/v1_6_R2/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_6_R3/pom.xml | 64 ++ .../nms/v1_6_R3/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_6_R3/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_6_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_6_R3/Util.java | 58 ++ .../nms/v1_6_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_6_R3/VPExecutor.java | 74 ++ .../nms/v1_6_R3/VirtualPlayer.java | 385 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_7_R1/pom.xml | 64 ++ .../nms/v1_7_R1/CustomCommandExecutor.java | 761 +++++++++++++++++ .../nms/v1_7_R1/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_7_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R1/Util.java | 58 ++ .../nms/v1_7_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R1/VPExecutor.java | 74 ++ .../nms/v1_7_R1/VirtualPlayer.java | 386 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_7_R2/pom.xml | 64 ++ .../nms/v1_7_R2/CustomCommandExecutor.java | 761 +++++++++++++++++ .../nms/v1_7_R2/PlayerExecutor.java | 433 ++++++++++ .../nms/v1_7_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R2/Util.java | 59 ++ .../nms/v1_7_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R2/VPExecutor.java | 74 ++ .../nms/v1_7_R2/VirtualPlayer.java | 392 +++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + modules/v1_7_R3/pom.xml | 64 ++ .../nms/v1_7_R3/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/v1_7_R3/PlayerExecutor.java | 434 ++++++++++ .../nms/v1_7_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R3/Util.java | 58 ++ .../nms/v1_7_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R3/VPExecutor.java | 74 ++ .../nms/v1_7_R3/VirtualPlayer.java | 396 +++++++++ .../alk/virtualplayers/v1_7_R3/AppTest.java | 38 + modules/vpre/pom.xml | 58 ++ .../nms/vpre/CustomCommandExecutor.java | 760 +++++++++++++++++ .../nms/vpre/PlayerExecutor.java | 403 +++++++++ .../nms/vpre/PlayerListener.java | 55 ++ .../mc/alk/virtualplayers/nms/vpre/Util.java | 58 ++ .../nms/vpre/VPBaseExecutor.java | 115 +++ .../virtualplayers/nms/vpre/VPExecutor.java | 74 ++ .../nms/vpre/VirtualPlayer.java | 354 ++++++++ .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 + pom.xml | 77 ++ 126 files changed, 26890 insertions(+) create mode 100644 README.md create mode 100644 modules/VirtualPlayers/pom.xml create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java create mode 100644 modules/VirtualPlayers/src/main/java/plugin.yml create mode 100644 modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java create mode 100644 modules/util/pom.xml create mode 100644 modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java create mode 100644 modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java create mode 100644 modules/v1_4_5/pom.xml create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java create mode 100644 modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_4_6/pom.xml create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java create mode 100644 modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_4_R1/pom.xml create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java create mode 100644 modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_5_R1/pom.xml create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java create mode 100644 modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_5_R2/pom.xml create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java create mode 100644 modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_5_R3/pom.xml create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java create mode 100644 modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_6_R1/pom.xml create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java create mode 100644 modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_6_R2/pom.xml create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java create mode 100644 modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_6_R3/pom.xml create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java create mode 100644 modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_7_R1/pom.xml create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java create mode 100644 modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_7_R2/pom.xml create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java create mode 100644 modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 modules/v1_7_R3/pom.xml create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java create mode 100644 modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java create mode 100644 modules/vpre/pom.xml create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java create mode 100644 modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java create mode 100644 pom.xml diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c65c50 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +VirtualPlayers2 +====== +Bukkit plugin that creates virtual players: +Used for easy debugging of plugins through the console. + + +VirtualPlayers2 was made for developers who need to easily test +their plugins against multiple versions of craftbukkit. + + +Commands as Players +--- + +|command|description| +|:------|:----------| +|`dc ` | any command you would normally do as a player | +|`dc op` | op virtual player | +|`dc deop` | deop virtual player | +|`dc respawn` | respawn the virtual player | +|`dc connect` | virtual player connects to the server | +|`dc disconnect` | virtual player disconnects from the server | +|`dc reconnect` | virtual player reconnects to the server | +|`dc health ` | give the virtual player some health ( or kill them if 0 ) | +|`dc inv` | print out their inventory | +|`dc giveinv ` | give them an item | +|`dc tp ` | teleport them to the given location ( "world,3,3,3" ) | +|`dc chat my message` | have the virtual player talk in chat | +|`dc hit [damage]` | attack other players, defaults to 5 damage | +|`dc interact ` | do a PlayerInteractEvent on the specified block location | +|`/dc bpe ` | do a BlockPlaceEvent of the given material at the given location | +|`/dc bbe ` | do a BlockBreakEvent at the given location | + + +Other Commands +--- + +|command|description| +|:------|:----------| +|`/virtualplayers hideMessages` | hide messages from players | +|`/virtualplayers showMessages` | show messages from players | + + +Change Log +--- + +- **v1.5.9** + * Added backwards compatibility. + * You can now use one JAR for all craftbukkit versions. + * Tested against craftbukkit versions 1.2.5 to 1.7.9 +- **v1.5.6** + * `/dc help`: now shows help + * `/dc sneak ` : now sneaks and unsneaks +- **v1.4.3** + * Fixes for cross world moves +- **v1.4.1.1** + * Command is now vdc, with an alias for dc +- **v1.4** + * More API commands for making virtual players +- **v1.3.1** + * Fixes for bpe and bbe +- **v1.3** + * new command : `/dc bpe ` : do a BlockPlaceEvent of the given material at the given location + * new command : `/dc bbe ` : do a BlockBreakEvent at the given location +- **v1.2.5** + * new command : `/dc interact ` : interact with the location with a left or right click, with whatever item they have in hand. +- **v1.2.4** + * new command. givehelm. Set the virtual players helm + * Fix for creating virtual players in servers that don't have world +- **v1.2.3** + * new command: `/dc hit [damage]` <- attack other players + * new command: `/dc interact ` <- do a block click event +- **v1.2.0** + * Add ability for virtual players to fire AsyncPlayerChat events by the use of `/dc chat ` + + +Downloads: +--- + +**Official builds** + +You can find the official builds at dev.bukkit.org + +[http://dev.bukkit.org/bukkit-plugins/virtualplayers/] (http://dev.bukkit.org/bukkit-plugins/virtualplayers/ "Official builds") + + +**Development builds** + +```python +"Development builds of this project can be acquired at the provided continuous integration server." +"These builds have not been approved by the BukkitDev staff. Use them at your own risk." +``` + +[http://ci.battleplugins.com/job/VirtualPlayers/](http://ci.battleplugins.com/job/VirtualPlayers/ "dev builds") + +The dev builds are primarily for testing purposes. + + +Contact: +====== + +[Author: alkarin](https://github.com/alkarinv/VirtualPlayers "alkarin/VirtualPlayers") + +[alkarin on IRC](http://webchat.esper.net/?nick=&channels=battleplugins "battleplugins IRC") + +Conversion to a Maven multi-module project [by Europia79](http://dev.bukkit.org/profiles/Europia79 "Europia79 on dev.bukkit.org") + + +Javadocs +--- + +[http://ci.battleplugins.com/job/VirtualPlayers/javadoc/](http://ci.battleplugins.com/job/VirtualPlayers/javadoc/ "javadocs") + + diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml new file mode 100644 index 0000000..564ce45 --- /dev/null +++ b/modules/VirtualPlayers/pom.xml @@ -0,0 +1,215 @@ + + 4.0.0 + + mc.alk + VirtualPlayers + 1.5.9 + jar + + VirtualPlayers + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + mc.alk + vp-util + parent + true + + + mc.alk + vp-vpre + parent + jar + true + + + mc.alk + vp-v1_4_5 + parent + jar + true + + + mc.alk + vp-v1_4_6 + parent + jar + true + + + mc.alk + vp-v1_4_R1 + parent + jar + true + + + mc.alk + vp-v1_5_R1 + parent + jar + true + + + mc.alk + vp-v1_5_R2 + parent + jar + true + + + mc.alk + vp-v1_5_R3 + parent + jar + true + + + mc.alk + vp-v1_6_R1 + parent + jar + true + + + mc.alk + vp-v1_6_R2 + parent + jar + true + + + mc.alk + vp-v1_6_R3 + parent + jar + true + + + mc.alk + vp-v1_7_R1 + parent + jar + true + + + mc.alk + vp-v1_7_R2 + parent + jar + true + + + mc.alk + vp-v1_7_R3 + parent + jar + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers + ../../target + ./src/main/java + + + . + true + ./src/main/java + + *.yml + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + false + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + mc/alk/virtualplayers/nms/** + mc/alk/virtualplayers/api/** + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + *.metrics + + + + org.apache.maven.plugins + maven-shade-plugin + 1.4 + + + package + + shade + + + + + mc.alk:vp-* + + + + + + + + maven-antrun-plugin + + + + + + + + package + + run + + + + + + + diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java new file mode 100644 index 0000000..e556c2f --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -0,0 +1,89 @@ +package mc.alk.virtualplayers; + +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandExecutor; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + + +public class VirtualPlayers extends JavaPlugin implements Listener +{ + + @Override + public void onEnable() + { + // Bukkit.getPluginManager().registerEvents(this, this); + // getCommand("vdc").setExecutor(new PlayerExecutor(this)); + // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); + registerCommands(); + registerListeners(); + } + + @Override + public void onDisable() + { + // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.deleteVirtualPlayers(); + try { + getNmsClass("VirtualPlayer").getDeclaredMethod("deleteVirtualPlayers", new Class[]{}).invoke(null); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void setPlayerMessages(boolean show){ + // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.setGlobalMessages(show); + try { + getNmsClass("VirtualPlayer").getDeclaredMethod("setGlobalMessages", boolean.class).invoke(null, show); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void setEventMessages(boolean show){ + // mc.alk.virtualplayers.nms.{version}.VPBaseExecutor.setShowEventMessages(show); + try { + getNmsClass("VPBaseExecutor").getDeclaredMethod("setShowEventMessages", boolean.class).invoke(null, show); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public static Class getNmsClass(String clazz) throws Exception { + String mcVersion; + try { + mcVersion = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; + } catch (ArrayIndexOutOfBoundsException ex) { + mcVersion = "vpre"; + } + return Class.forName("mc.alk.virtualplayers.nms." + mcVersion + "." + clazz); + } + + private void registerListeners() { + // mc.alk.virtualplayers.nms.{version}.PlayerListener + try { + getServer().getPluginManager().registerEvents( + (Listener) getNmsClass("PlayerListener").getConstructor().newInstance(), this); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private void registerCommands() { + // getCommand("vdc").setExecutor(new PlayerExecutor(this)); + // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); + try { + getCommand("vdc").setExecutor( + (CommandExecutor) getNmsClass("PlayerExecutor") + .getConstructor(new Class[]{Plugin.class}).newInstance(this)); + getCommand("virtualplayers").setExecutor( + (CommandExecutor) getNmsClass("VPExecutor") + .getConstructor(new Class[]{Plugin.class}).newInstance(this)); + } catch (Exception ex) { + Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + +} diff --git a/modules/VirtualPlayers/src/main/java/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml new file mode 100644 index 0000000..0464d77 --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/plugin.yml @@ -0,0 +1,18 @@ +name: ${project.name} +version: ${project.version} +authors: [Alkarin] +description: Create Virtualplayers for debugging or running commands otherwise unavailable from the console +main: mc.alk.virtualplayers.VirtualPlayers +commands: + virtualplayers: + aliases: [vp,virtualplayer] + ap: + description: add virtual player + usage: /ap [arguments] + vdc: + aliases: [dc] + description: do command as a virtual player + usage: /dc [arguments] + + + diff --git a/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java b/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java new file mode 100644 index 0000000..a46ef6d --- /dev/null +++ b/modules/VirtualPlayers/src/test/java/mc/alk/virtualplayers/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/util/pom.xml b/modules/util/pom.xml new file mode 100644 index 0000000..727b6db --- /dev/null +++ b/modules/util/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-util + parent + jar + + virtualplayers-util + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-Util + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java new file mode 100644 index 0000000..f58202c --- /dev/null +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -0,0 +1,778 @@ +package mc.alk.virtualplayers.Util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class InventoryUtil +{ + static final String version = "InventoryUtil 2.1.4"; + static final boolean DEBUG = false; + + public static class Armor + { + public ArmorLevel level; + public ArmorType type; + + Armor(ArmorType at, ArmorLevel al) + { + this.level = al; + this.type = at; + } + } + + public static class EnchantmentWithLevel + { + public EnchantmentWithLevel() + { + } + + public EnchantmentWithLevel(boolean all) + { + this.all = all; + } + + public Enchantment e; + public Integer lvl; + boolean all = false; + + @Override + public String toString() + { + return (e != null ? e.getName() : "null") + ":" + lvl; + } + } + + public enum ArmorLevel + { + WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND + }; + + public enum ArmorType + { + HELM, CHEST, LEGGINGS, BOOTS + }; + + public static Enchantment getEnchantmentByCommonName(String iname) + { + iname = iname.toLowerCase(); + if (iname.contains("smite")) + return Enchantment.getByName("DAMAGE_UNDEAD"); + if (iname.contains("sharp")) + return Enchantment.getByName("DAMAGE_ALL"); + if (iname.contains("fire") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_FIRE"); + if (iname.contains("fire")) + return Enchantment.getByName("FIRE_ASPECT"); + if (iname.contains("exp") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + if (iname.contains("blast") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + if (iname.contains("arrow") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_PROJECTILE"); + if (iname.contains("proj") && iname.contains("prot")) + return Enchantment.getByName("PROTECTION_PROJECTILE"); + if (iname.contains("respiration")) + return Enchantment.getByName("OXYGEN"); + if (iname.contains("fall")) + return Enchantment.getByName("PROTECTION_FALL"); + if (iname.contains("prot")) + return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); + if (iname.contains("respiration")) + return Enchantment.getByName("OXYGEN"); + if (iname.contains("oxygen")) return Enchantment.getByName("OXYGEN"); + if (iname.contains("aqua")) + return Enchantment.getByName("WATER_WORKER"); + if (iname.contains("arth")) + return Enchantment.getByName("DAMAGE_ARTHROPODS"); + if (iname.contains("knockback")) + return Enchantment.getByName("KNOCKBACK"); + if (iname.contains("loot")) + return Enchantment.getByName("LOOT_BONUS_MOBS"); + if (iname.contains("dig")) return Enchantment.getByName("DIG_SPEED"); + if (iname.contains("silk")) return Enchantment.getByName("SILK_TOUCH"); + if (iname.contains("unbreaking")) + return Enchantment.getByName("DURABILITY"); + if (iname.contains("dura")) return Enchantment.getByName("DURABILITY"); + return null; + } + + static final HashMap armor; + static + { + armor = new HashMap(); + armor.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); + armor.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.IRON)); + armor.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.CHAINMAIL)); + + armor.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.IRON)); + armor.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.CHAINMAIL)); + + armor.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.IRON)); + armor.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.CHAINMAIL)); + + armor.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.LEATHER)); + armor.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.IRON)); + armor.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.GOLD)); + armor.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.DIAMOND)); + armor.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.CHAINMAIL)); + } + + public static int arrowCount(Player p) + { + return getItemAmount(p.getInventory().getContents(), new ItemStack( + Material.ARROW, 1)); + } + + public static int getItemAmountFromInventory(Inventory inv, ItemStack is) + { + return getItemAmount(inv.getContents(), is); + } + + public static boolean hasArmor(Player p) + { + PlayerInventory pi = p.getInventory(); + return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi + .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); + } + + public static ArmorLevel hasArmorSet(List inv) + { + ArmorLevel armorSet[] = new ArmorLevel[4]; + for (ItemStack is : inv) + { + Armor a = armor.get(is.getType()); + if (a == null) continue; + switch (a.type) + { + case BOOTS: + armorSet[0] = a.level; + break; + case LEGGINGS: + armorSet[1] = a.level; + break; + case CHEST: + armorSet[2] = a.level; + break; + case HELM: + armorSet[3] = a.level; + break; + } + } + ArmorLevel lvl = null; + for (ArmorLevel a : armorSet) + { + if (lvl == null) + lvl = a; + else if (lvl != a) return null; + } + return lvl; + } + + // + // private static Material getMaterial(ArmorLevel level) { + // switch(level){ + // case WOOL: return Material.WOOL; + // case LEATHER : return Material.LEATHER; + // case IRON: return Material.IRON_BOOTS; + // case GOLD : return Material.GOLD_BOOTS; + // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; + // case DIAMOND: return Material.DIAMOND; + // default : return null; + // } + // } + + public static int getItemAmount(ItemStack[] items, ItemStack is) + { + int count = 0; + for (ItemStack item : items) + { + if (item == null) + { + continue; + } + if (item.getType() == is.getType() + && ((item.getDurability() == is.getDurability() || item + .getDurability() == -1))) + { + count += item.getAmount(); + } + } + return count; + } + + public static ItemStack getItemStack(String name) + { + if (name == null || name.isEmpty()) return null; + name = name.replace(" ", "_"); + name = name.replace(":", ";"); + + int dataIndex = name.indexOf(';'); + dataIndex = (dataIndex != -1 ? dataIndex : -1); + int dataValue = 0; + if (dataIndex != -1) + { + dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer + .parseInt(name.substring(dataIndex + 1)) : 0); + name = name.substring(0, dataIndex); + } + + dataValue = dataValue < 0 ? 0 : dataValue; + Material mat = getMat(name); + + if (mat != null && mat != Material.AIR) + { + return new ItemStack(mat, 0, (short) dataValue); + } + return null; + } + + public static boolean isInt(String i) + { + try + { + Integer.parseInt(i); + return true; + } catch (Exception e) + { + return false; + } + } + + public static boolean isFloat(String i) + { + try + { + Float.parseFloat(i); + return true; + } catch (Exception e) + { + return false; + } + } + + // / Get the Material + public static Material getMat(String name) + { + Integer id = null; + try + { + id = Integer.parseInt(name); + } catch (Exception e) + { + } + if (id == null) + { + id = getMaterialID(name); + } + return id != null && id >= 0 ? Material.getMaterial(id) : null; + } + + // / This allows for abbreviations to work, useful for sign etc + public static int getMaterialID(String name) + { + name = name.toUpperCase(); + // / First try just getting it from the Material Name + Material mat = Material.getMaterial(name); + if (mat != null) return mat.getId(); + // / Might be an abbreviation, or a more complicated + int temp = Integer.MAX_VALUE; + mat = null; + name = name.replaceAll("\\s+", "").replaceAll("_", ""); + for (Material m : Material.values()) + { + if (m.name().replaceAll("_", "").startsWith(name)) + { + if (m.name().length() < temp) + { + mat = m; + temp = m.name().length(); + } + } + } + return mat != null ? mat.getId() : -1; + } + + public static boolean hasItem(Player p, ItemStack itemType) + { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) + { + if (is != null && is.getType() == itemType.getType()) + { + return true; + } + } + for (ItemStack is : inv.getArmorContents()) + { + if (is != null && is.getType() == itemType.getType()) + { + return true; + } + } + return false; + } + + public static boolean hasAnyItem(Player p) + { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) + { + if (is != null && is.getType() != Material.AIR) + { + // System.out.println("item=" + is); + return true; + } + } + for (ItemStack is : inv.getArmorContents()) + { + if (is != null && is.getType() != Material.AIR) + { + // System.out.println("item=" + is); + return true; + } + } + + return false; + } + + public static void addItemToInventory(Player player, ItemStack itemStack) + { + addItemToInventory(player, itemStack, itemStack.getAmount(), true, + false); + } + + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount) + { + addItemToInventory(player, itemStack, stockAmount, true, false); + } + + @SuppressWarnings("deprecation") + public static void addItemsToInventory(Player p, List items, + boolean ignoreHelmet) + { + for (ItemStack is : items) + InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), + false, false); + try + { + p.updateInventory(); + } catch (Exception e) + { + } + } + + @SuppressWarnings("deprecation") + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount, boolean update, boolean ignoreHelmet) + { + PlayerInventory inv = player.getInventory(); + Material itemType = itemStack.getType(); + if (armor.containsKey(itemType)) + { + // / no item: add to armor slot + // / item better: add old to inventory, new to armor slot + // / item notbetter: add to inventory + ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); + boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); + boolean better = empty ? false : armorSlotBetter( + armor.get(oldArmor.getType()), armor.get(itemType)); + final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; + if (empty || better) + { + switch (armor.get(itemType).type) + { + case HELM: + inv.setHelmet(itemStack); + break; + case CHEST: + inv.setChestplate(itemStack); + break; + case LEGGINGS: + inv.setLeggings(itemStack); + break; + case BOOTS: + inv.setBoots(itemStack); + break; + } + } + if (!empty) + { + if (better && (!isHelmet && ignoreHelmet)) + { + addItemToInventory(inv, oldArmor, oldArmor.getAmount()); + } + else + { + addItemToInventory(inv, itemStack, stockAmount); + } + } + } + else + { + addItemToInventory(inv, itemStack, stockAmount); + } + if (update) try + { + player.updateInventory(); + } catch (Exception e) + { + } + } + + private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) + { + if (oldArmor == null || newArmor == null) // / technically we could + // throw an exception.. but + // nah + return false; + return oldArmor.level.ordinal() < newArmor.level.ordinal(); + } + + private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) + { + switch (armor.type) + { + case HELM: + return inv.getHelmet(); + case CHEST: + return inv.getChestplate(); + case LEGGINGS: + return inv.getLeggings(); + case BOOTS: + return inv.getBoots(); + } + return null; + } + + // /Adds item to inventory + public static void addItemToInventory(Inventory inv, ItemStack is, int left) + { + int maxStackSize = is.getType().getMaxStackSize(); + if (left <= maxStackSize) + { + is.setAmount(left); + inv.addItem(is); + return; + } + + if (maxStackSize != 64) + { + ArrayList items = new ArrayList(); + for (int i = 0; i < Math.ceil(left / maxStackSize); i++) + { + if (left < maxStackSize) + { + is.setAmount(left); + items.add(is); + return; + } + else + { + is.setAmount(maxStackSize); + items.add(is); + } + } + Object[] iArray = items.toArray(); + for (Object o : iArray) + { + inv.addItem((ItemStack) o); + } + } + else + { + inv.addItem(is); + } + } + + public static void closeInventory(Player p) + { + + try + { + p.closeInventory(); + } catch (Exception closeInventoryError) + { + // / This almost always throws an NPE, but does its job so ignore + } + } + + public static void clearInventory(Player p) + { + try + { + PlayerInventory inv = p.getInventory(); + closeInventory(p); + + if (inv != null) + { + inv.clear(); + inv.setArmorContents(null); + inv.setItemInHand(null); + } + } catch (Exception ee) + { + ee.printStackTrace(); + } + } + + public static Object getCommonName(ItemStack is) + { + int id = is.getTypeId(); + int datavalue = is.getDurability(); + if (datavalue > 0) + { + return Material.getMaterial(id).toString() + ":" + datavalue; + } + return Material.getMaterial(id).toString(); + } + + public static boolean isItem(String str) + { + // System.out.println("string = " + str); + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + if (DEBUG) System.out.println("item=" + str); + ItemStack is = null; + try + { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + is.setAmount(Integer.valueOf(split[split.length - 1])); + for (int i = 1; i < split.length - 1; i++) + { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try + { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) + { + return false; + } + } + } catch (Exception e) + { + return false; + } + return true; + } + + public static ItemStack parseItem(String str) throws Exception + { + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + if (DEBUG) System.out.println("item=" + str); + ItemStack is = null; + try + { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + // System.out.println(" split = " + split); + final int amt = split.length > 1 ? Integer + .valueOf(split[split.length - 1]) : 1; + is.setAmount(amt); + for (int i = 1; i < split.length - 1; i++) + { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try + { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) + { + Logger.getLogger("minecraft").warning( + ewl + " can not be applied to the item " + str); + } + } + } catch (Exception e) + { + e.printStackTrace(); + Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); + throw new Exception("parse item was bad"); + } + return is; + } + + public static EnchantmentWithLevel getEnchantment(String str) + { + if (str.equalsIgnoreCase("all")) + { + return new EnchantmentWithLevel(true); + } + Enchantment e = null; + str = str.replaceAll(",", ":"); + int index = str.indexOf(':'); + index = (index != -1 ? index : -1); + int lvl = -1; + if (index != -1) + { + try + { + lvl = Integer.parseInt(str.substring(index + 1)); + } catch (Exception err) + { + } + str = str.substring(0, index); + } + + // System.out.println("String = <" + str +"> " + lvl); + try + { + e = Enchantment.getById(Integer.valueOf(str)); + } catch (Exception err) + { + } + if (e == null) e = Enchantment.getByName(str); + if (e == null) e = getEnchantmentByCommonName(str); + if (e == null) return null; + EnchantmentWithLevel ewl = new EnchantmentWithLevel(); + ewl.e = e; + if (lvl < e.getStartLevel()) + { + lvl = e.getStartLevel(); + } + if (lvl > e.getMaxLevel()) + { + lvl = e.getMaxLevel(); + } + ewl.lvl = lvl; + return ewl; + } + + public boolean addEnchantments(ItemStack is, String[] args) + { + Map encs = new HashMap(); + for (String s : args) + { + EnchantmentWithLevel ewl = getEnchantment(s); + if (ewl != null) + { + if (ewl.all) + { + return addAllEnchantments(is); + } + encs.put(ewl.e, ewl.lvl); + } + } + addEnchantments(is, encs); + return true; + } + + public void addEnchantments(ItemStack is, + Map enchantments) + { + for (Enchantment e : enchantments.keySet()) + { + if (e.canEnchantItem(is)) + { + is.addUnsafeEnchantment(e, enchantments.get(e)); + } + } + } + + public boolean addAllEnchantments(ItemStack is) + { + for (Enchantment enc : Enchantment.values()) + { + if (enc.canEnchantItem(is)) + { + is.addUnsafeEnchantment(enc, enc.getMaxLevel()); + } + } + return true; + } + + /** + * For Serializing an item or printing + * + * @param is + * @return + */ + public static String getItemString(ItemStack is) + { + if (is == null) return null; + StringBuilder sb = new StringBuilder(); + sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); + Map encs = is.getEnchantments(); + for (Enchantment enc : encs.keySet()) + { + sb.append(enc.getName() + ":" + encs.get(enc) + " "); + } + sb.append(is.getAmount()); + return sb.toString(); + } + + public static boolean hasEnchantedItem(Player p) + { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) + { + if (is != null && is.getType() != Material.AIR) + { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) return true; + } + } + for (ItemStack is : inv.getArmorContents()) + { + if (is != null && is.getType() != Material.AIR) + { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) return true; + } + } + return false; + } + + public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) + { + Armor a = armor.get(is.getType()); + if (a == null) return false; + return a.level == lvl; + } + + public static ItemStack getWool(int color) + { + return new ItemStack(Material.WOOL, 1, (short) color); + } +} diff --git a/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java b/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java new file mode 100644 index 0000000..06f0fef --- /dev/null +++ b/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.util; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + * + public static Test suite() + { + return new TestSuite( InventoryUtil.class ); + } */ + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml new file mode 100644 index 0000000..f1cb470 --- /dev/null +++ b/modules/v1_4_5/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_5 + parent + jar + + virtualplayers-v1_4_5 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.4.5-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_5 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java new file mode 100644 index 0000000..956bebb --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java new file mode 100644 index 0000000..1a176e8 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_4_5.DamageSource; +import net.minecraft.server.v1_4_5.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_4_5.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java new file mode 100644 index 0000000..d6b8746 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java new file mode 100644 index 0000000..856fba0 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java new file mode 100644 index 0000000..488d838 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java new file mode 100644 index 0000000..10a671f --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java new file mode 100644 index 0000000..a41f22a --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_4_5.EntityPlayer; +import net.minecraft.server.v1_4_5.ItemInWorldManager; +import net.minecraft.server.v1_4_5.MinecraftServer; +import net.minecraft.server.v1_4_5.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_5.CraftServer; +import org.bukkit.craftbukkit.v1_4_5.CraftWorld; +import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_4_5/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml new file mode 100644 index 0000000..a85e114 --- /dev/null +++ b/modules/v1_4_6/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_6 + parent + jar + + virtualplayers-v1_4_6 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.4.6-R0.3 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_6 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java new file mode 100644 index 0000000..b8f406e --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java new file mode 100644 index 0000000..369b549 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_4_6.DamageSource; +import net.minecraft.server.v1_4_6.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_4_6.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java new file mode 100644 index 0000000..97e37de --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java new file mode 100644 index 0000000..5b9509e --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java new file mode 100644 index 0000000..910e559 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java new file mode 100644 index 0000000..82206ae --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java new file mode 100644 index 0000000..bc46c99 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_4_6.EntityPlayer; +import net.minecraft.server.v1_4_6.MinecraftServer; +import net.minecraft.server.v1_4_6.PlayerInteractManager; +import net.minecraft.server.v1_4_6.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_6.CraftServer; +import org.bukkit.craftbukkit.v1_4_6.CraftWorld; +import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_4_6/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml new file mode 100644 index 0000000..83d7975 --- /dev/null +++ b/modules/v1_4_R1/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_R1 + parent + jar + + virtualplayers-v1_4_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.4.7-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..48999df --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java new file mode 100644 index 0000000..2328e8f --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_4_R1.DamageSource; +import net.minecraft.server.v1_4_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java new file mode 100644 index 0000000..7283146 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java new file mode 100644 index 0000000..2b7837b --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java new file mode 100644 index 0000000..9b9e3f1 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java new file mode 100644 index 0000000..a134b82 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java new file mode 100644 index 0000000..02bf915 --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_4_R1.EntityPlayer; +import net.minecraft.server.v1_4_R1.MinecraftServer; +import net.minecraft.server.v1_4_R1.PlayerInteractManager; +import net.minecraft.server.v1_4_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_R1.CraftServer; +import org.bukkit.craftbukkit.v1_4_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_4_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml new file mode 100644 index 0000000..59d8881 --- /dev/null +++ b/modules/v1_5_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_5_R1 + parent + jar + + virtualplayers-v1_5_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.5-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.5-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_5_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..dec575a --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java new file mode 100644 index 0000000..98a8d1b --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_5_R1.DamageSource; +import net.minecraft.server.v1_5_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java new file mode 100644 index 0000000..96c1403 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java new file mode 100644 index 0000000..3a57f82 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java new file mode 100644 index 0000000..7d4d263 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java new file mode 100644 index 0000000..d786283 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java new file mode 100644 index 0000000..244f071 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java @@ -0,0 +1,357 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_5_R1.EntityPlayer; +import net.minecraft.server.v1_5_R1.MinecraftServer; +import net.minecraft.server.v1_5_R1.PlayerInteractManager; +import net.minecraft.server.v1_5_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R1.CraftServer; +import org.bukkit.craftbukkit.v1_5_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_5_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_5_R2/pom.xml b/modules/v1_5_R2/pom.xml new file mode 100644 index 0000000..dc19298 --- /dev/null +++ b/modules/v1_5_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_5_R2 + parent + jar + + virtualplayers-v1_5_R2 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.5.1-R0.2 + provided + + + org.bukkit + craftbukkit + 1.5.1-R0.2 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_5_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..d977b9e --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java new file mode 100644 index 0000000..708a5b0 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_5_R2.DamageSource; +import net.minecraft.server.v1_5_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java new file mode 100644 index 0000000..d485405 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java new file mode 100644 index 0000000..c31484c --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java new file mode 100644 index 0000000..1da776b --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java new file mode 100644 index 0000000..6f92eca --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java new file mode 100644 index 0000000..29296c9 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_5_R2.EntityPlayer; +import net.minecraft.server.v1_5_R2.MinecraftServer; +import net.minecraft.server.v1_5_R2.PlayerInteractManager; +import net.minecraft.server.v1_5_R2.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R2.CraftServer; +import org.bukkit.craftbukkit.v1_5_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_5_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_5_R3/pom.xml b/modules/v1_5_R3/pom.xml new file mode 100644 index 0000000..7e8f7f4 --- /dev/null +++ b/modules/v1_5_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_5_R3 + parent + jar + + virtualplayers-v1_5_R3 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.5.2-R1.0 + provided + + + org.bukkit + craftbukkit + 1.5.2-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_5_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..d355e84 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java new file mode 100644 index 0000000..01f9aa1 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_5_R3.DamageSource; +import net.minecraft.server.v1_5_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java new file mode 100644 index 0000000..030de7c --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java new file mode 100644 index 0000000..6c07170 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java new file mode 100644 index 0000000..f8a6a34 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java new file mode 100644 index 0000000..08f34f5 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java new file mode 100644 index 0000000..427c7df --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_5_R3.EntityPlayer; +import net.minecraft.server.v1_5_R3.MinecraftServer; +import net.minecraft.server.v1_5_R3.PlayerInteractManager; +import net.minecraft.server.v1_5_R3.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R3.CraftServer; +import org.bukkit.craftbukkit.v1_5_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_5_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml new file mode 100644 index 0000000..806fd6f --- /dev/null +++ b/modules/v1_6_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_6_R1 + parent + jar + + virtualplayers-v1_6_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.6.1-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.6.1-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_6_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..241d07e --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java new file mode 100644 index 0000000..bc6b447 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_6_R1.DamageSource; +import net.minecraft.server.v1_6_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java new file mode 100644 index 0000000..09feb10 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java new file mode 100644 index 0000000..221b4d1 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java new file mode 100644 index 0000000..2b0c612 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java new file mode 100644 index 0000000..12830da --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java new file mode 100644 index 0000000..4facf49 --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_6_R1.EntityPlayer; +import net.minecraft.server.v1_6_R1.MinecraftServer; +import net.minecraft.server.v1_6_R1.PlayerInteractManager; +import net.minecraft.server.v1_6_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R1.CraftServer; +import org.bukkit.craftbukkit.v1_6_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20D; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_6_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_6_R2/pom.xml b/modules/v1_6_R2/pom.xml new file mode 100644 index 0000000..44156ce --- /dev/null +++ b/modules/v1_6_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_6_R2 + parent + jar + + virtualplayers-v1_6_R2 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.6.2-R1.0 + provided + + + org.bukkit + craftbukkit + 1.6.2-R1.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_6_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..ef1b1fa --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java new file mode 100644 index 0000000..cb00192 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_6_R2.DamageSource; +import net.minecraft.server.v1_6_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R2.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java new file mode 100644 index 0000000..0f5f314 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java new file mode 100644 index 0000000..8db50d8 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java new file mode 100644 index 0000000..b58f96d --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java new file mode 100644 index 0000000..74ee57c --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java new file mode 100644 index 0000000..4410038 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_6_R2.EntityPlayer; +import net.minecraft.server.v1_6_R2.MinecraftServer; +import net.minecraft.server.v1_6_R2.PlayerInteractManager; +import net.minecraft.server.v1_6_R2.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R2.CraftServer; +import org.bukkit.craftbukkit.v1_6_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20D; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_6_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_6_R3/pom.xml b/modules/v1_6_R3/pom.xml new file mode 100644 index 0000000..2982e05 --- /dev/null +++ b/modules/v1_6_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_6_R3 + parent + jar + + virtualplayers-v1_6_R3 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.6.4-R2.0 + provided + + + org.bukkit + craftbukkit + 1.6.4-R2.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_6_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..1534152 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java new file mode 100644 index 0000000..7ca264b --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_6_R3.DamageSource; +import net.minecraft.server.v1_6_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java new file mode 100644 index 0000000..a59561d --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java new file mode 100644 index 0000000..41e492b --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java new file mode 100644 index 0000000..e6aef4a --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java new file mode 100644 index 0000000..95d4c29 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java new file mode 100644 index 0000000..31cbe18 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java @@ -0,0 +1,385 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_6_R3.EntityPlayer; +import net.minecraft.server.v1_6_R3.MinecraftServer; +import net.minecraft.server.v1_6_R3.PlayerInteractManager; +import net.minecraft.server.v1_6_R3.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R3.CraftServer; +import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_6_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_6_R3/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_7_R1/pom.xml b/modules/v1_7_R1/pom.xml new file mode 100644 index 0000000..2545f2c --- /dev/null +++ b/modules/v1_7_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R1 + parent + jar + + virtualplayers-v1_7_R1 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + org.bukkit + craftbukkit + 1.7.2-R0.3 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..1ad6dae --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java @@ -0,0 +1,761 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; +import mc.alk.virtualplayers.nms.v1_7_R1.VirtualPlayer; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java new file mode 100644 index 0000000..dc941a9 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_7_R1.DamageSource; +import net.minecraft.server.v1_7_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java new file mode 100644 index 0000000..ddf255b --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java new file mode 100644 index 0000000..7b1bc7d --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java new file mode 100644 index 0000000..6f49191 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java new file mode 100644 index 0000000..728c428 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java new file mode 100644 index 0000000..d6eec73 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java @@ -0,0 +1,386 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R1.EntityPlayer; +import net.minecraft.server.v1_7_R1.MinecraftServer; +import net.minecraft.server.v1_7_R1.PlayerInteractManager; +import net.minecraft.server.v1_7_R1.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R1.CraftServer; +import org.bukkit.craftbukkit.v1_7_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_7_R1/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml new file mode 100644 index 0000000..d67c77f --- /dev/null +++ b/modules/v1_7_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R2 + parent + jar + + virtualplayers-v1_7_R2 + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..880b954 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java @@ -0,0 +1,761 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; +import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java new file mode 100644 index 0000000..1455418 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java @@ -0,0 +1,433 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_7_R2.DamageSource; +import net.minecraft.server.v1_7_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java new file mode 100644 index 0000000..99417d1 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java new file mode 100644 index 0000000..8a7f897 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java @@ -0,0 +1,59 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java new file mode 100644 index 0000000..de964cd --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java new file mode 100644 index 0000000..8232635 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java new file mode 100644 index 0000000..57a6fa2 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java @@ -0,0 +1,392 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R2.EntityPlayer; +import net.minecraft.server.v1_7_R2.MinecraftServer; +import net.minecraft.server.v1_7_R2.PlayerInteractManager; +import net.minecraft.server.v1_7_R2.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R2.CraftServer; +import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) vp = vps.get(id); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/v1_7_R2/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/v1_7_R3/pom.xml b/modules/v1_7_R3/pom.xml new file mode 100644 index 0000000..1d00cb8 --- /dev/null +++ b/modules/v1_7_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R3 + parent + jar + + virtualplayers-v1_7_R3 + http://maven.apache.org + + + UTF-8 + + + + + mc.alk + vp-util + parent + true + + + org.bukkit + bukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.7.9-R0.1 + provided + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..03ba980 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java new file mode 100644 index 0000000..b347d7c --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java @@ -0,0 +1,434 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.v1_7_R3.DamageSource; +import net.minecraft.server.v1_7_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin p) { + super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"),1); + super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java new file mode 100644 index 0000000..2d4bdc2 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java new file mode 100644 index 0000000..ea4d748 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java new file mode 100644 index 0000000..57dd9a0 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java new file mode 100644 index 0000000..3b0b617 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import org.bukkit.command.CommandSender; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java new file mode 100644 index 0000000..66eedf8 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java @@ -0,0 +1,396 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R3.EntityPlayer; +import net.minecraft.server.v1_7_R3.MinecraftServer; +import net.minecraft.server.v1_7_R3.PlayerInteractManager; +import net.minecraft.server.v1_7_R3.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R3.CraftServer; +import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer implements Listener { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) vp = vps.get(id); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} diff --git a/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java b/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java new file mode 100644 index 0000000..aad11e8 --- /dev/null +++ b/modules/v1_7_R3/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R3; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml new file mode 100644 index 0000000..05d1fc6 --- /dev/null +++ b/modules/vpre/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-vpre + parent + jar + + virtualplayers-vPre + http://maven.apache.org + + + UTF-8 + + + + + org.bukkit + craftbukkit + 1.3.2-R3.0 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-vPre + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java new file mode 100644 index 0000000..df6d049 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.vpre; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java new file mode 100644 index 0000000..1271c74 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java @@ -0,0 +1,403 @@ +package mc.alk.virtualplayers.nms.vpre; + +import mc.alk.virtualplayers.Util.InventoryUtil; +import net.minecraft.server.DamageSource; +import net.minecraft.server.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin plugin) { + super(plugin,1); + super.useAlias = 0; + this.plugin = (JavaPlugin) plugin; + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); + if (!ede.isCancelled() || force) { + damagee.setLastDamageCause(ede); + damagee.setHealth(damagee.getHealth() - ede.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + Integer damage = 5; + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((CraftPlayer) damager).getHandle(), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0); + vp.damage(100000); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java new file mode 100644 index 0000000..17b6abe --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author alkarin + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java new file mode 100644 index 0000000..e07b026 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java new file mode 100644 index 0000000..0873de4 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java new file mode 100644 index 0000000..bf0c64f --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.vpre; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java new file mode 100644 index 0000000..ae259f5 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java @@ -0,0 +1,354 @@ +package mc.alk.virtualplayers.nms.vpre; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + /// mcserver, worldserver, string, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was factored out of VirtualPlayers JavaPlugin class. + */ + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } +} diff --git a/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java new file mode 100644 index 0000000..e85bf94 --- /dev/null +++ b/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R2; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7498ae5 --- /dev/null +++ b/pom.xml @@ -0,0 +1,77 @@ + + 4.0.0 + mc.alk + vp-parent + parent + pom + VirtualPlayers Parent POM + http://github.com/alkarinv/VirtualPlayers + + MMdd + UTF-8 + + + modules/util + modules/vpre + modules/v1_4_5 + modules/v1_4_6 + modules/v1_4_R1 + modules/v1_5_R1 + modules/v1_5_R2 + modules/v1_5_R3 + modules/v1_6_R1 + modules/v1_6_R2 + modules/v1_6_R3 + modules/v1_7_R1 + modules/v1_7_R2 + modules/v1_7_R3 + modules/VirtualPlayers + + + + battleplugins-repo + http://server.battleplugins.com/maven/repository/ + + + bukkit-repo + http://repo.bukkit.org/content/groups/public + + + md_5-snapshots + http://repo.md-5.net/content/repositories/snapshots/ + + + sk89q-repo + http://maven.sk89q.com/repo/ + + + vault-repo + http://nexus.theyeticave.net/content/repositories/pub_releases + + + kitteh-repo + http://repo.kitteh.org/content/repositories/public/ + + + + + junit + junit + 3.8.1 + test + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + true + + + + + From 194891d1a3ed9598edd2531d2247426aca4e95dc Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 20 Jul 2014 14:41:57 -0500 Subject: [PATCH 08/74] Added support for Minecraft v1_7_R4 VirtualPlayers v1.5.10 refactored mc.alk.virtualplayers.Util to lowercase Added util/Version.java Plugin now automatically disables itself for unsupported versions of Minecraft: So that it doesn't spam the console/logs with errors. Admins are alerted of the problem. --- error.log | 42 + modules/VirtualPlayers/pom.xml | 11 +- .../mc/alk/virtualplayers/VirtualPlayers.java | 10 + modules/util/pom.xml | 2 +- .../virtualplayers/util/InventoryUtil.java | 2 +- .../mc/alk/virtualplayers/util/Version.java | 131 +++ modules/v1_4_5/pom.xml | 2 +- .../nms/v1_4_5/CustomCommandExecutor.java | 2 +- .../nms/v1_4_5/PlayerExecutor.java | 2 +- modules/v1_4_6/pom.xml | 2 +- .../nms/v1_4_6/CustomCommandExecutor.java | 2 +- .../nms/v1_4_6/PlayerExecutor.java | 2 +- modules/v1_4_R1/pom.xml | 2 +- .../nms/v1_4_R1/CustomCommandExecutor.java | 2 +- .../nms/v1_4_R1/PlayerExecutor.java | 2 +- modules/v1_5_R1/pom.xml | 2 +- .../nms/v1_5_R1/CustomCommandExecutor.java | 2 +- .../nms/v1_5_R1/PlayerExecutor.java | 2 +- modules/v1_5_R2/pom.xml | 2 +- .../nms/v1_5_R2/CustomCommandExecutor.java | 2 +- .../nms/v1_5_R2/PlayerExecutor.java | 2 +- modules/v1_5_R3/pom.xml | 2 +- .../nms/v1_5_R3/CustomCommandExecutor.java | 2 +- .../nms/v1_5_R3/PlayerExecutor.java | 2 +- modules/v1_6_R1/pom.xml | 2 +- .../nms/v1_6_R1/CustomCommandExecutor.java | 2 +- .../nms/v1_6_R1/PlayerExecutor.java | 2 +- modules/v1_6_R2/pom.xml | 2 +- .../nms/v1_6_R2/CustomCommandExecutor.java | 2 +- .../nms/v1_6_R2/PlayerExecutor.java | 2 +- modules/v1_6_R3/pom.xml | 2 +- .../nms/v1_6_R3/CustomCommandExecutor.java | 2 +- .../nms/v1_6_R3/PlayerExecutor.java | 2 +- modules/v1_7_R1/pom.xml | 2 +- .../nms/v1_7_R1/CustomCommandExecutor.java | 2 +- .../nms/v1_7_R1/PlayerExecutor.java | 2 +- modules/v1_7_R2/pom.xml | 2 +- .../nms/v1_7_R2/CustomCommandExecutor.java | 2 +- .../nms/v1_7_R2/PlayerExecutor.java | 2 +- modules/v1_7_R3/pom.xml | 2 +- .../nms/v1_7_R3/CustomCommandExecutor.java | 2 +- .../nms/v1_7_R3/PlayerExecutor.java | 2 +- modules/v1_7_R4/pom.xml | 71 ++ .../nms/v1_7_R4/CustomCommandExecutor.java | 760 ++++++++++++++++++ .../nms/v1_7_R4/PlayerExecutor.java | 455 +++++++++++ .../nms/v1_7_R4/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_7_R4/Util.java | 58 ++ .../nms/v1_7_R4/VPBaseExecutor.java | 115 +++ .../nms/v1_7_R4/VPExecutor.java | 74 ++ .../nms/v1_7_R4/VirtualPlayer.java | 396 +++++++++ .../alk/virtualplayers/v1_7_R3/AppTest.java | 38 + modules/vpre/pom.xml | 2 +- .../nms/vpre/CustomCommandExecutor.java | 2 +- .../nms/vpre/PlayerExecutor.java | 2 +- pom.xml | 1 + 55 files changed, 2256 insertions(+), 43 deletions(-) create mode 100644 error.log create mode 100644 modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java create mode 100644 modules/v1_7_R4/pom.xml create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java create mode 100644 modules/v1_7_R4/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java diff --git a/error.log b/error.log new file mode 100644 index 0000000..afc5990 --- /dev/null +++ b/error.log @@ -0,0 +1,42 @@ +Occurs on v1_7_R4 +Does NOT occur on v1_7_R3 + +./dc tester connect +./dc tester chat this is a test msg + +The command works fine, but produces an EssentialsChat error. + +2014-07-20 13:32:48 [Server thread][INFO] Europia79[/127.0.0.1:54278] logged in with entity id 305 at ([world] -869.5996630658932, 4.0, -1172.589664910662) +2014-07-20 13:32:53 [Server thread][INFO] [tester] 'tester is connecting' +2014-07-20 13:32:53 [Server thread][INFO] [tester] 'tester connecting. Details:tester[0;33;1m h=20.0[0;33;1m o=true[0;33;1m d=[0;37;22mfalse[0;33;1m loc=world,0.0,0.0,0.0[0;33;1m gm=[0;30;1mSURVIVAL' +2014-07-20 13:32:53 [Server thread][INFO] tester connecting. Details:tester[0;33;1m h=20.0[0;33;1m o=true[0;33;1m d=[0;37;22mfalse[0;33;1m loc=world,0.0,0.0,0.0[0;33;1m gm=[0;30;1mSURVIVAL +2014-07-20 13:32:53 [Server thread][INFO] [tester] 'tester[0;33;1m teleporting from 0.0,0.0,0.0 [0;33;1m-> -431.0,4.0,-1211.0' +2014-07-20 13:32:54 [Server thread][INFO] [tester] 'tester gettingMessage= Welcome, tester!' +2014-07-20 13:32:54 [Server thread][INFO] [tester] 'tester gettingMessage= Type [0;31;1m/help for a list of commands.' +2014-07-20 13:32:54 [Server thread][INFO] [tester] 'tester gettingMessage= Type [0;31;1m/list to see who else is online.' +2014-07-20 13:32:54 [Server thread][INFO] [tester] 'tester gettingMessage= Players online:[0;31;1m 1 - World time:[0;31;1m 4:19 PM' +2014-07-20 13:32:54 [Server thread][INFO] [tester] 'tester gettingMessage= You have no new mail.' +DEBUGGING LINES: +2014-07-20 13:33:03 [Server thread][INFO] sender = CONSOLE +2014-07-20 13:33:03 [Server thread][INFO] vp = tester +2014-07-20 13:33:03 [Server thread][INFO] args = [Ljava.lang.String;@5f6bc40 +2014-07-20 13:33:03 [Server thread][INFO] players = [tester&e h=&220.0&e o=&5true&e d=&7false&e loc=&4&5world,&4-431.0,4.0,-1211.0&e gm=&8SURVIVAL, CraftPlayer{name=Europia79}] +END DEBUGGING LINES. +2014-07-20 13:33:03 [Server thread][INFO] tester said this is a test msg +2014-07-20 13:33:03 [Thread-14][ERROR] Could not pass event AsyncPlayerChatEvent to EssentialsChat v2.13.1 +org.bukkit.event.EventException + at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:294) ~[craftbukkit1710.jar:git-Bukkit-1.7.9-R0.2-14-gd373bc2-b3103jnks] + at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit1710.jar:git-Bukkit-1.7.9-R0.2-14-gd373bc2-b3103jnks] + at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:501) [craftbukkit1710.jar:git-Bukkit-1.7.9-R0.2-14-gd373bc2-b3103jnks] + at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:483) [craftbukkit1710.jar:git-Bukkit-1.7.9-R0.2-14-gd373bc2-b3103jnks] + at mc.alk.virtualplayers.nms.v1_7_R4.PlayerExecutor$1.run(PlayerExecutor.java:216) [VirtualPlayers.jar:?] + at java.lang.Thread.run(Unknown Source) [?:1.8.0_05] +Caused by: java.lang.NullPointerException + at com.earth2me.essentials.chat.EssentialsChatPlayerListenerLowest.onPlayerChat(EssentialsChatPlayerListenerLowest.java:50) ~[?:?] + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_05] + at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_05] + at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_05] + at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_05] + at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:292) ~[craftbukkit1710.jar:git-Bukkit-1.7.9-R0.2-14-gd373bc2-b3103jnks] + ... 5 more +2014-07-20 13:33:03 [Thread-14][INFO] [tester] 'tester gettingMessage= this is a test msg' diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 564ce45..305e0fa 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,11 +4,11 @@ mc.alk VirtualPlayers - 1.5.9 + 1.5.10 jar VirtualPlayers - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 @@ -118,6 +118,13 @@ jar true + + mc.alk + vp-v1_7_R4 + parent + jar + true + junit junit diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index e556c2f..07d888d 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -2,6 +2,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import mc.alk.virtualplayers.util.Version; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; import org.bukkit.event.Listener; @@ -11,10 +12,19 @@ public class VirtualPlayers extends JavaPlugin implements Listener { + public static final String MAX = "1.7.10-R9.9-SNAPSHOT"; + public static final String MIN = "1.2.5"; @Override public void onEnable() { + if (!Version.getServer().isSupported(MAX) || !Version.getServer().isCompatible(MIN)) { + getLogger().info("VirtualPlayers is not compatible with your server."); + getLogger().info("The maximum supported version is " + MAX); + getLogger().info("The minimum capatible version is " + MIN); + Bukkit.getServer().getPluginManager().disablePlugin(this); + return; + } // Bukkit.getPluginManager().registerEvents(this, this); // getCommand("vdc").setExecutor(new PlayerExecutor(this)); // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); diff --git a/modules/util/pom.xml b/modules/util/pom.xml index 727b6db..4807ce0 100644 --- a/modules/util/pom.xml +++ b/modules/util/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-util - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java index f58202c..7b324e8 100644 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.Util; +package mc.alk.virtualplayers.util; import java.util.ArrayList; import java.util.HashMap; diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java new file mode 100644 index 0000000..a28df5d --- /dev/null +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java @@ -0,0 +1,131 @@ +package mc.alk.virtualplayers.util; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * The Version object: Capable of asking the important question:

+ * + * Is the version that's currently installed & running on the server compatible with a specified version ?

+ * + * isCompatible(): Is the installed version greater than or equal to the minimum required version ?

+ * + * isSupported(): Is the installed version less than or equal to the maximum required version ?

+ * + * @author Nikolai + */ +public class Version implements Comparable { + + Plugin plugin; + String version; + boolean enabled; + + private Version() { + this.plugin = null; + this.version = Bukkit.getServer().getBukkitVersion(); + this.enabled = true; + } + + public Version(String pluginName) { + this.plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginName); + this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); + this.enabled = (version == null) ? false : plugin.isEnabled(); + } + + public static Version getPlugin(String pluginName) { + return new Version(pluginName); + } + + public static Version getServer() { + return new Version(); + } + + public JavaPlugin getJavaPlugin() { + return (this.plugin == null) ? null : (JavaPlugin) this.plugin; + } + + public boolean isEnabled() { + return this.enabled; + } + + public boolean isNull() { + return (this.plugin == null); + } + + /** + * @param minVersion - The absolute minimum version that's required to achieve compatibility. + * @return Greater than or equal to will return true. Otherwise, false. + */ + public boolean isCompatible(String minVersion) { + if (this.version == null || !this.enabled) return false; + int x = compareTo(minVersion); + if (x >= 0) { + return true; + } + return false; + } + + /** + * @param maxVersion - The absolute maximum version that's supported. + * @return Less than or equal to will return true. Otherwise, false. + */ + public boolean isSupported(String maxVersion) { + if (this.version == null) return false; + int x = compareTo(maxVersion); + if (x <= 0) { + return true; + } + return false; + } + + @Override + public int compareTo(String whichVersion) { + int[] current = parseVersion(this.version); + int[] min = parseVersion(whichVersion); + int length = (current.length >= min.length) ? current.length : min.length; + for (int index = 0; index <= (length - 1); index = index + 1) { + try { + if (current[index] != min[index]) { + if (current[index] > min[index]) { + return 1; + } else { + return -1; + } + } + } catch (IndexOutOfBoundsException ex) { + if (current.length > min.length) { + return 1; + } else if (current.length < min.length) { + return -1; + } + } + } + return 0; + } + + /** + * A typical version of 1.2.3.4-b567 will be broken down into an array of length five.

+ * + * [1] [2] [3] [4] [567] + */ + private int[] parseVersion(String version) { + String[] stringArray = version.split("[.-]"); + int[] temp = new int[stringArray.length]; + for (int index = 0; index <= (stringArray.length - 1); index = index + 1) { + String t = stringArray[index].replaceAll("\\D", ""); + try { + temp[index] = Integer.valueOf(t); + } catch(NumberFormatException ex) { + temp[index] = 0; + } + } + return temp; + } + + @Override + public String toString() { + String v = (this.version == null) ? "" : this.version; + return v; + } +} diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml index f1cb470..45e1177 100644 --- a/modules/v1_4_5/pom.xml +++ b/modules/v1_4_5/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_4_5 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java index 956bebb..df2d539 100644 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_5; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java index 1a176e8..72ab4a7 100644 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_5; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_4_5.DamageSource; import net.minecraft.server.v1_4_5.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml index a85e114..981d0cf 100644 --- a/modules/v1_4_6/pom.xml +++ b/modules/v1_4_6/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_4_6 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java index b8f406e..1e98a1d 100644 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_6; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java index 369b549..e220368 100644 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_6; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_4_6.DamageSource; import net.minecraft.server.v1_4_6.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml index 83d7975..261baf1 100644 --- a/modules/v1_4_R1/pom.xml +++ b/modules/v1_4_R1/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_4_R1 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java index 48999df..ea38d02 100644 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java index 2328e8f..977420b 100644 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_4_R1.DamageSource; import net.minecraft.server.v1_4_R1.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml index 59d8881..e8f9c33 100644 --- a/modules/v1_5_R1/pom.xml +++ b/modules/v1_5_R1/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_5_R1 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java index dec575a..9771855 100644 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_5_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java index 98a8d1b..df13c24 100644 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_5_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_5_R1.DamageSource; import net.minecraft.server.v1_5_R1.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_5_R2/pom.xml b/modules/v1_5_R2/pom.xml index dc19298..d74fc85 100644 --- a/modules/v1_5_R2/pom.xml +++ b/modules/v1_5_R2/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_5_R2 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java index d977b9e..f9de5e5 100644 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_5_R2; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java index 708a5b0..8fbd215 100644 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_5_R2; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_5_R2.DamageSource; import net.minecraft.server.v1_5_R2.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_5_R3/pom.xml b/modules/v1_5_R3/pom.xml index 7e8f7f4..9dd770a 100644 --- a/modules/v1_5_R3/pom.xml +++ b/modules/v1_5_R3/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_5_R3 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java index d355e84..4943a16 100644 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_5_R3; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java index 01f9aa1..0d955a5 100644 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_5_R3; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_5_R3.DamageSource; import net.minecraft.server.v1_5_R3.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml index 806fd6f..53a9534 100644 --- a/modules/v1_6_R1/pom.xml +++ b/modules/v1_6_R1/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_6_R1 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java index 241d07e..94d5c27 100644 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_6_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java index bc6b447..8e38b20 100644 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_6_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_6_R1.DamageSource; import net.minecraft.server.v1_6_R1.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_6_R2/pom.xml b/modules/v1_6_R2/pom.xml index 44156ce..64a218c 100644 --- a/modules/v1_6_R2/pom.xml +++ b/modules/v1_6_R2/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_6_R2 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java index ef1b1fa..c5aaaf1 100644 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_6_R2; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java index cb00192..6538088 100644 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_6_R2; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_6_R2.DamageSource; import net.minecraft.server.v1_6_R2.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_6_R3/pom.xml b/modules/v1_6_R3/pom.xml index 2982e05..245dd0a 100644 --- a/modules/v1_6_R3/pom.xml +++ b/modules/v1_6_R3/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_6_R3 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java index 1534152..57e76eb 100644 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_6_R3; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java index 7ca264b..4fadd27 100644 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_6_R3; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_6_R3.DamageSource; import net.minecraft.server.v1_6_R3.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_7_R1/pom.xml b/modules/v1_7_R1/pom.xml index 2545f2c..3b2519c 100644 --- a/modules/v1_7_R1/pom.xml +++ b/modules/v1_7_R1/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_7_R1 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java index 1ad6dae..96e800d 100644 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_7_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java index dc941a9..fb17fde 100644 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_7_R1; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_7_R1.DamageSource; import net.minecraft.server.v1_7_R1.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml index d67c77f..1a42a30 100644 --- a/modules/v1_7_R2/pom.xml +++ b/modules/v1_7_R2/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_7_R2 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java index 880b954..8caa14f 100644 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_7_R2; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java index 1455418..0db7017 100644 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_7_R2; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_7_R2.DamageSource; import net.minecraft.server.v1_7_R2.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_7_R3/pom.xml b/modules/v1_7_R3/pom.xml index 1d00cb8..ea15ab8 100644 --- a/modules/v1_7_R3/pom.xml +++ b/modules/v1_7_R3/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-v1_7_R3 - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java index 03ba980..2588b03 100644 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_7_R3; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java index b347d7c..e7aeed7 100644 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.v1_7_R3; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.v1_7_R3.DamageSource; import net.minecraft.server.v1_7_R3.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/modules/v1_7_R4/pom.xml b/modules/v1_7_R4/pom.xml new file mode 100644 index 0000000..2633d9c --- /dev/null +++ b/modules/v1_7_R4/pom.xml @@ -0,0 +1,71 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_7_R4 + parent + jar + + virtualplayers-v1_7_R4 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.7.10-R0.1-SNAPSHOT + system + C:/Users/Nikolai/Documents/lib/bukkit/1.7.10/craftbukkit.jar + + + mc.alk + vp-util + parent + true + + + org.bukkit + bukkit + 1.7.5-R0.1-SNAPSHOT + provided + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_7_R4 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java new file mode 100644 index 0000000..154d788 --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java @@ -0,0 +1,760 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import mc.alk.virtualplayers.util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } + return null; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java new file mode 100644 index 0000000..95aa09f --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java @@ -0,0 +1,455 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import mc.alk.virtualplayers.util.InventoryUtil; +import net.minecraft.server.v1_7_R4.DamageSource; +import net.minecraft.server.v1_7_R4.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.ChatColor; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin p) { + super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"),1); + super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + + } + + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) + continue; + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak){ + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + + System.out.println("sender = " + sender.getName()); + System.out.println("vp = " + vp.getName()); + System.out.println("args = " + args.toString()); + System.out.println("players = " + players.toString()); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; + sendMessage(sender, message); + // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent event = new EntityDamageEvent( + damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damagee.getHealth() - h); + /* + EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, + null, + null); */ + if (!event.isCancelled() || force) { + damagee.setLastDamageCause(event); + damagee.setHealth(damagee.getHealth() - event.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = new EntityDamageByEntityEvent( + damager, damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damage); + /* + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((Entity) ((CraftPlayer) damager).getHandle()), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + */ + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc","disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) + { + vp.setOnline(connecting); + if (connecting) + { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() + { + @Override + public void run() + { + try{ + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex){/* say nothing */} + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable(){ + @Override + public void run() + { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try + { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex){/* do nothing */} + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent( playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } + else + { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java new file mode 100644 index 0000000..6b3ecec --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java new file mode 100644 index 0000000..52ec6ef --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java new file mode 100644 index 0000000..448d40f --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java new file mode 100644 index 0000000..2f634ed --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import org.bukkit.command.CommandSender; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java new file mode 100644 index 0000000..0c78839 --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java @@ -0,0 +1,396 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_7_R4.EntityPlayer; +import net.minecraft.server.v1_7_R4.MinecraftServer; +import net.minecraft.server.v1_7_R4.PlayerInteractManager; +import net.minecraft.server.v1_7_R4.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R4.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer implements Listener { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static Player getPlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) vp = vps.get(id); + return vp; + } + + public static Player getPlayerExact(String pname) + { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) vp = names.get(pname); + return vp; + } + + public static Player getOrMakePlayer(String pname) + { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) vp = names.get(pname); + if (vp == null){ + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() + { + List players = new ArrayList(); + for (Player p : vps.values()){ + if (p.isOnline()){ + players.add(p);} + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers(); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() + { + for (VirtualPlayer vp : vps.values()) + { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try{ + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} diff --git a/modules/v1_7_R4/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java b/modules/v1_7_R4/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java new file mode 100644 index 0000000..aad11e8 --- /dev/null +++ b/modules/v1_7_R4/src/test/java/mc/alk/virtualplayers/v1_7_R3/AppTest.java @@ -0,0 +1,38 @@ +package mc.alk.virtualplayers.v1_7_R3; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml index 05d1fc6..ffb29d5 100644 --- a/modules/vpre/pom.xml +++ b/modules/vpre/pom.xml @@ -13,7 +13,7 @@ jar virtualplayers-vPre - http://maven.apache.org + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ UTF-8 diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java index df6d049..e560f45 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.vpre; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java index 1271c74..0fd7187 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java @@ -1,6 +1,6 @@ package mc.alk.virtualplayers.nms.vpre; -import mc.alk.virtualplayers.Util.InventoryUtil; +import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.DamageSource; import net.minecraft.server.EntityPlayer; import org.apache.commons.lang.StringUtils; diff --git a/pom.xml b/pom.xml index 7498ae5..a7e5dae 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ modules/v1_7_R1 modules/v1_7_R2 modules/v1_7_R3 + modules/v1_7_R4 modules/VirtualPlayers From 8b436c62fc9aca9d436ff2d5a284c01b59d69f01 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Tue, 22 Jul 2014 22:49:06 -0500 Subject: [PATCH 09/74] Added Eclipse support. Eclipse does not like changing the Maven target directory to ../../target So the target was changed to the default: ./target Consequently, the ant task that copies the target/JAR to the /server/plugins folder was updated to reflect the new directory locations. --- modules/VirtualPlayers/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 305e0fa..4c9b209 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -134,7 +134,7 @@ VirtualPlayers - ../../target + ./target ./src/main/java @@ -205,7 +205,7 @@ maven-antrun-plugin - + From da4b09b919117058432e2e3df56f4ad8ac7e6243 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Tue, 22 Jul 2014 23:26:57 -0500 Subject: [PATCH 10/74] Updated Version.java compatibility checker. Todo: Add a method() to change the regular expression that splits the version string into its parts. The default behavior is to split the version up by periods and dashes. --- .../mc/alk/virtualplayers/util/Version.java | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java index a28df5d..dae81a6 100644 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java @@ -2,7 +2,6 @@ import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPlugin; /** * The Version object: Capable of asking the important question:

@@ -19,18 +18,15 @@ public class Version implements Comparable { Plugin plugin; String version; - boolean enabled; private Version() { this.plugin = null; this.version = Bukkit.getServer().getBukkitVersion(); - this.enabled = true; } public Version(String pluginName) { this.plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginName); this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); - this.enabled = (version == null) ? false : plugin.isEnabled(); } public static Version getPlugin(String pluginName) { @@ -41,16 +37,13 @@ public static Version getServer() { return new Version(); } - public JavaPlugin getJavaPlugin() { - return (this.plugin == null) ? null : (JavaPlugin) this.plugin; - } - public boolean isEnabled() { - return this.enabled; - } - - public boolean isNull() { - return (this.plugin == null); + if (this.plugin != null) { + return this.plugin.isEnabled(); + } else if (this.version != null) { // No plugin, but object is a version checker for the server + return true; + } + return false; // Plugin mis-spelled or not installed on the server. } /** @@ -58,7 +51,7 @@ public boolean isNull() { * @return Greater than or equal to will return true. Otherwise, false. */ public boolean isCompatible(String minVersion) { - if (this.version == null || !this.enabled) return false; + if (!this.isEnabled()) return false; int x = compareTo(minVersion); if (x >= 0) { return true; @@ -71,7 +64,7 @@ public boolean isCompatible(String minVersion) { * @return Less than or equal to will return true. Otherwise, false. */ public boolean isSupported(String maxVersion) { - if (this.version == null) return false; + if (!this.isEnabled()) return false; int x = compareTo(maxVersion); if (x <= 0) { return true; @@ -128,4 +121,4 @@ public String toString() { String v = (this.version == null) ? "" : this.version; return v; } -} +} \ No newline at end of file From 77d63f173d19f7f900df19dc21623d0703522720 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 26 Jul 2014 11:42:47 -0500 Subject: [PATCH 11/74] Refactored Version.java The VirtualPlayers plugin class was also effected by this change. Renamed factory methods .getPlugin(String) and .getPlugin(Plugin) to .getVersion(String) and .getVersion(Plugin) Added: private Version(Version) constructor public Version(Server) constructor .getServerVersion() factory .getNmsVersion() factory .setSeparator() .getPlugin() returns a Plugin. Added: Several methods were added to support weird versioning systems that broke compatibility checking: int length() boolean equals(String) - this method ignores case boolean contains(String) boolean search(String regex) Version getSubVersion(String regex) - factory private Version setVersion(String) The getSubVersion() method returns a completely new Version object (if a match is found) and uses the private method .setVersion() to change it. Primarily used if you're checking for Dev versions, etc. --- .../mc/alk/virtualplayers/VirtualPlayers.java | 31 ++-- .../mc/alk/virtualplayers/util/Version.java | 151 ++++++++++++++---- 2 files changed, 132 insertions(+), 50 deletions(-) diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 07d888d..413b728 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -12,13 +12,16 @@ public class VirtualPlayers extends JavaPlugin implements Listener { + Version server; public static final String MAX = "1.7.10-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; - + Version NMS; + @Override - public void onEnable() - { - if (!Version.getServer().isSupported(MAX) || !Version.getServer().isCompatible(MIN)) { + public void onEnable() { + NMS = Version.getNmsVersion(); + server = Version.getServerVersion(); + if (!server.isSupported(MAX) || !server.isCompatible(MIN)) { getLogger().info("VirtualPlayers is not compatible with your server."); getLogger().info("The maximum supported version is " + MAX); getLogger().info("The minimum capatible version is " + MIN); @@ -42,7 +45,7 @@ public void onDisable() Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } } - + public void setPlayerMessages(boolean show){ // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.setGlobalMessages(show); try { @@ -51,7 +54,7 @@ public void setPlayerMessages(boolean show){ Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } } - + public void setEventMessages(boolean show){ // mc.alk.virtualplayers.nms.{version}.VPBaseExecutor.setShowEventMessages(show); try { @@ -60,17 +63,11 @@ public void setEventMessages(boolean show){ Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } } - - public static Class getNmsClass(String clazz) throws Exception { - String mcVersion; - try { - mcVersion = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; - } catch (ArrayIndexOutOfBoundsException ex) { - mcVersion = "vpre"; - } - return Class.forName("mc.alk.virtualplayers.nms." + mcVersion + "." + clazz); + + public Class getNmsClass(String clazz) throws Exception { + return Class.forName("mc.alk.virtualplayers.nms." + NMS + "." + clazz); } - + private void registerListeners() { // mc.alk.virtualplayers.nms.{version}.PlayerListener try { @@ -80,7 +77,7 @@ private void registerListeners() { Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } } - + private void registerCommands() { // getCommand("vdc").setExecutor(new PlayerExecutor(this)); // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java index dae81a6..47f3b7c 100644 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java @@ -1,42 +1,77 @@ package mc.alk.virtualplayers.util; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.bukkit.Bukkit; +import org.bukkit.Server; import org.bukkit.plugin.Plugin; /** * The Version object: Capable of asking the important question:

- * + * * Is the version that's currently installed & running on the server compatible with a specified version ?

- * + * * isCompatible(): Is the installed version greater than or equal to the minimum required version ?

- * + * * isSupported(): Is the installed version less than or equal to the maximum required version ?

- * - * @author Nikolai + * + * @author Europia79, BigTeddy98, Tux2 */ public class Version implements Comparable { - + Plugin plugin; String version; - - private Version() { - this.plugin = null; - this.version = Bukkit.getServer().getBukkitVersion(); + String separator = "[.-]"; + + private Version(Version v) { + this.plugin = v.getPlugin(); + this.version = v.toString(); } - + public Version(String pluginName) { + this.plugin = null; + if (pluginName.equalsIgnoreCase("net.minecraft.server")) { + try { + this.version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; + } catch (ArrayIndexOutOfBoundsException ex) { + this.version = "vpre"; + } + return; + } this.plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginName); this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); } - - public static Version getPlugin(String pluginName) { + + public Version(Server server) { + this.plugin = null; + this.version = server.getBukkitVersion(); + } + + public Version(Plugin plugin) { + this.plugin = (plugin == null) ? null : plugin; + this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); + } + + public static Version getVersion(Plugin plugin) { + return new Version(plugin); + } + + public static Version getVersion(String pluginName) { return new Version(pluginName); } - - public static Version getServer() { - return new Version(); + + public static Version getServerVersion() { + return new Version(Bukkit.getServer()); + } + + public static Version getNmsVersion() { + return new Version("net.minecraft.server"); + } + + public Plugin getPlugin() { + return (plugin == null) ? null : plugin; } - + public boolean isEnabled() { if (this.plugin != null) { return this.plugin.isEnabled(); @@ -45,7 +80,7 @@ public boolean isEnabled() { } return false; // Plugin mis-spelled or not installed on the server. } - + /** * @param minVersion - The absolute minimum version that's required to achieve compatibility. * @return Greater than or equal to will return true. Otherwise, false. @@ -55,10 +90,10 @@ public boolean isCompatible(String minVersion) { int x = compareTo(minVersion); if (x >= 0) { return true; - } + } return false; } - + /** * @param maxVersion - The absolute maximum version that's supported. * @return Less than or equal to will return true. Otherwise, false. @@ -74,36 +109,36 @@ public boolean isSupported(String maxVersion) { @Override public int compareTo(String whichVersion) { - int[] current = parseVersion(this.version); - int[] min = parseVersion(whichVersion); - int length = (current.length >= min.length) ? current.length : min.length; + int[] currentVersion = parseVersion(this.version); + int[] otherVersion = parseVersion(whichVersion); + int length = (currentVersion.length >= otherVersion.length) ? currentVersion.length : otherVersion.length; for (int index = 0; index <= (length - 1); index = index + 1) { try { - if (current[index] != min[index]) { - if (current[index] > min[index]) { + if (currentVersion[index] != otherVersion[index]) { + if (currentVersion[index] > otherVersion[index]) { return 1; } else { return -1; } } } catch (IndexOutOfBoundsException ex) { - if (current.length > min.length) { + if (currentVersion.length > otherVersion.length) { return 1; - } else if (current.length < min.length) { + } else if (currentVersion.length < otherVersion.length) { return -1; } } } return 0; } - + /** - * A typical version of 1.2.3.4-b567 will be broken down into an array of length five.

- * + * A typical version of 1.2.3.4-b567 will be broken down into an array.

+ * * [1] [2] [3] [4] [567] */ private int[] parseVersion(String version) { - String[] stringArray = version.split("[.-]"); + String[] stringArray = version.split(separator); int[] temp = new int[stringArray.length]; for (int index = 0; index <= (stringArray.length - 1); index = index + 1) { String t = stringArray[index].replaceAll("\\D", ""); @@ -115,10 +150,60 @@ private int[] parseVersion(String version) { } return temp; } - + + public Version setSeparator(String regex) { + this.separator = regex; + return this; + } + + public int length() { + return (version == null) ? 0 : version.length(); + } + + /** + * equalsIgnoreCase(). + */ + public boolean equals(String s) { + String v = (version == null) ? "" : version; + return s.equalsIgnoreCase(v); + } + + public boolean contains(CharSequence s) { + return (version == null) ? false : version.contains(s); + } + + /** + * search() for possible Development builds. + */ + public boolean search(String regex) { + if (version == null) return false; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(this.version); + if (matcher.find()) { + return true; + } + return false; + } + + public Version getSubVersion(String regex) { + if (version == null) return this; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(this.version); + if (matcher.find()) { + String dev = matcher.group(); + return new Version(this).setVersion(dev); + } + return this; + } + + private Version setVersion(String subVersion) { + this.version = subVersion; + return this; + } + @Override public String toString() { String v = (this.version == null) ? "" : this.version; return v; } -} \ No newline at end of file +} From 090380c92181fce6d5e857216aab05d5495d5211 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 26 Jul 2014 15:52:59 -0500 Subject: [PATCH 12/74] Fixed object type Version NMS; to String NMS; To-Do: Fix BlockPlaceEvent() works in v1.5.3 breaks in v1.5.6 --- .../src/main/java/mc/alk/virtualplayers/VirtualPlayers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 413b728..039f8d4 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -15,11 +15,11 @@ public class VirtualPlayers extends JavaPlugin implements Listener Version server; public static final String MAX = "1.7.10-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; - Version NMS; + String NMS; @Override public void onEnable() { - NMS = Version.getNmsVersion(); + NMS = Version.getNmsVersion().toString(); server = Version.getServerVersion(); if (!server.isSupported(MAX) || !server.isCompatible(MIN)) { getLogger().info("VirtualPlayers is not compatible with your server."); From ecf56369df91d39e9ae3cd164187b57a61b8af38 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 27 Jul 2014 11:01:48 -0500 Subject: [PATCH 13/74] Fixed pom.xml relative directory reference. The Ant script now copies the JAR the correct directory: ~/projects/server/plugins/VirtualPlayers.jar This is a Test Server that is shared by all projects. --- modules/VirtualPlayers/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 4c9b209..11d30f8 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -205,7 +205,7 @@ maven-antrun-plugin - + From 4f8b4933006dd6dbcac90ed9670fb276af89223a Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 27 Jul 2014 11:04:50 -0500 Subject: [PATCH 14/74] Fixed cmd bpe ./dc bpe Fixed the BlockPlaceEvent command. This cmd works in v1.5.3 But it breaks in v1.5.6 Fixed in v1.5.10 --- .../nms/v1_4_5/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_4_6/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_4_R1/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_5_R1/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_5_R2/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_5_R3/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_6_R1/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_6_R2/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_6_R3/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_7_R1/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_7_R2/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_7_R3/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/v1_7_R4/CustomCommandExecutor.java | 12 ++++++++++++ .../nms/vpre/CustomCommandExecutor.java | 12 ++++++++++++ 14 files changed, 168 insertions(+) diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java index df2d539..0c388b2 100644 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java index 1e98a1d..d1717c6 100644 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java index ea38d02..5142043 100644 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java index 9771855..6132c6b 100644 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java index f9de5e5..a638486 100644 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java index 4943a16..9f93945 100644 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java index 94d5c27..5d78426 100644 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java index c5aaaf1..8c4d4ad 100644 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java index 57e76eb..7eb4e9c 100644 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java index 96e800d..6ae7f3d 100644 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -517,10 +518,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java index 8caa14f..7968812 100644 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -517,10 +518,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java index 2588b03..7e55d67 100644 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java index 154d788..569075e 100644 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java index e560f45..b563118 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.Command; @@ -516,10 +517,21 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command return verifyGameMode(string); } else if (ItemStack.class == clazz) { return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); } return null; } + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { ItemStack is = InventoryUtil.getItemStack(args[curIndex]); if (is == null){ From 14c901e77746574b215f40b026ae09c6591a8b6a Mon Sep 17 00:00:00 2001 From: Europia79 Date: Mon, 28 Jul 2014 20:11:00 -0500 Subject: [PATCH 15/74] Updated README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c65c50..c52c282 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,9 @@ Other Commands Change Log --- - +- **v1.5.10** + * Fixed BlockPlaceEvent command. + * Compatible with 1.2.5 to 1.7.10 - **v1.5.9** * Added backwards compatibility. * You can now use one JAR for all craftbukkit versions. @@ -50,6 +52,7 @@ Change Log - **v1.5.6** * `/dc help`: now shows help * `/dc sneak ` : now sneaks and unsneaks + * Breaks the BlockPlaceEvent cmd: `/dc bpe ` - **v1.4.3** * Fixes for cross world moves - **v1.4.1.1** From 8c9439ce60c2cd3d77d18e0b36c0742ec822c2f3 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 20 Sep 2014 16:12:50 -0500 Subject: [PATCH 16/74] VirtualPlayer no longer implements Listener. also, the implementation for mc.alk.virtualplayers.nms.v1_7_R4.VirtualPlayer:getOnlinePlayers() has changed because Bukkit.getOnlinePlayers() no longer returns an array. --- .../mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java | 2 +- .../mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java index 66eedf8..b83e335 100644 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java @@ -30,7 +30,7 @@ import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; -public class VirtualPlayer extends CraftPlayer implements Listener { +public class VirtualPlayer extends CraftPlayer { Player keepInformed; // / who to send the messages to boolean online = true; diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java index 0c78839..a501bee 100644 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java @@ -20,7 +20,6 @@ import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R4.scoreboard.CraftScoreboard; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -30,7 +29,7 @@ import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; -public class VirtualPlayer extends CraftPlayer implements Listener { +public class VirtualPlayer extends CraftPlayer { Player keepInformed; // / who to send the messages to boolean online = true; @@ -327,7 +326,7 @@ public static Player[] getOnlinePlayers() players.add(p);} } Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); + Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); return (Player[]) ArrayUtils.addAll(ps, bps); } From 26fbb8a36b1ebde65e867887a71d26e8ba332918 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 20 Sep 2014 16:17:53 -0500 Subject: [PATCH 17/74] Forwards any calls to the new package/class. The package structure has changed to a more standarized syntax/notation of all lowercase, and the project name. The new package structure also contains versioned packages. old: mc.alk.virtualPlayer; new: mc.alk.virtualplayers; Any static method calls made to mc.alk.virtualPlayer.VirtualPlayers:* is forwarded to the new class at mc.alk.virtualplayers.VirtualPlayers:* Originally, when I made the change, I didn't realize that other plugins were hooking into the VirtualPlayers code base. I noticed that mc.alk.arena.util.ServerUtil is making such calls. Not sure if anyone else is hooking into VirtualPlayers. But this mapping of the old class to the new class will allow plugins to use newer versions of VirtualPlayers without breaking and without recompiling. --- .../mc/alk/virtualPlayer/VirtualPlayers.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java new file mode 100644 index 0000000..bf17cf5 --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java @@ -0,0 +1,114 @@ +package mc.alk.virtualPlayer; + +import java.util.List; +import java.util.Map; +import org.bukkit.entity.Player; + +/** + * This class maps the old package to the new package.

+ *
+ * old package: mc.alk.virtualPlayer;
+ * new package: mc.alk.virtualplayers;
+ * 
+ * So that old plugins don't have to update to the new package structure.
+ * 
+ * The primary reason for the change is that several of these methods 
+ * contained version dependent code. So they needed to be put into a 
+ * versioned package structure.
+ * 
+ * @author Nikolai + */ +public class VirtualPlayers { + + /** + * Used by mc.alk.arena.util.ServerUtil. + * @param pname + * @return + * @deprecated + */ + @Deprecated + public static Player getPlayer(String pname) + { + return mc.alk.virtualplayers.VirtualPlayers.getPlayer(pname); + } + + @Deprecated + public static Player getPlayerExact(String pname) + { + return mc.alk.virtualplayers.VirtualPlayers.getPlayerExact(pname); + } + + @Deprecated + public static Player getOrMakePlayer(String pname) + { + return mc.alk.virtualplayers.VirtualPlayers.getOrMakePlayer(pname); + } + + @Deprecated + public static Player[] getOnlinePlayers() + { + return mc.alk.virtualplayers.VirtualPlayers.getOnlinePlayers(); + } + + @Deprecated + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + @Deprecated + public static synchronized Player makeVirtualPlayer(String name) throws Exception + { + return mc.alk.virtualplayers.VirtualPlayers.makeVirtualPlayer(name); + } + + /** + * Object parameter needs to be changed to a VirtualPlayer interface. + * @param vp Pass in an instance of VirtualPlayer. + * @return + */ + @Deprecated + public static Player deleteVirtualPlayer(Object vp) + { + return mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(vp); + } + + @Deprecated + public static void deleteVirtualPlayers() + { + mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayers(); + } + + /** + * Moved to mc.alk.virtualplayers.VirtualPlayers:getPlayerList(). + * @return
 {@literal List } 
+ */ + @Deprecated + public static List getPlayerList() { + return (List) mc.alk.virtualplayers.VirtualPlayers.getPlayerList(); + } + + @Deprecated + public static Object getOrCreate(String name) { + return mc.alk.virtualplayers.VirtualPlayers.getOrCreate(name); + } + + /** + * Moved to mc.alk.virtualplayers.VirtualPlayers:getVps(). + * @return
 {@literal Map } 
+ * @deprecated + */ + @Deprecated + public static Map getVps() { + return (Map) mc.alk.virtualplayers.VirtualPlayers.getVps(); + } + + /** + * Moved to mc.alk.virtualplayers.VirtualPlayers:getNames(). + * @return
 {@literal Map } 
+ * @deprecated + */ + @Deprecated + public static Map getNames() { + return (Map) mc.alk.virtualplayers.VirtualPlayers.getNames(); + } +} From 7f1a96c3dcb64797691b9566438d48de8810eb35 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 20 Sep 2014 16:30:22 -0500 Subject: [PATCH 18/74] Re-added old methods that forward calls to the nms package. These methods were originally moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer because they contained version dependent code. The methods were re-added because mc.alk.arena.util.ServerUtil uses them. These new methods simply use reflection to call the correct VirtualPlayer class depending on what Minecraft version the server is running: mc.alk.virtualplayers.nms.{version}.VirtualPlayer.class This was not tested, but it should work. A unit test was written for the invoke(String methodName, Object param) method. The test simply ensures that the correct type of the Object param can be obtained by the JVM. Also, some of these methods contained references to {version}.VirtualPlayer. All VirtualPlayer types were changed to Object. Ultimately, references should be made via some kind of VirtualPlayer interace. But the problem is that getHeatlh() returns an int for older Minecraft versions. And getHealth() returns float/double for newer Minecraft versions. --- .../mc/alk/virtualplayers/VirtualPlayers.java | 161 +++++++++++++++++- 1 file changed, 155 insertions(+), 6 deletions(-) diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 039f8d4..19883d7 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -1,25 +1,30 @@ package mc.alk.virtualplayers; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import mc.alk.virtualplayers.util.Version; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -public class VirtualPlayers extends JavaPlugin implements Listener -{ - Version server; +public class VirtualPlayers extends JavaPlugin { + + private Version server; public static final String MAX = "1.7.10-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; - String NMS; + public static final String NMS = Version.getNmsVersion().toString(); @Override public void onEnable() { - NMS = Version.getNmsVersion().toString(); server = Version.getServerVersion(); if (!server.isSupported(MAX) || !server.isCompatible(MIN)) { getLogger().info("VirtualPlayers is not compatible with your server."); @@ -64,7 +69,7 @@ public void setEventMessages(boolean show){ } } - public Class getNmsClass(String clazz) throws Exception { + public static Class getNmsClass(String clazz) throws Exception { return Class.forName("mc.alk.virtualplayers.nms." + NMS + "." + clazz); } @@ -93,4 +98,148 @@ private void registerCommands() { } } + /** + * Used by mc.alk.arena.util.ServerUtil. + * Implementation moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer: + */ + public static Player getPlayer(String pname) { + return (Player) invoke("getPlayer", pname); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Player getPlayer(UUID id) { + return (Player) invoke("getPlayer", id); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Player getPlayerExact(String pname) { + return (Player) invoke("getPlayerExact", pname); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Player getOrMakePlayer(String pname) { + return (Player) invoke("getOrMakePlayer", pname); + } + + /** + * Used by mc.alk.arena.util.ServerUtil. + * Implementation moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer:getOnlinePlayers(). + */ + public static Player[] getOnlinePlayers() { + return (Player[]) invoke("getOnlinePlayers"); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static synchronized Player makeVirtualPlayer(String name) throws Exception { + return (Player) invoke("makeVirtualPlayer", name); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Player deleteVirtualPlayer(Object vp) { + Player player = null; + Method[] methods = null; + try { + methods = getNmsClass("VirtualPlayer").getDeclaredMethods(); + } catch (Exception ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + for (Method m : methods) { + Class[] params = m.getParameterTypes(); + if (m.getName().equalsIgnoreCase("deleteVirtualPlayer")) { + try { + player = (Player) m.invoke(null, vp); + } catch (IllegalAccessException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (IllegalArgumentException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (InvocationTargetException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + return player; + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static void deleteVirtualPlayers() { + invoke("deleteVirtualPlayers"); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static List getPlayerList() { + return (List) invoke("getPlayerList"); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Object getOrCreate(String name) { + return invoke("getOrCreate", name); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Map getVps() { + return (Map) invoke("getVps"); + } + + /** + * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + */ + public static Map getNames() { + return (Map) invoke("getNames"); + } + + private static Object invoke(String methodName, Object... params) { + Object object = null; + Method method; + try { + if (params == null) { + method = getNmsClass("VirtualPlayer").getDeclaredMethod(methodName); + } else { + Class[] classParams = new Class[params.length]; + for (int index = 0; index < params.length; index = index + 1) { + classParams[index] = params[index].getClass(); + } + method = getNmsClass("VirtualPlayer").getDeclaredMethod(methodName, classParams); + } + object = method.invoke(null, params); + } catch (NoSuchMethodException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (SecurityException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (IllegalArgumentException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (InvocationTargetException ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } catch (Exception ex) { + Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + } + return object; + } + } From 6988883330f862778ae4fe4777daa6449446f400 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 20 Sep 2014 17:44:35 -0500 Subject: [PATCH 19/74] Added test for invoke() All these static methods were so difficult to test because it requires a lot of other objects to be present (like a running server) that I just copied the code over and verified the output. public static void invoker(String methodName, Object... params) Basically, the test just checks that the type of Object params can be deduced at runtime. This type is used and passed to the reflection API in order to invoke() methodName from mc.alk.virtualplayers.nms.{version}.VirtualPlayer.class invoke() only calls static methods. All of this reflection and forwarding of calls was never tested, so please report any bugs by opening a New Issue ticket. Thanks! --- .../mc/alk/virtualPlayer/InvokeTester.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 modules/VirtualPlayers/src/test/java/mc/alk/virtualPlayer/InvokeTester.java diff --git a/modules/VirtualPlayers/src/test/java/mc/alk/virtualPlayer/InvokeTester.java b/modules/VirtualPlayers/src/test/java/mc/alk/virtualPlayer/InvokeTester.java new file mode 100644 index 0000000..7807e90 --- /dev/null +++ b/modules/VirtualPlayers/src/test/java/mc/alk/virtualPlayer/InvokeTester.java @@ -0,0 +1,37 @@ +package mc.alk.virtualPlayer; + +import java.util.UUID; +import junit.framework.TestCase; + +/** + * Checks the class type for unknown parameters. + * + * @author Nikolai + */ +public class InvokeTester extends TestCase { + + public InvokeTester(String testName) { + super(testName); + } + + public static void invoker(String methodName, Object... params) { + System.out.println("params.getClass() = "); + if (params == null) { + } else { + Class[] classParams = new Class[params.length]; + for (int index = 0; index < params.length; index = index + 1) { + classParams[index] = params[index].getClass(); + System.out.println(classParams[index]); + } + } + } + + public void testInvoke() { + String param1 = "something"; + UUID param2 = UUID.randomUUID(); + invoker("someMethod", param1); + invoker("someMethod", param2); + invoker("someMethod", param1, param2); + assertTrue(true); + } +} From 61178d39dd1aa5407752133edd8f553083a95f8d Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 20 Sep 2014 17:51:00 -0500 Subject: [PATCH 20/74] Removed duplicate dependency declaration in pom.xml --- modules/v1_7_R4/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/v1_7_R4/pom.xml b/modules/v1_7_R4/pom.xml index 2633d9c..8a0f1b0 100644 --- a/modules/v1_7_R4/pom.xml +++ b/modules/v1_7_R4/pom.xml @@ -39,12 +39,6 @@ parent true
- - org.bukkit - bukkit - 1.7.5-R0.1-SNAPSHOT - provided - junit junit From 4571980abc31e3464d8b3ffe5cc23661481673ea Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 20 Sep 2014 17:51:56 -0500 Subject: [PATCH 21/74] Added sorting, zero padding, and comments. Bug fix: Padding with zeros fixes a rare bug where the server is running (for example) a plugin with version "1.2.0", and you ask isCompatible("1.2"). In this situation, the compatibility check would fail eventho is shouldn't. I thought of this because BombArena version 1.2.0 is about to be released. Got Permission from DSH105 to use some of his ideas from: com.dsh105.commodus.Version; The article that I read on Comparator/Comparable said to return one, negative one, and zero... But I really like how DSH105 simply returns the difference: very elegent. compareTo(): Also, someone in IRC told me that I should compareTo() other Version objects instead of String objects. Initially, I didn't understand the use-case-scenario, but then I figured out that it could be used for sorting. Eventho, I'll probably never use this particular functionality, I changed it... just in case anyone else wants to use it, (or even me in the future). Technically, I don't think the Version object should know about Plugins or Bukkit Servers, but it is a little convenient for isCompatible() and isSupported() to check for me if a plugin is even enabled. So I might change this in the future... along with the factory methods... Those should probably be in their own class, where the Version object knows nothing about Plugins or Servers, but the VersionFactory does know about them and how to use them to conveniently construct a Version object for the user. Finally, I have several of these Version.class files in different projects that need to be moved to it's own util project. That way, I can declare a dependency on this and other utility classes, and any changes will propagate to other projects. It's on my To-Do List. --- .../mc/alk/virtualplayers/util/Version.java | 154 ++++++++---------- 1 file changed, 68 insertions(+), 86 deletions(-) diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java index 47f3b7c..12d9be9 100644 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java @@ -7,71 +7,78 @@ import org.bukkit.plugin.Plugin; /** - * The Version object: Capable of asking the important question:

- * - * Is the version that's currently installed & running on the server compatible with a specified version ?

- * + * The Version object: Capable of asking the important questions:.

+ * + * Is the version that's currently installed on the server compatible/supported with a specified version ?

+ * * isCompatible(): Is the installed version greater than or equal to the minimum required version ?

- * + * * isSupported(): Is the installed version less than or equal to the maximum required version ?

- * - * @author Europia79, BigTeddy98, Tux2 + * + * @author Europia79, BigTeddy98, Tux2, DSH105 */ -public class Version implements Comparable { +public class Version implements Comparable { + + final Plugin plugin; + final String version; + String separator = "[_.-]"; - Plugin plugin; - String version; - String separator = "[.-]"; - - private Version(Version v) { - this.plugin = v.getPlugin(); - this.version = v.toString(); - } - - public Version(String pluginName) { + /** + * Factory methods getPluginVersion(), getServerVersion(), getNmsVersion() available for convenience.
+ */ + public Version(String version) { + this.version = version; this.plugin = null; - if (pluginName.equalsIgnoreCase("net.minecraft.server")) { - try { - this.version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; - } catch (ArrayIndexOutOfBoundsException ex) { - this.version = "vpre"; - } - return; - } - this.plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginName); - this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); } - + public Version(Server server) { this.plugin = null; this.version = server.getBukkitVersion(); } - + public Version(Plugin plugin) { this.plugin = (plugin == null) ? null : plugin; this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); } - - public static Version getVersion(Plugin plugin) { + + /** + * Factory method used when you want to construct a Version object via a Plugin object.
+ */ + public static Version getPluginVersion(Plugin plugin) { return new Version(plugin); } - - public static Version getVersion(String pluginName) { - return new Version(pluginName); + + /** + * Factory method used when you want to construct a Version object via pluginName.
+ */ + public static Version getPluginVersion(String pluginName) { + return new Version(Bukkit.getPluginManager().getPlugin(pluginName)); } - + + /** + * Factory method to conveniently construct a Version object of the server.
+ */ public static Version getServerVersion() { return new Version(Bukkit.getServer()); } - + + /** + * Factory method to conveniently construct a Version object of net.minecraft.server.v1_X_RY package.
+ */ public static Version getNmsVersion() { - return new Version("net.minecraft.server"); + String NMS = null; + try { + NMS = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; + } catch (ArrayIndexOutOfBoundsException ex) { + NMS = "vpre"; + } + return new Version(NMS); } - + public Plugin getPlugin() { return (plugin == null) ? null : plugin; } - + public boolean isEnabled() { if (this.plugin != null) { return this.plugin.isEnabled(); @@ -80,27 +87,27 @@ public boolean isEnabled() { } return false; // Plugin mis-spelled or not installed on the server. } - + /** * @param minVersion - The absolute minimum version that's required to achieve compatibility. - * @return Greater than or equal to will return true. Otherwise, false. + * @return Return true, if the currently running/installed version is greater than or equal to minVersion. */ public boolean isCompatible(String minVersion) { if (!this.isEnabled()) return false; - int x = compareTo(minVersion); + int x = compareTo(new Version(minVersion)); if (x >= 0) { return true; - } + } return false; } - + /** * @param maxVersion - The absolute maximum version that's supported. - * @return Less than or equal to will return true. Otherwise, false. + * @return Return true, if the currently running/installed version is less than or equal to maxVersion. */ public boolean isSupported(String maxVersion) { if (!this.isEnabled()) return false; - int x = compareTo(maxVersion); + int x = compareTo(new Version(maxVersion)); if (x <= 0) { return true; } @@ -108,33 +115,29 @@ public boolean isSupported(String maxVersion) { } @Override - public int compareTo(String whichVersion) { + public int compareTo(Version whichVersion) { int[] currentVersion = parseVersion(this.version); - int[] otherVersion = parseVersion(whichVersion); + int[] otherVersion = parseVersion(whichVersion.toString()); int length = (currentVersion.length >= otherVersion.length) ? currentVersion.length : otherVersion.length; for (int index = 0; index <= (length - 1); index = index + 1) { try { if (currentVersion[index] != otherVersion[index]) { - if (currentVersion[index] > otherVersion[index]) { - return 1; - } else { - return -1; - } + return currentVersion[index] - otherVersion[index]; } } catch (IndexOutOfBoundsException ex) { if (currentVersion.length > otherVersion.length) { - return 1; + return currentVersion[index] - 0; } else if (currentVersion.length < otherVersion.length) { - return -1; + return 0 - otherVersion[index]; } } } return 0; } - + /** * A typical version of 1.2.3.4-b567 will be broken down into an array.

- * + * * [1] [2] [3] [4] [567] */ private int[] parseVersion(String version) { @@ -150,28 +153,12 @@ private int[] parseVersion(String version) { } return temp; } - + public Version setSeparator(String regex) { this.separator = regex; return this; } - - public int length() { - return (version == null) ? 0 : version.length(); - } - - /** - * equalsIgnoreCase(). - */ - public boolean equals(String s) { - String v = (version == null) ? "" : version; - return s.equalsIgnoreCase(v); - } - - public boolean contains(CharSequence s) { - return (version == null) ? false : version.contains(s); - } - + /** * search() for possible Development builds. */ @@ -184,23 +171,18 @@ public boolean search(String regex) { } return false; } - + public Version getSubVersion(String regex) { if (version == null) return this; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(this.version); + String dev = this.version; if (matcher.find()) { - String dev = matcher.group(); - return new Version(this).setVersion(dev); + dev = matcher.group(); } - return this; - } - - private Version setVersion(String subVersion) { - this.version = subVersion; - return this; + return new Version(dev); } - + @Override public String toString() { String v = (this.version == null) ? "" : this.version; From e221bb983512fded941ffa6b6421001cdddc3147 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 24 Sep 2014 19:11:06 -0500 Subject: [PATCH 22/74] Changed repository battleplugins-repo is down. moved everything to the rainbowcraft-repo --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a7e5dae..af90fc1 100644 --- a/pom.xml +++ b/pom.xml @@ -31,8 +31,8 @@ - battleplugins-repo - http://server.battleplugins.com/maven/repository/ + rainbowcraft-repo + http://rainbowcraft.sytes.net/maven/repository/ bukkit-repo From be9ca3d1ad4b397bb78e29f78c28a25c6fec3fa9 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 24 Sep 2014 19:12:57 -0500 Subject: [PATCH 23/74] Changed repo. Added wagon. The battleplugins-repo server went down so I moved everything to the rainbowcraft-repo. The ssh wagon has the connector that allows deployments to be made to the repo. Instructions here: http://maven.apache.org/guides/mini/guide-encryption.html Basically, just use maven commands to make an encrypted master password: mvn --encrypt-master-password $> ********* Put this encrypted password into ~/.m2/settings-security.xml {jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=} Then do mvn --encrypt-password $> ******* Put it into your settings.xml on your computer. There's 3 of them: - one on the remote server reposity (not on your computer) - a global one inside the maven installation directory /conf/ folder - a per user one inside HOME/.m2/settings.xml Put your encrypted password and username into your settings.xml : rainbowcraft-repo root {COQLCE6DU6GtcS5P=} And now, distributionManagement and the ssh wagon will use the information contained in your settings.xml to connect to the server and deploy your build to the rainbowcraft-repo --- modules/VirtualPlayers/pom.xml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 11d30f8..5820e25 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.5.10 + 1.6.0-SNAPSHOT jar VirtualPlayers @@ -136,6 +136,13 @@ VirtualPlayers ./target ./src/main/java + + + org.apache.maven.wagon + wagon-ssh + 2.6 + + . @@ -219,4 +226,10 @@ + + + rainbowcraft-repo + scp://23.29.127.102/var/www/maven/repository + + From 91aac4babf6ccd313bb667ea796b3c832edc247e Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 24 Sep 2014 19:27:15 -0500 Subject: [PATCH 24/74] Added getPlayer(UUID id) --- .../src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java index bf17cf5..ac99e00 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Map; +import java.util.UUID; import org.bukkit.entity.Player; /** @@ -31,6 +32,12 @@ public static Player getPlayer(String pname) { return mc.alk.virtualplayers.VirtualPlayers.getPlayer(pname); } + + @Deprecated + public static Player getPlayer(UUID id) + { + return mc.alk.virtualplayers.VirtualPlayers.getPlayer(id); + } @Deprecated public static Player getPlayerExact(String pname) From 14fa1b613c7d52cf03d34f5c0957ed9d626fc5e9 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 26 Sep 2014 23:18:45 -0500 Subject: [PATCH 25/74] Fixed an issue that was causing a Jenkins build error. --- modules/v1_7_R4/pom.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/v1_7_R4/pom.xml b/modules/v1_7_R4/pom.xml index 8a0f1b0..0aca778 100644 --- a/modules/v1_7_R4/pom.xml +++ b/modules/v1_7_R4/pom.xml @@ -29,9 +29,8 @@ org.bukkit craftbukkit - 1.7.10-R0.1-SNAPSHOT - system - C:/Users/Nikolai/Documents/lib/bukkit/1.7.10/craftbukkit.jar + 1.7.10-R0.1 + provided mc.alk From 3b326773d5e20ad2a06381aef9bb12300e61de66 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 26 Sep 2014 23:35:42 -0500 Subject: [PATCH 26/74] Fixed issue with Jenkins and maven. --- modules/vpre/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml index ffb29d5..7907d91 100644 --- a/modules/vpre/pom.xml +++ b/modules/vpre/pom.xml @@ -23,7 +23,7 @@ org.bukkit craftbukkit - 1.3.2-R3.0 + 1.3.2-R2.0 provided From 442b15ca1666d9dd3b695b4190fce245684dd67b Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 26 Sep 2014 23:39:47 -0500 Subject: [PATCH 27/74] Fixed an issue with jenkins and maven. --- modules/v1_5_R1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml index e8f9c33..4e677d9 100644 --- a/modules/v1_5_R1/pom.xml +++ b/modules/v1_5_R1/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.5-R0.1-SNAPSHOT + 1.5.0-R0.1 provided From 8992db2ddf95869e367bff8f0b9dd13d19dafcd0 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 26 Sep 2014 23:43:01 -0500 Subject: [PATCH 28/74] Fixed an issue with jenkins and maven. --- modules/v1_6_R1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml index 53a9534..bd40408 100644 --- a/modules/v1_6_R1/pom.xml +++ b/modules/v1_6_R1/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.6.1-R0.1-SNAPSHOT + 1.6.1-R0.1 provided From 1b700394781a29f3fae72219770af7659c8a60b6 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 26 Sep 2014 23:46:18 -0500 Subject: [PATCH 29/74] Fixed an issue with jenkins and maven. --- modules/v1_7_R2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml index 1a42a30..b1b2698 100644 --- a/modules/v1_7_R2/pom.xml +++ b/modules/v1_7_R2/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.7.5-R0.1-SNAPSHOT + 1.7.5-R0.1 provided From 432750d3e9a6a71f1586c75b5d476a6d006223f4 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 27 Sep 2014 00:08:51 -0500 Subject: [PATCH 30/74] Added repo --- modules/VirtualPlayers/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 5820e25..53be409 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -13,6 +13,13 @@ UTF-8 + + + + bukkit-repo + http://repo.bukkit.org/content/groups/public/ + + From 0b48c8abb13968fe76360c217911fcc503850958 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Fri, 12 Dec 2014 18:11:44 -0600 Subject: [PATCH 31/74] Updated to Minecraft 1.8 renamed package: mc.alk.virtualplayers.nms.vpre; to mc.alk.virtualplayers.nms.pre; Still need to add the updates for the PlayerPickupItemEvent --- README.md | 63 +- modules/VirtualPlayers/pom.xml | 41 +- .../VirtualPlayers/src/main/java/plugin.yml | 3 +- .../mc/alk/virtualplayers/util/Version.java | 191 ----- .../nms/v1_7_R1/CustomCommandExecutor.java | 1 - .../nms/v1_7_R2/CustomCommandExecutor.java | 1 - modules/v1_8_R1/pom.xml | 64 ++ .../nms/v1_8_R1/CustomCommandExecutor.java | 772 ++++++++++++++++++ .../nms/v1_8_R1/PlayerExecutor.java | 451 ++++++++++ .../nms/v1_8_R1/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_8_R1/Util.java | 58 ++ .../nms/v1_8_R1/VPBaseExecutor.java | 115 +++ .../nms/v1_8_R1/VPExecutor.java | 74 ++ .../nms/v1_8_R1/VirtualPlayer.java | 415 ++++++++++ .../{vpre => pre}/CustomCommandExecutor.java | 2 +- .../nms/{vpre => pre}/PlayerExecutor.java | 2 +- .../nms/{vpre => pre}/PlayerListener.java | 2 +- .../nms/{vpre => pre}/Util.java | 2 +- .../nms/{vpre => pre}/VPBaseExecutor.java | 2 +- .../nms/{vpre => pre}/VPExecutor.java | 2 +- .../nms/{vpre => pre}/VirtualPlayer.java | 22 +- pom.xml | 3 +- 22 files changed, 2103 insertions(+), 238 deletions(-) delete mode 100644 modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java create mode 100644 modules/v1_8_R1/pom.xml create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VirtualPlayer.java rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/CustomCommandExecutor.java (99%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/PlayerExecutor.java (99%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/PlayerListener.java (97%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/Util.java (97%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/VPBaseExecutor.java (98%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/VPExecutor.java (98%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/{vpre => pre}/VirtualPlayer.java (94%) diff --git a/README.md b/README.md index c52c282..1297607 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,28 @@ VirtualPlayers2 was made for developers who need to easily test their plugins against multiple versions of craftbukkit. +Downloads: +--- + +**Official builds** + +You can find the official builds at dev.bukkit.org + +[http://dev.bukkit.org/bukkit-plugins/virtualplayers2/] (http://dev.bukkit.org/bukkit-plugins/virtualplayers2/ "Official builds") + + +**Development builds** + +```python +"Development builds of this project can be acquired at the provided continuous integration server." +"These builds have not been approved by the BukkitDev staff. Use them at your own risk." +``` + +[http://ci.battleplugins.com/job/VirtualPlayers/](http://ci.battleplugins.com/job/VirtualPlayers/ "dev builds") + +The dev builds are primarily for testing purposes. + + Commands as Players --- @@ -29,6 +51,7 @@ Commands as Players |`dc interact ` | do a PlayerInteractEvent on the specified block location | |`/dc bpe ` | do a BlockPlaceEvent of the given material at the given location | |`/dc bbe ` | do a BlockBreakEvent at the given location | +|`/dc pie | Trigger a PlayerPickupItemEvent | Other Commands @@ -42,6 +65,12 @@ Other Commands Change Log --- +- **v1.6.2** + * Updated to Minecraft 1.8 compatibility. +- **v1.6.0** + * Added PIE command (PlayerPickupItemEvent) + * `/dc vp pie` will trigger a PlayerPickupItemEvent. + * The VirtualPlayer will pickup items on the ground at his/her location. - **v1.5.10** * Fixed BlockPlaceEvent command. * Compatible with 1.2.5 to 1.7.10 @@ -75,42 +104,14 @@ Change Log - **v1.2.0** * Add ability for virtual players to fire AsyncPlayerChat events by the use of `/dc chat ` - -Downloads: ---- - -**Official builds** - -You can find the official builds at dev.bukkit.org - -[http://dev.bukkit.org/bukkit-plugins/virtualplayers/] (http://dev.bukkit.org/bukkit-plugins/virtualplayers/ "Official builds") - - -**Development builds** - -```python -"Development builds of this project can be acquired at the provided continuous integration server." -"These builds have not been approved by the BukkitDev staff. Use them at your own risk." -``` - -[http://ci.battleplugins.com/job/VirtualPlayers/](http://ci.battleplugins.com/job/VirtualPlayers/ "dev builds") - -The dev builds are primarily for testing purposes. - Contact: ====== -[Author: alkarin](https://github.com/alkarinv/VirtualPlayers "alkarin/VirtualPlayers") - -[alkarin on IRC](http://webchat.esper.net/?nick=&channels=battleplugins "battleplugins IRC") - -Conversion to a Maven multi-module project [by Europia79](http://dev.bukkit.org/profiles/Europia79 "Europia79 on dev.bukkit.org") +* [Europia79](http://dev.bukkit.org/profiles/Europia79 "Europia79 on dev.bukkit.org") -Javadocs ---- - -[http://ci.battleplugins.com/job/VirtualPlayers/javadoc/](http://ci.battleplugins.com/job/VirtualPlayers/javadoc/ "javadocs") +* Skype: Nicodemis79 +* Email: Europia79@hotmail.com diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 53be409..dc021a8 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.0-SNAPSHOT + 1.6.2 jar VirtualPlayers @@ -28,6 +28,12 @@ 1.7.2-R0.3 provided + + mc.euro + Version + 1.1.1 + compile + mc.alk vp-util @@ -132,6 +138,13 @@ jar true + + mc.alk + vp-v1_8_R1 + parent + jar + true + junit junit @@ -140,7 +153,7 @@ - VirtualPlayers + VirtualPlayers2 ./target ./src/main/java @@ -198,7 +211,7 @@ org.apache.maven.plugins maven-shade-plugin - 1.4 + 2.3 package @@ -206,11 +219,29 @@ shade + false - mc.alk:vp-* + mc.alk:* + mc.euro:Version + + + mc.euro.version + mc.alk.virtualplayers.version + + + + + *:* + + META-INF/*.* + META-INF/**/*.* + META-INF/**/* + + + @@ -219,7 +250,7 @@ maven-antrun-plugin - + diff --git a/modules/VirtualPlayers/src/main/java/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml index 0464d77..3625765 100644 --- a/modules/VirtualPlayers/src/main/java/plugin.yml +++ b/modules/VirtualPlayers/src/main/java/plugin.yml @@ -1,8 +1,9 @@ name: ${project.name} version: ${project.version} -authors: [Alkarin] +authors: [Alkarin, Europia79] description: Create Virtualplayers for debugging or running commands otherwise unavailable from the console main: mc.alk.virtualplayers.VirtualPlayers +website: https://github.com/Europia79/VirtualPlayers commands: virtualplayers: aliases: [vp,virtualplayer] diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java deleted file mode 100644 index 12d9be9..0000000 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/Version.java +++ /dev/null @@ -1,191 +0,0 @@ -package mc.alk.virtualplayers.util; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.bukkit.Bukkit; -import org.bukkit.Server; -import org.bukkit.plugin.Plugin; - -/** - * The Version object: Capable of asking the important questions:.

- * - * Is the version that's currently installed on the server compatible/supported with a specified version ?

- * - * isCompatible(): Is the installed version greater than or equal to the minimum required version ?

- * - * isSupported(): Is the installed version less than or equal to the maximum required version ?

- * - * @author Europia79, BigTeddy98, Tux2, DSH105 - */ -public class Version implements Comparable { - - final Plugin plugin; - final String version; - String separator = "[_.-]"; - - /** - * Factory methods getPluginVersion(), getServerVersion(), getNmsVersion() available for convenience.
- */ - public Version(String version) { - this.version = version; - this.plugin = null; - } - - public Version(Server server) { - this.plugin = null; - this.version = server.getBukkitVersion(); - } - - public Version(Plugin plugin) { - this.plugin = (plugin == null) ? null : plugin; - this.version = (plugin == null) ? null : plugin.getDescription().getVersion(); - } - - /** - * Factory method used when you want to construct a Version object via a Plugin object.
- */ - public static Version getPluginVersion(Plugin plugin) { - return new Version(plugin); - } - - /** - * Factory method used when you want to construct a Version object via pluginName.
- */ - public static Version getPluginVersion(String pluginName) { - return new Version(Bukkit.getPluginManager().getPlugin(pluginName)); - } - - /** - * Factory method to conveniently construct a Version object of the server.
- */ - public static Version getServerVersion() { - return new Version(Bukkit.getServer()); - } - - /** - * Factory method to conveniently construct a Version object of net.minecraft.server.v1_X_RY package.
- */ - public static Version getNmsVersion() { - String NMS = null; - try { - NMS = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; - } catch (ArrayIndexOutOfBoundsException ex) { - NMS = "vpre"; - } - return new Version(NMS); - } - - public Plugin getPlugin() { - return (plugin == null) ? null : plugin; - } - - public boolean isEnabled() { - if (this.plugin != null) { - return this.plugin.isEnabled(); - } else if (this.version != null) { // No plugin, but object is a version checker for the server - return true; - } - return false; // Plugin mis-spelled or not installed on the server. - } - - /** - * @param minVersion - The absolute minimum version that's required to achieve compatibility. - * @return Return true, if the currently running/installed version is greater than or equal to minVersion. - */ - public boolean isCompatible(String minVersion) { - if (!this.isEnabled()) return false; - int x = compareTo(new Version(minVersion)); - if (x >= 0) { - return true; - } - return false; - } - - /** - * @param maxVersion - The absolute maximum version that's supported. - * @return Return true, if the currently running/installed version is less than or equal to maxVersion. - */ - public boolean isSupported(String maxVersion) { - if (!this.isEnabled()) return false; - int x = compareTo(new Version(maxVersion)); - if (x <= 0) { - return true; - } - return false; - } - - @Override - public int compareTo(Version whichVersion) { - int[] currentVersion = parseVersion(this.version); - int[] otherVersion = parseVersion(whichVersion.toString()); - int length = (currentVersion.length >= otherVersion.length) ? currentVersion.length : otherVersion.length; - for (int index = 0; index <= (length - 1); index = index + 1) { - try { - if (currentVersion[index] != otherVersion[index]) { - return currentVersion[index] - otherVersion[index]; - } - } catch (IndexOutOfBoundsException ex) { - if (currentVersion.length > otherVersion.length) { - return currentVersion[index] - 0; - } else if (currentVersion.length < otherVersion.length) { - return 0 - otherVersion[index]; - } - } - } - return 0; - } - - /** - * A typical version of 1.2.3.4-b567 will be broken down into an array.

- * - * [1] [2] [3] [4] [567] - */ - private int[] parseVersion(String version) { - String[] stringArray = version.split(separator); - int[] temp = new int[stringArray.length]; - for (int index = 0; index <= (stringArray.length - 1); index = index + 1) { - String t = stringArray[index].replaceAll("\\D", ""); - try { - temp[index] = Integer.valueOf(t); - } catch(NumberFormatException ex) { - temp[index] = 0; - } - } - return temp; - } - - public Version setSeparator(String regex) { - this.separator = regex; - return this; - } - - /** - * search() for possible Development builds. - */ - public boolean search(String regex) { - if (version == null) return false; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(this.version); - if (matcher.find()) { - return true; - } - return false; - } - - public Version getSubVersion(String regex) { - if (version == null) return this; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(this.version); - String dev = this.version; - if (matcher.find()) { - dev = matcher.group(); - } - return new Version(dev); - } - - @Override - public String toString() { - String v = (this.version == null) ? "" : this.version; - return v; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java index 6ae7f3d..123607c 100644 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java @@ -35,7 +35,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; -import mc.alk.virtualplayers.nms.v1_7_R1.VirtualPlayer; /** * @author alkarin diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java index 7968812..8049ac6 100644 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java @@ -35,7 +35,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; -import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; /** * @author alkarin diff --git a/modules/v1_8_R1/pom.xml b/modules/v1_8_R1/pom.xml new file mode 100644 index 0000000..31b732f --- /dev/null +++ b/modules/v1_8_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_8_R1 + parent + jar + + virtualplayers-v1_8_R1 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.8.0-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_8_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java new file mode 100644 index 0000000..e4b64f6 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java @@ -0,0 +1,772 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import mc.alk.virtualplayers.util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); + } + return null; + } + + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java new file mode 100644 index 0000000..2dc081c --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java @@ -0,0 +1,451 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import mc.alk.virtualplayers.util.InventoryUtil; +import net.minecraft.server.v1_8_R1.DamageSource; +import net.minecraft.server.v1_8_R1.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.ChatColor; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin p) { + super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); + super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + + } + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) { + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + } + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) { + continue; + } + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak) { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + + System.out.println("sender = " + sender.getName()); + System.out.println("vp = " + vp.getName()); + System.out.println("args = " + args.toString()); + System.out.println("players = " + players.toString()); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; + sendMessage(sender, message); + // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) { + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent event = new EntityDamageEvent( + damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damagee.getHealth() - h); + /* + EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, + null, + null); */ + if (!event.isCancelled() || force) { + damagee.setLastDamageCause(event); + damagee.setHealth(damagee.getHealth() - event.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = new EntityDamageByEntityEvent( + damager, damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damage); + /* + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((Entity) ((CraftPlayer) damager).getHandle()), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + */ + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc", "disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { + vp.setOnline(connecting); + if (connecting) { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() { + @Override + public void run() { + try { + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex) {/* say nothing */ + + } + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable() { + @Override + public void run() { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex) {/* do nothing */ + + } + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent(playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } else { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java new file mode 100644 index 0000000..dfdf0e6 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java new file mode 100644 index 0000000..d12ca6a --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java new file mode 100644 index 0000000..fcef908 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java new file mode 100644 index 0000000..74db145 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import org.bukkit.command.CommandSender; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VirtualPlayer.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VirtualPlayer.java new file mode 100644 index 0000000..f539884 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VirtualPlayer.java @@ -0,0 +1,415 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import com.mojang.authlib.GameProfile; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_8_R1.EntityPlayer; +import net.minecraft.server.v1_8_R1.MinecraftServer; +import net.minecraft.server.v1_8_R1.PlayerInteractManager; +import net.minecraft.server.v1_8_R1.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R1.CraftServer; +import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_8_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static Player getPlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = names.get(pname); + } + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) { + vp = vps.get(id); + } + return vp; + } + + public static Player getPlayerExact(String pname) { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) { + vp = names.get(pname); + } + return vp; + } + + public static Player getOrMakePlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = names.get(pname); + } + if (vp == null) { + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() { + List players = new ArrayList(); + for (Player p : vps.values()) { + if (p.isOnline()) { + players.add(p); + } + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() { + for (VirtualPlayer vp : vps.values()) { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try { + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java similarity index 99% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java index b563118..91e7bfa 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/CustomCommandExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java similarity index 99% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java index 0fd7187..722086a 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import mc.alk.virtualplayers.util.InventoryUtil; import net.minecraft.server.DamageSource; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java similarity index 97% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java index 17b6abe..8f2a19c 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/PlayerListener.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java similarity index 97% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java index e07b026..0ec6021 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/Util.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java similarity index 98% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java index 0873de4..8c77d31 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPBaseExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java similarity index 98% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java index bf0c64f..de325eb 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VPExecutor.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java @@ -1,4 +1,4 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VirtualPlayer.java similarity index 94% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VirtualPlayer.java index ae259f5..12f4bb0 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/vpre/VirtualPlayer.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VirtualPlayer.java @@ -1,6 +1,7 @@ -package mc.alk.virtualplayers.nms.vpre; +package mc.alk.virtualplayers.nms.pre; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,6 +24,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; public class VirtualPlayer extends CraftPlayer { @@ -56,6 +58,24 @@ public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { public InventoryView openInventory(Inventory inv) { return null; } + + /** Needs to be fixed: Generating errors. */ + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + /** Needs to be fixed: Generating errors. */ + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + /** Needs to be fixed: Generating errors. */ + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } @Override public void removePotionEffect(PotionEffectType effect) { diff --git a/pom.xml b/pom.xml index af90fc1..9543fae 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ parent pom VirtualPlayers Parent POM - http://github.com/alkarinv/VirtualPlayers + https://github.com/Europia79/VirtualPlayers MMdd UTF-8 @@ -27,6 +27,7 @@ modules/v1_7_R2 modules/v1_7_R3 modules/v1_7_R4 + modules/v1_8_R1 modules/VirtualPlayers From 4a30efe31c1ca351ad878c7de330968b723c1e62 Mon Sep 17 00:00:00 2001 From: Techcable Date: Thu, 22 Jan 2015 22:02:41 -0700 Subject: [PATCH 32/74] Switch to valid version of Minecraft 1.5 Looking at craftbukkit commit [83d29e461c](https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/commits/83d29e461c), it appears that the correct version is 1.5-R0.1-SNAPSHOT. A quick look at the craftbukkit versions available in [md-5 repo])(http://repo.md-5.net/content/groups/public/org/bukkit/craftbukkit/) confirms it. --- modules/v1_5_R1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml index 4e677d9..e8f9c33 100644 --- a/modules/v1_5_R1/pom.xml +++ b/modules/v1_5_R1/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.5.0-R0.1 + 1.5-R0.1-SNAPSHOT provided From 67a90a2af0a2c1ce00f03be5ebee61ef98ba8e1f Mon Sep 17 00:00:00 2001 From: Techcable Date: Mon, 23 Mar 2015 15:28:17 -0700 Subject: [PATCH 33/74] Update to minecraft 1.8.3 --- .gitignore | 2 + modules/v1_8_R2/pom.xml | 64 ++ .../nms/v1_8_R2/CustomCommandExecutor.java | 772 ++++++++++++++++++ .../nms/v1_8_R2/PlayerExecutor.java | 451 ++++++++++ .../nms/v1_8_R2/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_8_R2/Util.java | 58 ++ .../nms/v1_8_R2/VPBaseExecutor.java | 115 +++ .../nms/v1_8_R2/VPExecutor.java | 74 ++ .../nms/v1_8_R2/VirtualPlayer.java | 415 ++++++++++ 9 files changed, 2006 insertions(+) create mode 100644 .gitignore create mode 100644 modules/v1_8_R2/pom.xml create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VirtualPlayer.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bccace6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +#Maven +/**/target/ diff --git a/modules/v1_8_R2/pom.xml b/modules/v1_8_R2/pom.xml new file mode 100644 index 0000000..bfe895e --- /dev/null +++ b/modules/v1_8_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_8_R2 + parent + jar + + virtualplayers-v1_8_R2 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.8.3-R0.1-SNAPSHOT + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_8_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java new file mode 100644 index 0000000..520beed --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java @@ -0,0 +1,772 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import mc.alk.virtualplayers.util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); + } + return null; + } + + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java new file mode 100644 index 0000000..46733c5 --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java @@ -0,0 +1,451 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import mc.alk.virtualplayers.util.InventoryUtil; +import net.minecraft.server.v1_8_R2.DamageSource; +import net.minecraft.server.v1_8_R2.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.ChatColor; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin p) { + super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); + super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + + } + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) { + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + } + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) { + continue; + } + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak) { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + + System.out.println("sender = " + sender.getName()); + System.out.println("vp = " + vp.getName()); + System.out.println("args = " + args.toString()); + System.out.println("players = " + players.toString()); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; + sendMessage(sender, message); + // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) { + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent event = new EntityDamageEvent( + damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damagee.getHealth() - h); + /* + EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, + null, + null); */ + if (!event.isCancelled() || force) { + damagee.setLastDamageCause(event); + damagee.setHealth(damagee.getHealth() - event.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = new EntityDamageByEntityEvent( + damager, damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damage); + /* + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((Entity) ((CraftPlayer) damager).getHandle()), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + */ + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc", "disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { + vp.setOnline(connecting); + if (connecting) { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() { + @Override + public void run() { + try { + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex) {/* say nothing */ + + } + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable() { + @Override + public void run() { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex) {/* do nothing */ + + } + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent(playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } else { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java new file mode 100644 index 0000000..983da80 --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java new file mode 100644 index 0000000..bdd11db --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java new file mode 100644 index 0000000..ec34432 --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java new file mode 100644 index 0000000..a7d223e --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import org.bukkit.command.CommandSender; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VirtualPlayer.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VirtualPlayer.java new file mode 100644 index 0000000..42fd2a3 --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VirtualPlayer.java @@ -0,0 +1,415 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import com.mojang.authlib.GameProfile; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_8_R2.EntityPlayer; +import net.minecraft.server.v1_8_R2.MinecraftServer; +import net.minecraft.server.v1_8_R2.PlayerInteractManager; +import net.minecraft.server.v1_8_R2.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R2.CraftServer; +import org.bukkit.craftbukkit.v1_8_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_8_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static Player getPlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = names.get(pname); + } + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) { + vp = vps.get(id); + } + return vp; + } + + public static Player getPlayerExact(String pname) { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) { + vp = names.get(pname); + } + return vp; + } + + public static Player getOrMakePlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = names.get(pname); + } + if (vp == null) { + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() { + List players = new ArrayList(); + for (Player p : vps.values()) { + if (p.isOnline()) { + players.add(p); + } + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() { + for (VirtualPlayer vp : vps.values()) { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try { + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} From 0cb80934325b7b5ffcb37138b49e47c8489e3689 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 17 Jun 2015 17:55:26 -0500 Subject: [PATCH 34/74] Override PotionEffects --- .../nms/v1_4_5/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_4_6/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_4_R1/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_5_R1/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_5_R2/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_5_R3/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_6_R1/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_6_R2/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_6_R3/VirtualPlayer.java | 19 +++++++++++++++++++ .../nms/v1_7_R1/VirtualPlayer.java | 17 +++++++++++++++++ .../nms/v1_7_R2/VirtualPlayer.java | 17 +++++++++++++++++ .../nms/v1_7_R3/VirtualPlayer.java | 17 +++++++++++++++++ .../nms/v1_7_R4/VirtualPlayer.java | 17 +++++++++++++++++ 13 files changed, 239 insertions(+) diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java index a41f22a..562ecf4 100644 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_4_5; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.ItemInWorldManager; import net.minecraft.server.v1_4_5.MinecraftServer; import net.minecraft.server.v1_4_5.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -23,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; public class VirtualPlayer extends CraftPlayer { @@ -57,6 +61,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java index bc46c99..da86ee6 100644 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_4_6; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.MinecraftServer; import net.minecraft.server.v1_4_6.PlayerInteractManager; import net.minecraft.server.v1_4_6.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -23,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; public class VirtualPlayer extends CraftPlayer { @@ -57,6 +61,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java index 02bf915..88444a6 100644 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_4_R1; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.MinecraftServer; import net.minecraft.server.v1_4_R1.PlayerInteractManager; import net.minecraft.server.v1_4_R1.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -23,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; public class VirtualPlayer extends CraftPlayer { @@ -57,6 +61,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java index 244f071..9396f66 100644 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_5_R1; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_5_R1.EntityPlayer; import net.minecraft.server.v1_5_R1.MinecraftServer; import net.minecraft.server.v1_5_R1.PlayerInteractManager; import net.minecraft.server.v1_5_R1.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -23,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; public class VirtualPlayer extends CraftPlayer { @@ -57,6 +61,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java index 29296c9..212c03d 100644 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_5_R2; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.MinecraftServer; import net.minecraft.server.v1_5_R2.PlayerInteractManager; import net.minecraft.server.v1_5_R2.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -24,6 +27,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +65,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java index 427c7df..43ce5cb 100644 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_5_R3; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.MinecraftServer; import net.minecraft.server.v1_5_R3.PlayerInteractManager; import net.minecraft.server.v1_5_R3.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -24,6 +27,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +65,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java index 4facf49..b6c973e 100644 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_6_R1; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.MinecraftServer; import net.minecraft.server.v1_6_R1.PlayerInteractManager; import net.minecraft.server.v1_6_R1.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -24,6 +27,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +65,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java index 4410038..1727082 100644 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_6_R2; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.MinecraftServer; import net.minecraft.server.v1_6_R2.PlayerInteractManager; import net.minecraft.server.v1_6_R2.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -24,6 +27,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +65,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java index 31cbe18..ef67ac3 100644 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java @@ -1,14 +1,17 @@ package mc.alk.virtualplayers.nms.v1_6_R3; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.MinecraftServer; import net.minecraft.server.v1_6_R3.PlayerInteractManager; import net.minecraft.server.v1_6_R3.WorldServer; + import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -24,6 +27,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +65,21 @@ public InventoryView openInventory(Inventory inv) { return null; } + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + @Override public void removePotionEffect(PotionEffectType effect) { /// do nothing diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java index d6eec73..099ced9 100644 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java @@ -1,6 +1,7 @@ package mc.alk.virtualplayers.nms.v1_7_R1; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +63,21 @@ public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { public InventoryView openInventory(Inventory inv) { return null; } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } @Override public void removePotionEffect(PotionEffectType effect) { diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java index 57a6fa2..86c108c 100644 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java @@ -1,6 +1,7 @@ package mc.alk.virtualplayers.nms.v1_7_R2; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -61,6 +63,21 @@ public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { public InventoryView openInventory(Inventory inv) { return null; } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } @Override public void removePotionEffect(PotionEffectType effect) { diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java index b83e335..96fb93c 100644 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java @@ -1,6 +1,7 @@ package mc.alk.virtualplayers.nms.v1_7_R3; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,6 +27,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -65,6 +67,21 @@ public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { public InventoryView openInventory(Inventory inv) { return null; } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } @Override public void removePotionEffect(PotionEffectType effect) { diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java index a501bee..d9f4545 100644 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java @@ -1,6 +1,7 @@ package mc.alk.virtualplayers.nms.v1_7_R4; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; @@ -64,6 +66,21 @@ public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { public InventoryView openInventory(Inventory inv) { return null; } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } @Override public void removePotionEffect(PotionEffectType effect) { From 9b4675b4fa00cce201c94ff75e62994f3f4f82ca Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 17 Jun 2015 17:56:41 -0500 Subject: [PATCH 35/74] Updated pom.xml with Bukkit API --- modules/v1_4_5/pom.xml | 6 ++++++ modules/v1_4_6/pom.xml | 6 ++++++ modules/v1_4_R1/pom.xml | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml index 45e1177..f7384fa 100644 --- a/modules/v1_4_5/pom.xml +++ b/modules/v1_4_5/pom.xml @@ -20,6 +20,12 @@
+ + org.bukkit + bukkit + 1.4.5-R1.0 + provided + org.bukkit craftbukkit diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml index 981d0cf..8744ddd 100644 --- a/modules/v1_4_6/pom.xml +++ b/modules/v1_4_6/pom.xml @@ -20,6 +20,12 @@
+ + org.bukkit + bukkit + 1.4.6-R0.3 + provided + org.bukkit craftbukkit diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml index 261baf1..b4dccf9 100644 --- a/modules/v1_4_R1/pom.xml +++ b/modules/v1_4_R1/pom.xml @@ -20,6 +20,12 @@ + + org.bukkit + bukkit + 1.4.7-R1.0 + provided + org.bukkit craftbukkit From 2f2c54dfc29cc3ebdddfa0660ef06e6f0488fb3d Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 17 Jun 2015 18:20:58 -0500 Subject: [PATCH 36/74] Added v1_8_R2 module also bumped the MAX version to 1.8.3-R9.9-SNAPSHOT --- modules/VirtualPlayers/pom.xml | 9 ++++++++- .../java/mc/alk/virtualplayers/VirtualPlayers.java | 11 ++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index dc021a8..7d5d45c 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.2 + 1.6.4.1 jar VirtualPlayers @@ -145,6 +145,13 @@ jar true + + mc.alk + vp-v1_8_R2 + parent + jar + true + junit junit diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 19883d7..d1405d2 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -7,8 +7,10 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import mc.alk.virtualplayers.util.Version; +import mc.euro.version.Version; +import mc.euro.version.VersionFactory; import org.bukkit.Bukkit; +import org.bukkit.Server; import org.bukkit.command.CommandExecutor; import org.bukkit.entity.Player; import org.bukkit.event.Listener; @@ -18,14 +20,13 @@ public class VirtualPlayers extends JavaPlugin { - private Version server; - public static final String MAX = "1.7.10-R9.9-SNAPSHOT"; + public static final String MAX = "1.8.3-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; - public static final String NMS = Version.getNmsVersion().toString(); + public static final Version server = VersionFactory.getServerVersion(); + public static final String NMS = VersionFactory.getNmsVersion().toString(); @Override public void onEnable() { - server = Version.getServerVersion(); if (!server.isSupported(MAX) || !server.isCompatible(MIN)) { getLogger().info("VirtualPlayers is not compatible with your server."); getLogger().info("The maximum supported version is " + MAX); From 2370b2ca3e4fd9fcfe56d83b68b8e57646bf8abf Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 17 Jun 2015 18:30:57 -0500 Subject: [PATCH 37/74] VirtualPlayers v1.6.5 for MC 1.8.7 added modules/v1_8_R3 --- .gitignore | 5 + modules/VirtualPlayers/pom.xml | 2 +- .../mc/alk/virtualplayers/VirtualPlayers.java | 2 +- modules/v1_8_R3/pom.xml | 64 ++ .../nms/v1_8_R3/CustomCommandExecutor.java | 772 ++++++++++++++++++ .../nms/v1_8_R3/PlayerExecutor.java | 451 ++++++++++ .../nms/v1_8_R3/PlayerListener.java | 55 ++ .../alk/virtualplayers/nms/v1_8_R3/Util.java | 58 ++ .../nms/v1_8_R3/VPBaseExecutor.java | 115 +++ .../nms/v1_8_R3/VPExecutor.java | 74 ++ .../nms/v1_8_R3/VirtualPlayer.java | 415 ++++++++++ pom.xml | 2 + 12 files changed, 2013 insertions(+), 2 deletions(-) create mode 100644 modules/v1_8_R3/pom.xml create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VirtualPlayer.java diff --git a/.gitignore b/.gitignore index bccace6..ea2ab13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ #Maven /**/target/ + +#Eclipse +.project +.classpath +.settings diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 7d5d45c..4aa80d7 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.4.1 + 1.6.5 jar VirtualPlayers diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index d1405d2..a1418fd 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -20,7 +20,7 @@ public class VirtualPlayers extends JavaPlugin { - public static final String MAX = "1.8.3-R9.9-SNAPSHOT"; + public static final String MAX = "1.8.7-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; public static final Version server = VersionFactory.getServerVersion(); public static final String NMS = VersionFactory.getNmsVersion().toString(); diff --git a/modules/v1_8_R3/pom.xml b/modules/v1_8_R3/pom.xml new file mode 100644 index 0000000..646bab2 --- /dev/null +++ b/modules/v1_8_R3/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_8_R3 + parent + jar + + virtualplayers-v1_8_R3 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.8.7-R0.1 + provided + + + mc.alk + vp-util + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_8_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java new file mode 100644 index 0000000..acaa8c1 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java @@ -0,0 +1,772 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import mc.alk.virtualplayers.util.InventoryUtil; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + public static final String version = "2.1.2"; + final int commandIndex; + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + int max() default Integer.MAX_VALUE; + int exact() default -1; + + int order() default -1; + float helpOrder() default Integer.MAX_VALUE; + boolean admin() default false; /// admin + boolean op() default false; /// op + + String usage() default ""; + String usageNode() default ""; + String perm() default ""; /// permission node + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods = + new HashMap>(); + private HashMap>> subCmdMethods = + new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c!=0) return c; + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments{ + public Object[] args; + } + + class MethodWrapper{ + public MethodWrapper(Object obj, Method method){ + this.obj = obj; this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + public MCCommand getCommand(){ + return this.method.getAnnotation(MCCommand.class); + } + public float getHelpOrder(){ + return helpOrder != null ? + helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + + /** + * When no arguments are supplied, no method is found + * What to display when this happens + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command){ + showHelp(sender,command,null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args){ + help(sender,command,args); + } + + protected boolean validCommandSenderClass(Class clazz){ + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray){ + + for (Method method : methodArray){ + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) + continue; + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])){ + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()){ + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0){ + TreeMap mthds = methods.get(cmd); + if (mthds == null){ + mthds = new TreeMap(); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null){ + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd: mc.subCmds()){ + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null){ + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); + MethodWrapper mw = new MethodWrapper(obj,method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE){ + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()){ + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; + + Class types[] = method.getParameterTypes(); + if (commandIndex==0){ + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + for (int i=1;i theclass = types[i]; + str.add(getUsageString(theclass)); + if (i==commandIndex) { + str.add(thecmd); + if (thesubcmd!=null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class ==clazz){ + return ""; + } else if (OfflinePlayer.class ==clazz){ + return ""; + } else if (Location.class ==clazz){ + return ""; + } else if (String.class == clazz){ + return ""; + } else if (Integer.class == clazz || int.class == clazz){ + return ""; + } else if (Float.class == clazz || float.class == clazz){ + return ""; + } else if (Double.class == clazz || double.class == clazz){ + return ""; + } else if (Short.class == clazz || short.class == clazz){ + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz){ + return ""; + } else if (String[].class == clazz || Object[].class == clazz){ + return "[string ...]"; + } else if (GameMode.class == clazz){ + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException{ + final IllegalArgumentException err; + final MethodWrapper mw; + public CommandException(IllegalArgumentException err, MethodWrapper mw){ + this.err = err; this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ + showHelp(sender, command,args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd=true; + } + if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) + hasCmd =true; + } + + if (methodmap == null){ /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()){ + return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} + + MCCommand mccmd; + List errs =null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()){ + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + continue; + Arguments newArgs = null; + try { + newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper,newArgs); + if (completed != null && completed instanceof Boolean){ + success = (Boolean)completed; + if (!success){ + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()){ + sendMessage(sender, usage);} + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message + if (errs == null) + errs = new ArrayList(); + errs.add(new CommandException(e,mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper,newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()){ + HashSet usages = new HashSet(); + for (CommandException e: errs){ + usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); + } + for (String msg : usages){ + sendMessage(sender, msg);} + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj,args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); + if (newArgs!=null && newArgs.args != null){ + for (Object o: newArgs.args) + System.err.println("[Error] object=" + o); + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null){ + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + + + + public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ + if (DEBUG){ + log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ + ", label=" + label+" args="+ Arrays.toString(args)); + for (String arg: args){ + log.info(" -- arg=" +arg);} + for (Class t: mwrapper.method.getParameterTypes()){ + log.info(" -- type=" +t);} + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) + throw new IllegalArgumentException("You don't have permission to use this command"); + + /// Verify min number of arguments + if (args.length < cmd.min()){ + throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()){ + throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact()!= -1 && args.length != cmd.exact()){ + throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) + throw new IllegalArgumentException("You need to be op to use this command"); + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + throw new IllegalArgumentException("You need to be an Admin to use this command"); + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer){ + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i=1;i clazz = types[i]; + try{ + if (CommandSender.class == clazz){ + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz){ + objs[objIndex] =args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null){ + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + + clazz.getCanonicalName()); + if (numUsedStrings.get() > 0){ + strIndex+=numUsedStrings.get();} + } catch (ArrayIndexOutOfBoundsException e){ + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i==commandIndex) { + if (hasCmd) + strIndex++; + if (hasSubCmd) + strIndex++; + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0){ + for (int index: cmd.alphanum()){ + if (index >= args.length) + throw new IllegalArgumentException("String Index out of range. "); + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())){ + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) + throw new ArrayIndexOutOfBoundsException(); + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args,curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); + } + return null; + } + + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null){ + throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4){yaw = Float.valueOf(split[4]);} + if (split.length > 5){pitch = Float.valueOf(split[5]);} + World world = null; + if (w != null){ + world = Bukkit.getWorld(w);} + if (world ==null){ + throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} + return new Location(world,x,y,z,yaw,pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} + if (gm == null){ + try{ + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e){/* do nothing */} + if (gm == null){ + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) + throw new IllegalArgumentException("Player " + name+" can not be found"); + return p; + } + + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) + throw new IllegalArgumentException(name+" is not online "); + return p; + } + + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender){ + return sender.isOp(); + } + + + static final int LINES_PER_PAGE = 8; + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args){ + Integer page = 1; + + if (args != null && args.length > 1){ + try{ + page = Integer.valueOf(args[1]); + } catch (Exception e){ + sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()){ + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage){ + if (!dups.add(mw.method)) + continue; + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand +" " + mw.usage; + if (cmd.op() && !sender.isOp()) + onlyop.add(use); + else if (cmd.admin() && !hasAdminPerms(sender)) + continue; + else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + unavailable.add(use); + else + available.add(use); + } + int npages = available.size()+unavailable.size(); + if (sender.isOp()) + npages += onlyop.size(); + npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); + if (page > npages || page <= 0){ + if (npages <= 0){ + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); + sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); + } + int i=0; + for (String use : available){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + continue; + sendMessage(sender, use); + } + for (String use : unavailable){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + if (sender.isOp()){ + for (String use : onlyop){ + i++; + if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + continue; + sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + } + } + + public boolean sendMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + if (message.contains("\n")) + return sendMultilineMessage(p,message); + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(message)); + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message){ + if (message ==null || message.isEmpty()) return true; + String[] msgs = message.split("\n"); + for (String msg: msgs){ + if (p instanceof Player){ + if (((Player) p).isOnline()) + p.sendMessage(colorChat(msg)); + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + + public static Player findPlayer(String name) { + if (name == null) + return null; + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + foundPlayer = VirtualPlayer.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer;} + Player[] online = VirtualPlayer.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (foundPlayer != null) { + return null;} + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null){ + return p; + } else{ + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()){ + File f = new File(w.getName()+"/players/"+name+".dat"); + if (f.exists()){ + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java new file mode 100644 index 0000000..fb6dbf3 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java @@ -0,0 +1,451 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import mc.alk.virtualplayers.util.InventoryUtil; +import net.minecraft.server.v1_8_R3.DamageSource; +import net.minecraft.server.v1_8_R3.EntityPlayer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.ChatColor; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + JavaPlugin plugin; + + public PlayerExecutor(Plugin p) { + super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); + super.useAlias = 0; + + this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + + } + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) { + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + } + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) { + continue; + } + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak) { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final HashSet players = new HashSet( + Arrays.asList(VirtualPlayer.getOnlinePlayers())); + + System.out.println("sender = " + sender.getName()); + System.out.println("vp = " + vp.getName()); + System.out.println("args = " + args.toString()); + System.out.println("players = " + players.toString()); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; + sendMessage(sender, message); + // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) { + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent event = new EntityDamageEvent( + damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damagee.getHealth() - h); + /* + EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, + null, + null); */ + if (!event.isCancelled() || force) { + damagee.setLastDamageCause(event); + damagee.setHealth(damagee.getHealth() - event.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = new EntityDamageByEntityEvent( + damager, damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damage); + /* + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((Entity) ((CraftPlayer) damager).getHandle()), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + */ + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc", "disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { + vp.setOnline(connecting); + if (connecting) { + // PreLogin Event has to be called from a thread other than the + // main. + final String playerName = vp.getName(); + Runnable r = new Runnable() { + @Override + public void run() { + try { + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex) {/* say nothing */ + + } + /// After we are done Asynchronously handling the + /// preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable() { + @Override + public void run() { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex) {/* do nothing */ + + } + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent(playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } else { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java new file mode 100644 index 0000000..a7f5450 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * + * @author Nikolai + */ +public class PlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event){ + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + p.setHealth(20.0); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) + { + Player p = event.getPlayer(); + if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) + { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) + { + if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to + // handle it + return; + // / For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format(event.getFormat(), event + .getPlayer().getDisplayName(), event.getMessage()); + for (Player p : event.getRecipients()) + { + p.sendMessage(message); + } + } + +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java new file mode 100644 index 0000000..ccce1df --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java @@ -0,0 +1,58 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Util +{ + public interface VPMessageListener{ + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) + { + if (l == null) return "null"; + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); + if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) + { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()){ + for (VPMessageListener l: listeners) { + l.gettingMessage(p, msg);} + } + if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); + } + + public static String colorChat(String msg) + { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) + { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java new file mode 100644 index 0000000..1a86eb5 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java @@ -0,0 +1,115 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor{ + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz){ + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz){ + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayer.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name);} + p = VirtualPlayer.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)){ + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List ) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list){ + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) + { + if (string == null || !showEventMessages) return true; + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) + { + if (string == null || !showEventMessages) return true; + if (showTransitionsToPlayer) + Util.sendMessage(p, string); + return super.sendMessage(sender,string); + } + + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")){ + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i=start;i<=end;i++){ + players.add(VirtualPlayer.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayer.getOrCreate(name)); + } + return players; + } + + public static void setShowEventMessages(boolean show) { + showEventMessages = show; + } +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java new file mode 100644 index 0000000..e0e0f37 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java @@ -0,0 +1,74 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import org.bukkit.command.CommandSender; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + public VPExecutor(Plugin plugin) { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap","addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception + { + for (int i = 0; i < numPlayers; i++){ + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayer.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayer.getPlayerList(); + sender.sendMessage("VirtualPlayers count="+players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean show) { + VirtualPlayer.setGlobalMessages(show); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean show) { + showEventMessages = show; + } + + +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VirtualPlayer.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VirtualPlayer.java new file mode 100644 index 0000000..65d87bd --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VirtualPlayer.java @@ -0,0 +1,415 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import com.mojang.authlib.GameProfile; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.v1_8_R3.EntityPlayer; +import net.minecraft.server.v1_8_R3.MinecraftServer; +import net.minecraft.server.v1_8_R3.PlayerInteractManager; +import net.minecraft.server.v1_8_R3.WorldServer; +import org.apache.commons.lang.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_8_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class VirtualPlayer extends CraftPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + static boolean enableMessages = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + CraftScoreboard scoreboard; + + /** + * Added static maps from VirtualPlayers JavaPlugin class. + */ + static final Map vps = new HashMap(); + static final Map names = new HashMap(); + + public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + /// mcserver, worldserver, GameProfile, PlayerInteractManager + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.loc = this.getLocation(); + } + + public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages && enableMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && enableMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + public void setOnline(boolean b) { + if (enableMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (enableMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + loc = l; + } + + public Player getInformed() { + return keepInformed; + } + + public static void setGlobalMessages(boolean enable) { + VirtualPlayer.enableMessages = enable; + } + + /** + * Everything below was moved out of VirtualPlayers JavaPlugin class.
+ * + * ********************************************************************* + * ********************************************************************* + */ + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static Player getPlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = names.get(pname); + } + return vp; + } + + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) { + vp = vps.get(id); + } + return vp; + } + + public static Player getPlayerExact(String pname) { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) { + vp = names.get(pname); + } + return vp; + } + + public static Player getOrMakePlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = names.get(pname); + } + if (vp == null) { + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public static Player[] getOnlinePlayers() { + List players = new ArrayList(); + for (Player p : vps.values()) { + if (p.isOnline()) { + players.add(p); + } + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); + return (Player[]) ArrayUtils.addAll(ps, bps); + } + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public static synchronized Player makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); + VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + vp.loc = location; + return vp; + } + + public static Player deleteVirtualPlayer(VirtualPlayer vp) { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + vps.remove(vp.getUniqueId()); + return vp; + } + + public static void deleteVirtualPlayers() { + for (VirtualPlayer vp : vps.values()) { + WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); + world.removeEntity(vp.getHandle()); + vp.remove(); + } + vps.clear(); + } + + public static List getPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try { + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } +} diff --git a/pom.xml b/pom.xml index 9543fae..165c102 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,8 @@ modules/v1_7_R3 modules/v1_7_R4 modules/v1_8_R1 + modules/v1_8_R2 + modules/v1_8_R3 modules/VirtualPlayers From 7088af9f79b683a511f8f0a6e5711b86486348f4 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 17 Jun 2015 18:49:43 -0500 Subject: [PATCH 38/74] Fix build: added missing dependency to pom.xml vp-v1_8_R3 dependency was missing --- modules/VirtualPlayers/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 4aa80d7..be75066 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -152,6 +152,13 @@ jar true
+ + mc.alk + vp-v1_8_R3 + parent + jar + true + junit junit From 5aeea64f9a67ad336d3a5d4fa637e80cf89a9ea1 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 18 Jun 2015 12:34:17 -0500 Subject: [PATCH 39/74] Refactored to CraftVirtualPlayer: Start of v2.0 mc.alk.virtualplayers.nms.{version}.VirtualPlayer was refactored to CraftVirtualPlayer v2.0 will add the VirtualPlayer interface in an attempt to 1. get rid of duplicated classes between modules 2. add an API for other plugins to determine if they're dealing with a VirtualPlayer instance. 1. Duplicated Classes between modules: CustomCommandExecutor.java PlayerExecutor.java PlayerListener.java Util.java VPBaseExecutor.java VPExecutor.java This is a minor problem and annoyance: Because anytime we want to make a change to one of these classes, we have to duplicate the change for each module. The proposed solution is for these classes to NOT know about NOR work with the CraftVirtualPlayer objects... But instead work with the api.VirtualPlayer interface and an abstract VirtualPlayerFactory. Easily converted: CustomCommandExecutor.java PlayerListener.java Util.java VPBaseExecutor.java Based on the imports, the only thing holding these classes back from becoming module independent is the usage of CraftVirtualPlayer, which the introduction of api.VirtualPlayer interface should easily solve. PlayerExecutor.java: The class that will be a little more tricky to convert is PlayerExecutor.java because of the use of NMS & OBC internals: n.m.s.{version}.DamageSource; n.m.s.{version}.EntityPlayer; o.b.c.{version}.CraftPlayer; Luckily, it's all contained within one method: damageEvent() Which is started by the cmd: /dc hit We could do a quick, temporary conversion to module independence by simply omitting (or commenting out) this method. Then re-introduce an implementation that uses abstract elements... Where the actual implementation details are hidden inside each module. This is the plan to achieve module independence for these duplicated classes. 2. mc.alk.virtualplayers.api.VirtualPlayer interface: This will also allow other plugins to (hopefully) determine if they have an instance of VirtualPlayer without being version locked by checking against nms.{version}.CraftVirtualPlayer. That's the plan anyways. This particular need is two-fold: First, BattleArena checks for VirtualPlayers. Second, WorldEdit v6.0.0 has broken commands run by VirtualPlayers, where-as these commands work perfectly fine for WorldEdit v5.x... So, it's my hope (and the request of many players) that this issue eventually get fixed... either by WorldEdit simply checking if the command was run by a VirtualPlayer... OR by VirtualPlayers injecting each VirtualPlayer into the server's playerList... which has the side-effect of a VirtualPlayer no longer being reconized as a VirtualPlayer (per the internal logic of VirtualPlayers that first checks a name against all players on the server, before deciding that the absence of will means that it becomes a VirtualPlayer). --- .../mc/alk/virtualplayers/VirtualPlayers.java | 44 ++++++++++--------- ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 ...ualPlayer.java => CraftVirtualPlayer.java} | 0 18 files changed, 24 insertions(+), 20 deletions(-) rename modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) rename modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/{VirtualPlayer.java => CraftVirtualPlayer.java} (100%) diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index a1418fd..b7ffd6b 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -44,18 +44,18 @@ public void onEnable() { @Override public void onDisable() { - // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.deleteVirtualPlayers(); + // mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer.deleteVirtualPlayers(); try { - getNmsClass("VirtualPlayer").getDeclaredMethod("deleteVirtualPlayers", new Class[]{}).invoke(null); + getVirtualPlayerClass().getDeclaredMethod("deleteVirtualPlayers", new Class[]{}).invoke(null); } catch (Exception ex) { Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } } public void setPlayerMessages(boolean show){ - // mc.alk.virtualplayers.nms.{version}.VirtualPlayer.setGlobalMessages(show); + // mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer.setGlobalMessages(show); try { - getNmsClass("VirtualPlayer").getDeclaredMethod("setGlobalMessages", boolean.class).invoke(null, show); + getVirtualPlayerClass().getDeclaredMethod("setGlobalMessages", boolean.class).invoke(null, show); } catch (Exception ex) { Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } @@ -69,6 +69,10 @@ public void setEventMessages(boolean show){ Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } } + + public static Class getVirtualPlayerClass() throws Exception { + return getNmsClass("CraftVirtualPlayer"); + } public static Class getNmsClass(String clazz) throws Exception { return Class.forName("mc.alk.virtualplayers.nms." + NMS + "." + clazz); @@ -101,28 +105,28 @@ private void registerCommands() { /** * Used by mc.alk.arena.util.ServerUtil. - * Implementation moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer: + * Implementation moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer: */ public static Player getPlayer(String pname) { return (Player) invoke("getPlayer", pname); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Player getPlayer(UUID id) { return (Player) invoke("getPlayer", id); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Player getPlayerExact(String pname) { return (Player) invoke("getPlayerExact", pname); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Player getOrMakePlayer(String pname) { return (Player) invoke("getOrMakePlayer", pname); @@ -130,34 +134,34 @@ public static Player getOrMakePlayer(String pname) { /** * Used by mc.alk.arena.util.ServerUtil. - * Implementation moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer:getOnlinePlayers(). + * Implementation moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer:getOnlinePlayers(). */ public static Player[] getOnlinePlayers() { return (Player[]) invoke("getOnlinePlayers"); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Player makeVirtualPlayer() throws Exception { return makeVirtualPlayer(null); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static synchronized Player makeVirtualPlayer(String name) throws Exception { return (Player) invoke("makeVirtualPlayer", name); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Player deleteVirtualPlayer(Object vp) { Player player = null; Method[] methods = null; try { - methods = getNmsClass("VirtualPlayer").getDeclaredMethods(); + methods = getVirtualPlayerClass().getDeclaredMethods(); } catch (Exception ex) { Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); } @@ -179,35 +183,35 @@ public static Player deleteVirtualPlayer(Object vp) { } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static void deleteVirtualPlayers() { invoke("deleteVirtualPlayers"); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static List getPlayerList() { return (List) invoke("getPlayerList"); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Object getOrCreate(String name) { return invoke("getOrCreate", name); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Map getVps() { return (Map) invoke("getVps"); } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.VirtualPlayer. + * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. */ public static Map getNames() { return (Map) invoke("getNames"); @@ -218,13 +222,13 @@ private static Object invoke(String methodName, Object... params) { Method method; try { if (params == null) { - method = getNmsClass("VirtualPlayer").getDeclaredMethod(methodName); + method = getVirtualPlayerClass().getDeclaredMethod(methodName); } else { Class[] classParams = new Class[params.length]; for (int index = 0; index < params.length; index = index + 1) { classParams[index] = params[index].getClass(); } - method = getNmsClass("VirtualPlayer").getDeclaredMethod(methodName, classParams); + method = getVirtualPlayerClass().getDeclaredMethod(methodName, classParams); } object = method.invoke(null, params); } catch (NoSuchMethodException ex) { diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VirtualPlayer.java rename to modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VirtualPlayer.java rename to modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VirtualPlayer.java rename to modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VirtualPlayer.java rename to modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VirtualPlayer.java rename to modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VirtualPlayer.java rename to modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VirtualPlayer.java rename to modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VirtualPlayer.java rename to modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VirtualPlayer.java rename to modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VirtualPlayer.java rename to modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VirtualPlayer.java rename to modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VirtualPlayer.java rename to modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VirtualPlayer.java rename to modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VirtualPlayer.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VirtualPlayer.java rename to modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VirtualPlayer.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VirtualPlayer.java rename to modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VirtualPlayer.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java similarity index 100% rename from modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VirtualPlayer.java rename to modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java similarity index 100% rename from modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VirtualPlayer.java rename to modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java From ae22126616e1f77334ee838f7084a9d9c2be9039 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 18 Jun 2015 13:25:45 -0500 Subject: [PATCH 40/74] Minor refactor & formatting Nothing major enough to change the version field. - added private debug() method to avoid duplicated code. - moved armor field to the top. - added private initArmor() method instead of a static block. - tabs formatted to spaces --- .../virtualplayers/util/InventoryUtil.java | 1464 ++++++++--------- 1 file changed, 702 insertions(+), 762 deletions(-) diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java index 7b324e8..2c55b0d 100644 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java +++ b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -13,766 +13,706 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -public class InventoryUtil -{ - static final String version = "InventoryUtil 2.1.4"; - static final boolean DEBUG = false; - - public static class Armor - { - public ArmorLevel level; - public ArmorType type; - - Armor(ArmorType at, ArmorLevel al) - { - this.level = al; - this.type = at; - } - } - - public static class EnchantmentWithLevel - { - public EnchantmentWithLevel() - { - } - - public EnchantmentWithLevel(boolean all) - { - this.all = all; - } - - public Enchantment e; - public Integer lvl; - boolean all = false; - - @Override - public String toString() - { - return (e != null ? e.getName() : "null") + ":" + lvl; - } - } - - public enum ArmorLevel - { - WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND - }; - - public enum ArmorType - { - HELM, CHEST, LEGGINGS, BOOTS - }; - - public static Enchantment getEnchantmentByCommonName(String iname) - { - iname = iname.toLowerCase(); - if (iname.contains("smite")) - return Enchantment.getByName("DAMAGE_UNDEAD"); - if (iname.contains("sharp")) - return Enchantment.getByName("DAMAGE_ALL"); - if (iname.contains("fire") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_FIRE"); - if (iname.contains("fire")) - return Enchantment.getByName("FIRE_ASPECT"); - if (iname.contains("exp") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - if (iname.contains("blast") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - if (iname.contains("arrow") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_PROJECTILE"); - if (iname.contains("proj") && iname.contains("prot")) - return Enchantment.getByName("PROTECTION_PROJECTILE"); - if (iname.contains("respiration")) - return Enchantment.getByName("OXYGEN"); - if (iname.contains("fall")) - return Enchantment.getByName("PROTECTION_FALL"); - if (iname.contains("prot")) - return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); - if (iname.contains("respiration")) - return Enchantment.getByName("OXYGEN"); - if (iname.contains("oxygen")) return Enchantment.getByName("OXYGEN"); - if (iname.contains("aqua")) - return Enchantment.getByName("WATER_WORKER"); - if (iname.contains("arth")) - return Enchantment.getByName("DAMAGE_ARTHROPODS"); - if (iname.contains("knockback")) - return Enchantment.getByName("KNOCKBACK"); - if (iname.contains("loot")) - return Enchantment.getByName("LOOT_BONUS_MOBS"); - if (iname.contains("dig")) return Enchantment.getByName("DIG_SPEED"); - if (iname.contains("silk")) return Enchantment.getByName("SILK_TOUCH"); - if (iname.contains("unbreaking")) - return Enchantment.getByName("DURABILITY"); - if (iname.contains("dura")) return Enchantment.getByName("DURABILITY"); - return null; - } - - static final HashMap armor; - static - { - armor = new HashMap(); - armor.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); - armor.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.IRON)); - armor.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.IRON)); - armor.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.IRON)); - armor.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.CHAINMAIL)); - - armor.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.LEATHER)); - armor.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.IRON)); - armor.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.GOLD)); - armor.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.DIAMOND)); - armor.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.CHAINMAIL)); - } - - public static int arrowCount(Player p) - { - return getItemAmount(p.getInventory().getContents(), new ItemStack( - Material.ARROW, 1)); - } - - public static int getItemAmountFromInventory(Inventory inv, ItemStack is) - { - return getItemAmount(inv.getContents(), is); - } - - public static boolean hasArmor(Player p) - { - PlayerInventory pi = p.getInventory(); - return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi - .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); - } - - public static ArmorLevel hasArmorSet(List inv) - { - ArmorLevel armorSet[] = new ArmorLevel[4]; - for (ItemStack is : inv) - { - Armor a = armor.get(is.getType()); - if (a == null) continue; - switch (a.type) - { - case BOOTS: - armorSet[0] = a.level; - break; - case LEGGINGS: - armorSet[1] = a.level; - break; - case CHEST: - armorSet[2] = a.level; - break; - case HELM: - armorSet[3] = a.level; - break; - } - } - ArmorLevel lvl = null; - for (ArmorLevel a : armorSet) - { - if (lvl == null) - lvl = a; - else if (lvl != a) return null; - } - return lvl; - } - - // - // private static Material getMaterial(ArmorLevel level) { - // switch(level){ - // case WOOL: return Material.WOOL; - // case LEATHER : return Material.LEATHER; - // case IRON: return Material.IRON_BOOTS; - // case GOLD : return Material.GOLD_BOOTS; - // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; - // case DIAMOND: return Material.DIAMOND; - // default : return null; - // } - // } - - public static int getItemAmount(ItemStack[] items, ItemStack is) - { - int count = 0; - for (ItemStack item : items) - { - if (item == null) - { - continue; - } - if (item.getType() == is.getType() - && ((item.getDurability() == is.getDurability() || item - .getDurability() == -1))) - { - count += item.getAmount(); - } - } - return count; - } - - public static ItemStack getItemStack(String name) - { - if (name == null || name.isEmpty()) return null; - name = name.replace(" ", "_"); - name = name.replace(":", ";"); - - int dataIndex = name.indexOf(';'); - dataIndex = (dataIndex != -1 ? dataIndex : -1); - int dataValue = 0; - if (dataIndex != -1) - { - dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer - .parseInt(name.substring(dataIndex + 1)) : 0); - name = name.substring(0, dataIndex); - } - - dataValue = dataValue < 0 ? 0 : dataValue; - Material mat = getMat(name); - - if (mat != null && mat != Material.AIR) - { - return new ItemStack(mat, 0, (short) dataValue); - } - return null; - } - - public static boolean isInt(String i) - { - try - { - Integer.parseInt(i); - return true; - } catch (Exception e) - { - return false; - } - } - - public static boolean isFloat(String i) - { - try - { - Float.parseFloat(i); - return true; - } catch (Exception e) - { - return false; - } - } - - // / Get the Material - public static Material getMat(String name) - { - Integer id = null; - try - { - id = Integer.parseInt(name); - } catch (Exception e) - { - } - if (id == null) - { - id = getMaterialID(name); - } - return id != null && id >= 0 ? Material.getMaterial(id) : null; - } - - // / This allows for abbreviations to work, useful for sign etc - public static int getMaterialID(String name) - { - name = name.toUpperCase(); - // / First try just getting it from the Material Name - Material mat = Material.getMaterial(name); - if (mat != null) return mat.getId(); - // / Might be an abbreviation, or a more complicated - int temp = Integer.MAX_VALUE; - mat = null; - name = name.replaceAll("\\s+", "").replaceAll("_", ""); - for (Material m : Material.values()) - { - if (m.name().replaceAll("_", "").startsWith(name)) - { - if (m.name().length() < temp) - { - mat = m; - temp = m.name().length(); - } - } - } - return mat != null ? mat.getId() : -1; - } - - public static boolean hasItem(Player p, ItemStack itemType) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() == itemType.getType()) - { - return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() == itemType.getType()) - { - return true; - } - } - return false; - } - - public static boolean hasAnyItem(Player p) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() != Material.AIR) - { - // System.out.println("item=" + is); - return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() != Material.AIR) - { - // System.out.println("item=" + is); - return true; - } - } - - return false; - } - - public static void addItemToInventory(Player player, ItemStack itemStack) - { - addItemToInventory(player, itemStack, itemStack.getAmount(), true, - false); - } - - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount) - { - addItemToInventory(player, itemStack, stockAmount, true, false); - } - - @SuppressWarnings("deprecation") - public static void addItemsToInventory(Player p, List items, - boolean ignoreHelmet) - { - for (ItemStack is : items) - InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), - false, false); - try - { - p.updateInventory(); - } catch (Exception e) - { - } - } - - @SuppressWarnings("deprecation") - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount, boolean update, boolean ignoreHelmet) - { - PlayerInventory inv = player.getInventory(); - Material itemType = itemStack.getType(); - if (armor.containsKey(itemType)) - { - // / no item: add to armor slot - // / item better: add old to inventory, new to armor slot - // / item notbetter: add to inventory - ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); - boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); - boolean better = empty ? false : armorSlotBetter( - armor.get(oldArmor.getType()), armor.get(itemType)); - final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; - if (empty || better) - { - switch (armor.get(itemType).type) - { - case HELM: - inv.setHelmet(itemStack); - break; - case CHEST: - inv.setChestplate(itemStack); - break; - case LEGGINGS: - inv.setLeggings(itemStack); - break; - case BOOTS: - inv.setBoots(itemStack); - break; - } - } - if (!empty) - { - if (better && (!isHelmet && ignoreHelmet)) - { - addItemToInventory(inv, oldArmor, oldArmor.getAmount()); - } - else - { - addItemToInventory(inv, itemStack, stockAmount); - } - } - } - else - { - addItemToInventory(inv, itemStack, stockAmount); - } - if (update) try - { - player.updateInventory(); - } catch (Exception e) - { - } - } - - private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) - { - if (oldArmor == null || newArmor == null) // / technically we could - // throw an exception.. but - // nah - return false; - return oldArmor.level.ordinal() < newArmor.level.ordinal(); - } - - private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) - { - switch (armor.type) - { - case HELM: - return inv.getHelmet(); - case CHEST: - return inv.getChestplate(); - case LEGGINGS: - return inv.getLeggings(); - case BOOTS: - return inv.getBoots(); - } - return null; - } - - // /Adds item to inventory - public static void addItemToInventory(Inventory inv, ItemStack is, int left) - { - int maxStackSize = is.getType().getMaxStackSize(); - if (left <= maxStackSize) - { - is.setAmount(left); - inv.addItem(is); - return; - } - - if (maxStackSize != 64) - { - ArrayList items = new ArrayList(); - for (int i = 0; i < Math.ceil(left / maxStackSize); i++) - { - if (left < maxStackSize) - { - is.setAmount(left); - items.add(is); - return; - } - else - { - is.setAmount(maxStackSize); - items.add(is); - } - } - Object[] iArray = items.toArray(); - for (Object o : iArray) - { - inv.addItem((ItemStack) o); - } - } - else - { - inv.addItem(is); - } - } - - public static void closeInventory(Player p) - { - - try - { - p.closeInventory(); - } catch (Exception closeInventoryError) - { - // / This almost always throws an NPE, but does its job so ignore - } - } - - public static void clearInventory(Player p) - { - try - { - PlayerInventory inv = p.getInventory(); - closeInventory(p); - - if (inv != null) - { - inv.clear(); - inv.setArmorContents(null); - inv.setItemInHand(null); - } - } catch (Exception ee) - { - ee.printStackTrace(); - } - } - - public static Object getCommonName(ItemStack is) - { - int id = is.getTypeId(); - int datavalue = is.getDurability(); - if (datavalue > 0) - { - return Material.getMaterial(id).toString() + ":" + datavalue; - } - return Material.getMaterial(id).toString(); - } - - public static boolean isItem(String str) - { - // System.out.println("string = " + str); - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - if (DEBUG) System.out.println("item=" + str); - ItemStack is = null; - try - { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - is.setAmount(Integer.valueOf(split[split.length - 1])); - for (int i = 1; i < split.length - 1; i++) - { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try - { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) - { - return false; - } - } - } catch (Exception e) - { - return false; - } - return true; - } - - public static ItemStack parseItem(String str) throws Exception - { - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - if (DEBUG) System.out.println("item=" + str); - ItemStack is = null; - try - { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - // System.out.println(" split = " + split); - final int amt = split.length > 1 ? Integer - .valueOf(split[split.length - 1]) : 1; - is.setAmount(amt); - for (int i = 1; i < split.length - 1; i++) - { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try - { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) - { - Logger.getLogger("minecraft").warning( - ewl + " can not be applied to the item " + str); - } - } - } catch (Exception e) - { - e.printStackTrace(); - Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); - throw new Exception("parse item was bad"); - } - return is; - } - - public static EnchantmentWithLevel getEnchantment(String str) - { - if (str.equalsIgnoreCase("all")) - { - return new EnchantmentWithLevel(true); - } - Enchantment e = null; - str = str.replaceAll(",", ":"); - int index = str.indexOf(':'); - index = (index != -1 ? index : -1); - int lvl = -1; - if (index != -1) - { - try - { - lvl = Integer.parseInt(str.substring(index + 1)); - } catch (Exception err) - { - } - str = str.substring(0, index); - } - - // System.out.println("String = <" + str +"> " + lvl); - try - { - e = Enchantment.getById(Integer.valueOf(str)); - } catch (Exception err) - { - } - if (e == null) e = Enchantment.getByName(str); - if (e == null) e = getEnchantmentByCommonName(str); - if (e == null) return null; - EnchantmentWithLevel ewl = new EnchantmentWithLevel(); - ewl.e = e; - if (lvl < e.getStartLevel()) - { - lvl = e.getStartLevel(); - } - if (lvl > e.getMaxLevel()) - { - lvl = e.getMaxLevel(); - } - ewl.lvl = lvl; - return ewl; - } - - public boolean addEnchantments(ItemStack is, String[] args) - { - Map encs = new HashMap(); - for (String s : args) - { - EnchantmentWithLevel ewl = getEnchantment(s); - if (ewl != null) - { - if (ewl.all) - { - return addAllEnchantments(is); - } - encs.put(ewl.e, ewl.lvl); - } - } - addEnchantments(is, encs); - return true; - } - - public void addEnchantments(ItemStack is, - Map enchantments) - { - for (Enchantment e : enchantments.keySet()) - { - if (e.canEnchantItem(is)) - { - is.addUnsafeEnchantment(e, enchantments.get(e)); - } - } - } - - public boolean addAllEnchantments(ItemStack is) - { - for (Enchantment enc : Enchantment.values()) - { - if (enc.canEnchantItem(is)) - { - is.addUnsafeEnchantment(enc, enc.getMaxLevel()); - } - } - return true; - } - - /** - * For Serializing an item or printing - * - * @param is - * @return - */ - public static String getItemString(ItemStack is) - { - if (is == null) return null; - StringBuilder sb = new StringBuilder(); - sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); - Map encs = is.getEnchantments(); - for (Enchantment enc : encs.keySet()) - { - sb.append(enc.getName() + ":" + encs.get(enc) + " "); - } - sb.append(is.getAmount()); - return sb.toString(); - } - - public static boolean hasEnchantedItem(Player p) - { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) - { - if (is != null && is.getType() != Material.AIR) - { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) return true; - } - } - for (ItemStack is : inv.getArmorContents()) - { - if (is != null && is.getType() != Material.AIR) - { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) return true; - } - } - return false; - } - - public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) - { - Armor a = armor.get(is.getType()); - if (a == null) return false; - return a.level == lvl; - } - - public static ItemStack getWool(int color) - { - return new ItemStack(Material.WOOL, 1, (short) color); - } +public class InventoryUtil { + + static final String version = "InventoryUtil 2.1.4"; + static final boolean DEBUG = false; + static final Map armor = initArmor(); + + public enum ArmorType { + + HELM, CHEST, LEGGINGS, BOOTS; + } + + public enum ArmorLevel { + + WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND; + } + + public static class Armor { + + public ArmorLevel level; + public ArmorType type; + + Armor(ArmorType at, ArmorLevel al) { + this.level = al; + this.type = at; + } + } + + public static class EnchantmentWithLevel { + + public EnchantmentWithLevel() { + } + + public EnchantmentWithLevel(boolean all) { + this.all = all; + } + + public Enchantment e; + public Integer lvl; + boolean all = false; + + @Override + public String toString() { + return (e != null ? e.getName() : "null") + ":" + lvl; + } + } + + private static Map initArmor() { + Map temp = new HashMap(); // or EnumMap + temp.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); + temp.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.IRON)); + temp.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.CHAINMAIL)); + + temp.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.IRON)); + temp.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.CHAINMAIL)); + + temp.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.IRON)); + temp.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.CHAINMAIL)); + + temp.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.IRON)); + temp.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.CHAINMAIL)); + return temp; + } + + public static Enchantment getEnchantmentByCommonName(String iname) { + iname = iname.toLowerCase(); + if (iname.contains("smite")) { + return Enchantment.getByName("DAMAGE_UNDEAD"); + } + if (iname.contains("sharp")) { + return Enchantment.getByName("DAMAGE_ALL"); + } + if (iname.contains("fire") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_FIRE"); + } + if (iname.contains("fire")) { + return Enchantment.getByName("FIRE_ASPECT"); + } + if (iname.contains("exp") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + } + if (iname.contains("blast") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + } + if (iname.contains("arrow") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_PROJECTILE"); + } + if (iname.contains("proj") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_PROJECTILE"); + } + if (iname.contains("respiration")) { + return Enchantment.getByName("OXYGEN"); + } + if (iname.contains("fall")) { + return Enchantment.getByName("PROTECTION_FALL"); + } + if (iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); + } + if (iname.contains("respiration")) { + return Enchantment.getByName("OXYGEN"); + } + if (iname.contains("oxygen")) { + return Enchantment.getByName("OXYGEN"); + } + if (iname.contains("aqua")) { + return Enchantment.getByName("WATER_WORKER"); + } + if (iname.contains("arth")) { + return Enchantment.getByName("DAMAGE_ARTHROPODS"); + } + if (iname.contains("knockback")) { + return Enchantment.getByName("KNOCKBACK"); + } + if (iname.contains("loot")) { + return Enchantment.getByName("LOOT_BONUS_MOBS"); + } + if (iname.contains("dig")) { + return Enchantment.getByName("DIG_SPEED"); + } + if (iname.contains("silk")) { + return Enchantment.getByName("SILK_TOUCH"); + } + if (iname.contains("unbreaking")) { + return Enchantment.getByName("DURABILITY"); + } + if (iname.contains("dura")) { + return Enchantment.getByName("DURABILITY"); + } + return null; + } + + public static int arrowCount(Player p) { + return getItemAmount(p.getInventory().getContents(), new ItemStack( + Material.ARROW, 1)); + } + + public static int getItemAmountFromInventory(Inventory inv, ItemStack is) { + return getItemAmount(inv.getContents(), is); + } + + public static boolean hasArmor(Player p) { + PlayerInventory pi = p.getInventory(); + return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi + .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); + } + + public static ArmorLevel hasArmorSet(List inv) { + ArmorLevel armorSet[] = new ArmorLevel[4]; + for (ItemStack is : inv) { + Armor a = armor.get(is.getType()); + if (a == null) { + continue; + } + switch (a.type) { + case BOOTS: + armorSet[0] = a.level; + break; + case LEGGINGS: + armorSet[1] = a.level; + break; + case CHEST: + armorSet[2] = a.level; + break; + case HELM: + armorSet[3] = a.level; + break; + } + } + ArmorLevel lvl = null; + for (ArmorLevel a : armorSet) { + if (lvl == null) { + lvl = a; + } else if (lvl != a) { + return null; + } + } + return lvl; + } + + // + // private static Material getMaterial(ArmorLevel level) { + // switch(level){ + // case WOOL: return Material.WOOL; + // case LEATHER : return Material.LEATHER; + // case IRON: return Material.IRON_BOOTS; + // case GOLD : return Material.GOLD_BOOTS; + // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; + // case DIAMOND: return Material.DIAMOND; + // default : return null; + // } + // } + + public static int getItemAmount(ItemStack[] items, ItemStack is) { + int count = 0; + for (ItemStack item : items) { + if (item == null) { + continue; + } + if (item.getType() == is.getType() + && ((item.getDurability() == is.getDurability() || item + .getDurability() == -1))) { + count += item.getAmount(); + } + } + return count; + } + + public static ItemStack getItemStack(String name) { + if (name == null || name.isEmpty()) { + return null; + } + name = name.replace(" ", "_"); + name = name.replace(":", ";"); + + int dataIndex = name.indexOf(';'); + dataIndex = (dataIndex != -1 ? dataIndex : -1); + int dataValue = 0; + if (dataIndex != -1) { + dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer + .parseInt(name.substring(dataIndex + 1)) : 0); + name = name.substring(0, dataIndex); + } + + dataValue = dataValue < 0 ? 0 : dataValue; + Material mat = getMat(name); + + if (mat != null && mat != Material.AIR) { + return new ItemStack(mat, 0, (short) dataValue); + } + return null; + } + + public static boolean isInt(String i) { + try { + Integer.parseInt(i); + return true; + } catch (Exception e) { + return false; + } + } + + public static boolean isFloat(String i) { + try { + Float.parseFloat(i); + return true; + } catch (Exception e) { + return false; + } + } + + // / Get the Material + public static Material getMat(String name) { + Integer id = null; + try { + id = Integer.parseInt(name); + } catch (Exception e) { + } + if (id == null) { + id = getMaterialID(name); + } + return id != null && id >= 0 ? Material.getMaterial(id) : null; + } + + // / This allows for abbreviations to work, useful for sign etc + public static int getMaterialID(String name) { + name = name.toUpperCase(); + // / First try just getting it from the Material Name + Material mat = Material.getMaterial(name); + if (mat != null) { + return mat.getId(); + } + // / Might be an abbreviation, or a more complicated + int temp = Integer.MAX_VALUE; + mat = null; + name = name.replaceAll("\\s+", "").replaceAll("_", ""); + for (Material m : Material.values()) { + if (m.name().replaceAll("_", "").startsWith(name)) { + if (m.name().length() < temp) { + mat = m; + temp = m.name().length(); + } + } + } + return mat != null ? mat.getId() : -1; + } + + public static boolean hasItem(Player p, ItemStack itemType) { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) { + if (is != null && is.getType() == itemType.getType()) { + return true; + } + } + for (ItemStack is : inv.getArmorContents()) { + if (is != null && is.getType() == itemType.getType()) { + return true; + } + } + return false; + } + + public static boolean hasAnyItem(Player p) { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) { + if (is != null && is.getType() != Material.AIR) { + // System.out.println("item=" + is); + return true; + } + } + for (ItemStack is : inv.getArmorContents()) { + if (is != null && is.getType() != Material.AIR) { + // System.out.println("item=" + is); + return true; + } + } + + return false; + } + + public static void addItemToInventory(Player player, ItemStack itemStack) { + addItemToInventory(player, itemStack, itemStack.getAmount(), true, + false); + } + + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount) { + addItemToInventory(player, itemStack, stockAmount, true, false); + } + + @SuppressWarnings("deprecation") + public static void addItemsToInventory(Player p, List items, + boolean ignoreHelmet) { + for (ItemStack is : items) { + InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), + false, false); + } + try { + p.updateInventory(); + } catch (Exception e) { + } + } + + @SuppressWarnings("deprecation") + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount, boolean update, boolean ignoreHelmet) { + PlayerInventory inv = player.getInventory(); + Material itemType = itemStack.getType(); + if (armor.containsKey(itemType)) { + // / no item: add to armor slot + // / item better: add old to inventory, new to armor slot + // / item notbetter: add to inventory + ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); + boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); + boolean better = empty ? false : armorSlotBetter( + armor.get(oldArmor.getType()), armor.get(itemType)); + final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; + if (empty || better) { + switch (armor.get(itemType).type) { + case HELM: + inv.setHelmet(itemStack); + break; + case CHEST: + inv.setChestplate(itemStack); + break; + case LEGGINGS: + inv.setLeggings(itemStack); + break; + case BOOTS: + inv.setBoots(itemStack); + break; + } + } + if (!empty) { + if (better && (!isHelmet && ignoreHelmet)) { + addItemToInventory(inv, oldArmor, oldArmor.getAmount()); + } else { + addItemToInventory(inv, itemStack, stockAmount); + } + } + } else { + addItemToInventory(inv, itemStack, stockAmount); + } + if (update) { + try { + player.updateInventory(); + } catch (Exception e) { + } + } + } + + private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) { + if (oldArmor == null || newArmor == null) // / technically we could + // throw an exception.. but + // nah + { + return false; + } + return oldArmor.level.ordinal() < newArmor.level.ordinal(); + } + + private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) { + switch (armor.type) { + case HELM: + return inv.getHelmet(); + case CHEST: + return inv.getChestplate(); + case LEGGINGS: + return inv.getLeggings(); + case BOOTS: + return inv.getBoots(); + } + return null; + } + + // /Adds item to inventory + public static void addItemToInventory(Inventory inv, ItemStack is, int left) { + int maxStackSize = is.getType().getMaxStackSize(); + if (left <= maxStackSize) { + is.setAmount(left); + inv.addItem(is); + return; + } + + if (maxStackSize != 64) { + ArrayList items = new ArrayList(); + for (int i = 0; i < Math.ceil(left / maxStackSize); i++) { + if (left < maxStackSize) { + is.setAmount(left); + items.add(is); + return; + } else { + is.setAmount(maxStackSize); + items.add(is); + } + } + Object[] iArray = items.toArray(); + for (Object o : iArray) { + inv.addItem((ItemStack) o); + } + } else { + inv.addItem(is); + } + } + + public static void closeInventory(Player p) { + + try { + p.closeInventory(); + } catch (Exception closeInventoryError) { + // / This almost always throws an NPE, but does its job so ignore + } + } + + public static void clearInventory(Player p) { + try { + PlayerInventory inv = p.getInventory(); + closeInventory(p); + + if (inv != null) { + inv.clear(); + inv.setArmorContents(null); + inv.setItemInHand(null); + } + } catch (Exception ee) { + ee.printStackTrace(); + } + } + + public static Object getCommonName(ItemStack is) { + int id = is.getTypeId(); + int datavalue = is.getDurability(); + if (datavalue > 0) { + return Material.getMaterial(id).toString() + ":" + datavalue; + } + return Material.getMaterial(id).toString(); + } + + public static boolean isItem(String str) { + // System.out.println("string = " + str); + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + + debug("item=" + str); + + ItemStack is = null; + try { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + is.setAmount(Integer.valueOf(split[split.length - 1])); + for (int i = 1; i < split.length - 1; i++) { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) { + return false; + } + } + } catch (Exception e) { + return false; + } + return true; + } + + public static ItemStack parseItem(String str) throws Exception { + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + + debug("item=" + str); + + ItemStack is = null; + try { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + // System.out.println(" split = " + split); + final int amt = split.length > 1 ? Integer + .valueOf(split[split.length - 1]) : 1; + is.setAmount(amt); + for (int i = 1; i < split.length - 1; i++) { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) { + Logger.getLogger("minecraft").warning( + ewl + " can not be applied to the item " + str); + } + } + } catch (Exception e) { + e.printStackTrace(); + Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); + throw new Exception("parse item was bad"); + } + return is; + } + + public static EnchantmentWithLevel getEnchantment(String str) { + if (str.equalsIgnoreCase("all")) { + return new EnchantmentWithLevel(true); + } + Enchantment e = null; + str = str.replaceAll(",", ":"); + int index = str.indexOf(':'); + index = (index != -1 ? index : -1); + int lvl = -1; + if (index != -1) { + try { + lvl = Integer.parseInt(str.substring(index + 1)); + } catch (Exception err) { + } + str = str.substring(0, index); + } + + // System.out.println("String = <" + str +"> " + lvl); + try { + e = Enchantment.getById(Integer.valueOf(str)); + } catch (Exception err) { + } + if (e == null) { + e = Enchantment.getByName(str); + } + if (e == null) { + e = getEnchantmentByCommonName(str); + } + if (e == null) { + return null; + } + EnchantmentWithLevel ewl = new EnchantmentWithLevel(); + ewl.e = e; + if (lvl < e.getStartLevel()) { + lvl = e.getStartLevel(); + } + if (lvl > e.getMaxLevel()) { + lvl = e.getMaxLevel(); + } + ewl.lvl = lvl; + return ewl; + } + + public boolean addEnchantments(ItemStack is, String[] args) { + Map encs = new HashMap(); + for (String s : args) { + EnchantmentWithLevel ewl = getEnchantment(s); + if (ewl != null) { + if (ewl.all) { + return addAllEnchantments(is); + } + encs.put(ewl.e, ewl.lvl); + } + } + addEnchantments(is, encs); + return true; + } + + public void addEnchantments(ItemStack is, + Map enchantments) { + for (Enchantment e : enchantments.keySet()) { + if (e.canEnchantItem(is)) { + is.addUnsafeEnchantment(e, enchantments.get(e)); + } + } + } + + public boolean addAllEnchantments(ItemStack is) { + for (Enchantment enc : Enchantment.values()) { + if (enc.canEnchantItem(is)) { + is.addUnsafeEnchantment(enc, enc.getMaxLevel()); + } + } + return true; + } + + /** + * For Serializing an item or printing + * + * @param is + * @return + */ + public static String getItemString(ItemStack is) { + if (is == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); + Map encs = is.getEnchantments(); + for (Enchantment enc : encs.keySet()) { + sb.append(enc.getName() + ":" + encs.get(enc) + " "); + } + sb.append(is.getAmount()); + return sb.toString(); + } + + public static boolean hasEnchantedItem(Player p) { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) { + if (is != null && is.getType() != Material.AIR) { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) { + return true; + } + } + } + for (ItemStack is : inv.getArmorContents()) { + if (is != null && is.getType() != Material.AIR) { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) { + return true; + } + } + } + return false; + } + + public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) { + Armor a = armor.get(is.getType()); + if (a == null) { + return false; + } + return a.level == lvl; + } + + public static ItemStack getWool(int color) { + return new ItemStack(Material.WOOL, 1, (short) color); + } + + private static void debug(String output) { + if (DEBUG) { + System.out.println(output); + } + } } From c1bcb2173fd098df5bf53ec484e63c02588f351b Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 00:16:26 -0500 Subject: [PATCH 41/74] Deleted NMS classes nms.{version}.CustomCommandExecutor nms.{version}.PlayerExecutor nms.{version}.PlayerListener nms.{version}.Util nms.{version}.VPBaseExecutor nms.{version}.VPExecutor Previously, these classes all relied on version dependent CraftVirtualPlayer. With the introduction of the VirtualPlayer interface, we can consolidate all these classes, and make them version independent. - module/util has become module/api - module/api contains the interfaces & utilities. --- modules/util/pom.xml | 52 -- .../virtualplayers/util/InventoryUtil.java | 718 ---------------- .../mc/alk/virtualplayers/util/AppTest.java | 38 - .../nms/v1_4_5/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_4_5/PlayerExecutor.java | 403 --------- .../nms/v1_4_5/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_4_5/Util.java | 58 -- .../nms/v1_4_5/VPBaseExecutor.java | 115 --- .../virtualplayers/nms/v1_4_5/VPExecutor.java | 74 -- .../nms/v1_4_6/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_4_6/PlayerExecutor.java | 403 --------- .../nms/v1_4_6/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_4_6/Util.java | 58 -- .../nms/v1_4_6/VPBaseExecutor.java | 115 --- .../virtualplayers/nms/v1_4_6/VPExecutor.java | 74 -- .../nms/v1_4_R1/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_4_R1/PlayerExecutor.java | 403 --------- .../nms/v1_4_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_4_R1/Util.java | 58 -- .../nms/v1_4_R1/VPBaseExecutor.java | 115 --- .../nms/v1_4_R1/VPExecutor.java | 74 -- .../nms/v1_5_R1/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_5_R1/PlayerExecutor.java | 403 --------- .../nms/v1_5_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_5_R1/Util.java | 58 -- .../nms/v1_5_R1/VPBaseExecutor.java | 115 --- .../nms/v1_5_R1/VPExecutor.java | 74 -- .../nms/v1_5_R2/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_5_R2/PlayerExecutor.java | 433 ---------- .../nms/v1_5_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_5_R2/Util.java | 58 -- .../nms/v1_5_R2/VPBaseExecutor.java | 115 --- .../nms/v1_5_R2/VPExecutor.java | 74 -- .../nms/v1_5_R3/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_5_R3/PlayerExecutor.java | 433 ---------- .../nms/v1_5_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_5_R3/Util.java | 58 -- .../nms/v1_5_R3/VPBaseExecutor.java | 115 --- .../nms/v1_5_R3/VPExecutor.java | 74 -- .../nms/v1_6_R1/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_6_R1/PlayerExecutor.java | 433 ---------- .../nms/v1_6_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_6_R1/Util.java | 58 -- .../nms/v1_6_R1/VPBaseExecutor.java | 115 --- .../nms/v1_6_R1/VPExecutor.java | 74 -- .../nms/v1_6_R2/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_6_R2/PlayerExecutor.java | 433 ---------- .../nms/v1_6_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_6_R2/Util.java | 58 -- .../nms/v1_6_R2/VPBaseExecutor.java | 115 --- .../nms/v1_6_R2/VPExecutor.java | 74 -- .../nms/v1_6_R3/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_6_R3/PlayerExecutor.java | 433 ---------- .../nms/v1_6_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_6_R3/Util.java | 58 -- .../nms/v1_6_R3/VPBaseExecutor.java | 115 --- .../nms/v1_6_R3/VPExecutor.java | 74 -- .../nms/v1_7_R1/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_7_R1/PlayerExecutor.java | 433 ---------- .../nms/v1_7_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R1/Util.java | 58 -- .../nms/v1_7_R1/VPBaseExecutor.java | 115 --- .../nms/v1_7_R1/VPExecutor.java | 74 -- .../nms/v1_7_R2/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_7_R2/PlayerExecutor.java | 433 ---------- .../nms/v1_7_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R2/Util.java | 59 -- .../nms/v1_7_R2/VPBaseExecutor.java | 115 --- .../nms/v1_7_R2/VPExecutor.java | 74 -- .../nms/v1_7_R3/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_7_R3/PlayerExecutor.java | 434 ---------- .../nms/v1_7_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R3/Util.java | 58 -- .../nms/v1_7_R3/VPBaseExecutor.java | 115 --- .../nms/v1_7_R3/VPExecutor.java | 74 -- .../nms/v1_7_R4/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_7_R4/PlayerExecutor.java | 455 ----------- .../nms/v1_7_R4/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_7_R4/Util.java | 58 -- .../nms/v1_7_R4/VPBaseExecutor.java | 115 --- .../nms/v1_7_R4/VPExecutor.java | 74 -- .../nms/v1_8_R1/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_8_R1/PlayerExecutor.java | 451 ---------- .../nms/v1_8_R1/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_8_R1/Util.java | 58 -- .../nms/v1_8_R1/VPBaseExecutor.java | 115 --- .../nms/v1_8_R1/VPExecutor.java | 74 -- .../nms/v1_8_R2/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_8_R2/PlayerExecutor.java | 451 ---------- .../nms/v1_8_R2/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_8_R2/Util.java | 58 -- .../nms/v1_8_R2/VPBaseExecutor.java | 115 --- .../nms/v1_8_R2/VPExecutor.java | 74 -- .../nms/v1_8_R3/CustomCommandExecutor.java | 772 ------------------ .../nms/v1_8_R3/PlayerExecutor.java | 451 ---------- .../nms/v1_8_R3/PlayerListener.java | 55 -- .../alk/virtualplayers/nms/v1_8_R3/Util.java | 58 -- .../nms/v1_8_R3/VPBaseExecutor.java | 115 --- .../nms/v1_8_R3/VPExecutor.java | 74 -- .../nms/pre/CustomCommandExecutor.java | 772 ------------------ .../nms/pre/PlayerExecutor.java | 403 --------- .../nms/pre/PlayerListener.java | 55 -- .../mc/alk/virtualplayers/nms/pre/Util.java | 58 -- .../nms/pre/VPBaseExecutor.java | 115 --- .../virtualplayers/nms/pre/VPExecutor.java | 74 -- 105 files changed, 26355 deletions(-) delete mode 100644 modules/util/pom.xml delete mode 100644 modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java delete mode 100644 modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java delete mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java delete mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java delete mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java delete mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java delete mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java delete mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java delete mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java delete mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java delete mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java delete mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java delete mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java delete mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java delete mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java delete mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java delete mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java delete mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java delete mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java delete mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java delete mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java delete mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java delete mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java delete mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java delete mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java delete mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java delete mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java delete mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java delete mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java delete mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java delete mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java delete mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java delete mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java delete mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java delete mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java delete mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java delete mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java delete mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java diff --git a/modules/util/pom.xml b/modules/util/pom.xml deleted file mode 100644 index 4807ce0..0000000 --- a/modules/util/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-util - parent - jar - - virtualplayers-util - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - - - - org.bukkit - bukkit - 1.7.2-R0.3 - provided - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-Util - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java deleted file mode 100644 index 2c55b0d..0000000 --- a/modules/util/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java +++ /dev/null @@ -1,718 +0,0 @@ -package mc.alk.virtualplayers.util; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; - -public class InventoryUtil { - - static final String version = "InventoryUtil 2.1.4"; - static final boolean DEBUG = false; - static final Map armor = initArmor(); - - public enum ArmorType { - - HELM, CHEST, LEGGINGS, BOOTS; - } - - public enum ArmorLevel { - - WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND; - } - - public static class Armor { - - public ArmorLevel level; - public ArmorType type; - - Armor(ArmorType at, ArmorLevel al) { - this.level = al; - this.type = at; - } - } - - public static class EnchantmentWithLevel { - - public EnchantmentWithLevel() { - } - - public EnchantmentWithLevel(boolean all) { - this.all = all; - } - - public Enchantment e; - public Integer lvl; - boolean all = false; - - @Override - public String toString() { - return (e != null ? e.getName() : "null") + ":" + lvl; - } - } - - private static Map initArmor() { - Map temp = new HashMap(); // or EnumMap - temp.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); - temp.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.LEATHER)); - temp.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.IRON)); - temp.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.GOLD)); - temp.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.DIAMOND)); - temp.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, - ArmorLevel.CHAINMAIL)); - - temp.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.LEATHER)); - temp.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.IRON)); - temp.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.GOLD)); - temp.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.DIAMOND)); - temp.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, - ArmorLevel.CHAINMAIL)); - - temp.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.LEATHER)); - temp.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.IRON)); - temp.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.GOLD)); - temp.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.DIAMOND)); - temp.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, - ArmorLevel.CHAINMAIL)); - - temp.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.LEATHER)); - temp.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.IRON)); - temp.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.GOLD)); - temp.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.DIAMOND)); - temp.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, - ArmorLevel.CHAINMAIL)); - return temp; - } - - public static Enchantment getEnchantmentByCommonName(String iname) { - iname = iname.toLowerCase(); - if (iname.contains("smite")) { - return Enchantment.getByName("DAMAGE_UNDEAD"); - } - if (iname.contains("sharp")) { - return Enchantment.getByName("DAMAGE_ALL"); - } - if (iname.contains("fire") && iname.contains("prot")) { - return Enchantment.getByName("PROTECTION_FIRE"); - } - if (iname.contains("fire")) { - return Enchantment.getByName("FIRE_ASPECT"); - } - if (iname.contains("exp") && iname.contains("prot")) { - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - } - if (iname.contains("blast") && iname.contains("prot")) { - return Enchantment.getByName("PROTECTION_EXPLOSIONS"); - } - if (iname.contains("arrow") && iname.contains("prot")) { - return Enchantment.getByName("PROTECTION_PROJECTILE"); - } - if (iname.contains("proj") && iname.contains("prot")) { - return Enchantment.getByName("PROTECTION_PROJECTILE"); - } - if (iname.contains("respiration")) { - return Enchantment.getByName("OXYGEN"); - } - if (iname.contains("fall")) { - return Enchantment.getByName("PROTECTION_FALL"); - } - if (iname.contains("prot")) { - return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); - } - if (iname.contains("respiration")) { - return Enchantment.getByName("OXYGEN"); - } - if (iname.contains("oxygen")) { - return Enchantment.getByName("OXYGEN"); - } - if (iname.contains("aqua")) { - return Enchantment.getByName("WATER_WORKER"); - } - if (iname.contains("arth")) { - return Enchantment.getByName("DAMAGE_ARTHROPODS"); - } - if (iname.contains("knockback")) { - return Enchantment.getByName("KNOCKBACK"); - } - if (iname.contains("loot")) { - return Enchantment.getByName("LOOT_BONUS_MOBS"); - } - if (iname.contains("dig")) { - return Enchantment.getByName("DIG_SPEED"); - } - if (iname.contains("silk")) { - return Enchantment.getByName("SILK_TOUCH"); - } - if (iname.contains("unbreaking")) { - return Enchantment.getByName("DURABILITY"); - } - if (iname.contains("dura")) { - return Enchantment.getByName("DURABILITY"); - } - return null; - } - - public static int arrowCount(Player p) { - return getItemAmount(p.getInventory().getContents(), new ItemStack( - Material.ARROW, 1)); - } - - public static int getItemAmountFromInventory(Inventory inv, ItemStack is) { - return getItemAmount(inv.getContents(), is); - } - - public static boolean hasArmor(Player p) { - PlayerInventory pi = p.getInventory(); - return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) - && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi - .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); - } - - public static ArmorLevel hasArmorSet(List inv) { - ArmorLevel armorSet[] = new ArmorLevel[4]; - for (ItemStack is : inv) { - Armor a = armor.get(is.getType()); - if (a == null) { - continue; - } - switch (a.type) { - case BOOTS: - armorSet[0] = a.level; - break; - case LEGGINGS: - armorSet[1] = a.level; - break; - case CHEST: - armorSet[2] = a.level; - break; - case HELM: - armorSet[3] = a.level; - break; - } - } - ArmorLevel lvl = null; - for (ArmorLevel a : armorSet) { - if (lvl == null) { - lvl = a; - } else if (lvl != a) { - return null; - } - } - return lvl; - } - - // - // private static Material getMaterial(ArmorLevel level) { - // switch(level){ - // case WOOL: return Material.WOOL; - // case LEATHER : return Material.LEATHER; - // case IRON: return Material.IRON_BOOTS; - // case GOLD : return Material.GOLD_BOOTS; - // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; - // case DIAMOND: return Material.DIAMOND; - // default : return null; - // } - // } - - public static int getItemAmount(ItemStack[] items, ItemStack is) { - int count = 0; - for (ItemStack item : items) { - if (item == null) { - continue; - } - if (item.getType() == is.getType() - && ((item.getDurability() == is.getDurability() || item - .getDurability() == -1))) { - count += item.getAmount(); - } - } - return count; - } - - public static ItemStack getItemStack(String name) { - if (name == null || name.isEmpty()) { - return null; - } - name = name.replace(" ", "_"); - name = name.replace(":", ";"); - - int dataIndex = name.indexOf(';'); - dataIndex = (dataIndex != -1 ? dataIndex : -1); - int dataValue = 0; - if (dataIndex != -1) { - dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer - .parseInt(name.substring(dataIndex + 1)) : 0); - name = name.substring(0, dataIndex); - } - - dataValue = dataValue < 0 ? 0 : dataValue; - Material mat = getMat(name); - - if (mat != null && mat != Material.AIR) { - return new ItemStack(mat, 0, (short) dataValue); - } - return null; - } - - public static boolean isInt(String i) { - try { - Integer.parseInt(i); - return true; - } catch (Exception e) { - return false; - } - } - - public static boolean isFloat(String i) { - try { - Float.parseFloat(i); - return true; - } catch (Exception e) { - return false; - } - } - - // / Get the Material - public static Material getMat(String name) { - Integer id = null; - try { - id = Integer.parseInt(name); - } catch (Exception e) { - } - if (id == null) { - id = getMaterialID(name); - } - return id != null && id >= 0 ? Material.getMaterial(id) : null; - } - - // / This allows for abbreviations to work, useful for sign etc - public static int getMaterialID(String name) { - name = name.toUpperCase(); - // / First try just getting it from the Material Name - Material mat = Material.getMaterial(name); - if (mat != null) { - return mat.getId(); - } - // / Might be an abbreviation, or a more complicated - int temp = Integer.MAX_VALUE; - mat = null; - name = name.replaceAll("\\s+", "").replaceAll("_", ""); - for (Material m : Material.values()) { - if (m.name().replaceAll("_", "").startsWith(name)) { - if (m.name().length() < temp) { - mat = m; - temp = m.name().length(); - } - } - } - return mat != null ? mat.getId() : -1; - } - - public static boolean hasItem(Player p, ItemStack itemType) { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) { - if (is != null && is.getType() == itemType.getType()) { - return true; - } - } - for (ItemStack is : inv.getArmorContents()) { - if (is != null && is.getType() == itemType.getType()) { - return true; - } - } - return false; - } - - public static boolean hasAnyItem(Player p) { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) { - if (is != null && is.getType() != Material.AIR) { - // System.out.println("item=" + is); - return true; - } - } - for (ItemStack is : inv.getArmorContents()) { - if (is != null && is.getType() != Material.AIR) { - // System.out.println("item=" + is); - return true; - } - } - - return false; - } - - public static void addItemToInventory(Player player, ItemStack itemStack) { - addItemToInventory(player, itemStack, itemStack.getAmount(), true, - false); - } - - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount) { - addItemToInventory(player, itemStack, stockAmount, true, false); - } - - @SuppressWarnings("deprecation") - public static void addItemsToInventory(Player p, List items, - boolean ignoreHelmet) { - for (ItemStack is : items) { - InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), - false, false); - } - try { - p.updateInventory(); - } catch (Exception e) { - } - } - - @SuppressWarnings("deprecation") - public static void addItemToInventory(Player player, ItemStack itemStack, - int stockAmount, boolean update, boolean ignoreHelmet) { - PlayerInventory inv = player.getInventory(); - Material itemType = itemStack.getType(); - if (armor.containsKey(itemType)) { - // / no item: add to armor slot - // / item better: add old to inventory, new to armor slot - // / item notbetter: add to inventory - ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); - boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); - boolean better = empty ? false : armorSlotBetter( - armor.get(oldArmor.getType()), armor.get(itemType)); - final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; - if (empty || better) { - switch (armor.get(itemType).type) { - case HELM: - inv.setHelmet(itemStack); - break; - case CHEST: - inv.setChestplate(itemStack); - break; - case LEGGINGS: - inv.setLeggings(itemStack); - break; - case BOOTS: - inv.setBoots(itemStack); - break; - } - } - if (!empty) { - if (better && (!isHelmet && ignoreHelmet)) { - addItemToInventory(inv, oldArmor, oldArmor.getAmount()); - } else { - addItemToInventory(inv, itemStack, stockAmount); - } - } - } else { - addItemToInventory(inv, itemStack, stockAmount); - } - if (update) { - try { - player.updateInventory(); - } catch (Exception e) { - } - } - } - - private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) { - if (oldArmor == null || newArmor == null) // / technically we could - // throw an exception.. but - // nah - { - return false; - } - return oldArmor.level.ordinal() < newArmor.level.ordinal(); - } - - private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) { - switch (armor.type) { - case HELM: - return inv.getHelmet(); - case CHEST: - return inv.getChestplate(); - case LEGGINGS: - return inv.getLeggings(); - case BOOTS: - return inv.getBoots(); - } - return null; - } - - // /Adds item to inventory - public static void addItemToInventory(Inventory inv, ItemStack is, int left) { - int maxStackSize = is.getType().getMaxStackSize(); - if (left <= maxStackSize) { - is.setAmount(left); - inv.addItem(is); - return; - } - - if (maxStackSize != 64) { - ArrayList items = new ArrayList(); - for (int i = 0; i < Math.ceil(left / maxStackSize); i++) { - if (left < maxStackSize) { - is.setAmount(left); - items.add(is); - return; - } else { - is.setAmount(maxStackSize); - items.add(is); - } - } - Object[] iArray = items.toArray(); - for (Object o : iArray) { - inv.addItem((ItemStack) o); - } - } else { - inv.addItem(is); - } - } - - public static void closeInventory(Player p) { - - try { - p.closeInventory(); - } catch (Exception closeInventoryError) { - // / This almost always throws an NPE, but does its job so ignore - } - } - - public static void clearInventory(Player p) { - try { - PlayerInventory inv = p.getInventory(); - closeInventory(p); - - if (inv != null) { - inv.clear(); - inv.setArmorContents(null); - inv.setItemInHand(null); - } - } catch (Exception ee) { - ee.printStackTrace(); - } - } - - public static Object getCommonName(ItemStack is) { - int id = is.getTypeId(); - int datavalue = is.getDurability(); - if (datavalue > 0) { - return Material.getMaterial(id).toString() + ":" + datavalue; - } - return Material.getMaterial(id).toString(); - } - - public static boolean isItem(String str) { - // System.out.println("string = " + str); - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - - debug("item=" + str); - - ItemStack is = null; - try { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - is.setAmount(Integer.valueOf(split[split.length - 1])); - for (int i = 1; i < split.length - 1; i++) { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) { - return false; - } - } - } catch (Exception e) { - return false; - } - return true; - } - - public static ItemStack parseItem(String str) throws Exception { - str = str.replaceAll("[}{]", ""); - str = str.replaceAll("=", " "); - - debug("item=" + str); - - ItemStack is = null; - try { - String split[] = str.split(" "); - is = InventoryUtil.getItemStack(split[0].trim()); - // System.out.println(" split = " + split); - final int amt = split.length > 1 ? Integer - .valueOf(split[split.length - 1]) : 1; - is.setAmount(amt); - for (int i = 1; i < split.length - 1; i++) { - EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); - try { - is.addEnchantment(ewl.e, ewl.lvl); - } catch (IllegalArgumentException iae) { - Logger.getLogger("minecraft").warning( - ewl + " can not be applied to the item " + str); - } - } - } catch (Exception e) { - e.printStackTrace(); - Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); - throw new Exception("parse item was bad"); - } - return is; - } - - public static EnchantmentWithLevel getEnchantment(String str) { - if (str.equalsIgnoreCase("all")) { - return new EnchantmentWithLevel(true); - } - Enchantment e = null; - str = str.replaceAll(",", ":"); - int index = str.indexOf(':'); - index = (index != -1 ? index : -1); - int lvl = -1; - if (index != -1) { - try { - lvl = Integer.parseInt(str.substring(index + 1)); - } catch (Exception err) { - } - str = str.substring(0, index); - } - - // System.out.println("String = <" + str +"> " + lvl); - try { - e = Enchantment.getById(Integer.valueOf(str)); - } catch (Exception err) { - } - if (e == null) { - e = Enchantment.getByName(str); - } - if (e == null) { - e = getEnchantmentByCommonName(str); - } - if (e == null) { - return null; - } - EnchantmentWithLevel ewl = new EnchantmentWithLevel(); - ewl.e = e; - if (lvl < e.getStartLevel()) { - lvl = e.getStartLevel(); - } - if (lvl > e.getMaxLevel()) { - lvl = e.getMaxLevel(); - } - ewl.lvl = lvl; - return ewl; - } - - public boolean addEnchantments(ItemStack is, String[] args) { - Map encs = new HashMap(); - for (String s : args) { - EnchantmentWithLevel ewl = getEnchantment(s); - if (ewl != null) { - if (ewl.all) { - return addAllEnchantments(is); - } - encs.put(ewl.e, ewl.lvl); - } - } - addEnchantments(is, encs); - return true; - } - - public void addEnchantments(ItemStack is, - Map enchantments) { - for (Enchantment e : enchantments.keySet()) { - if (e.canEnchantItem(is)) { - is.addUnsafeEnchantment(e, enchantments.get(e)); - } - } - } - - public boolean addAllEnchantments(ItemStack is) { - for (Enchantment enc : Enchantment.values()) { - if (enc.canEnchantItem(is)) { - is.addUnsafeEnchantment(enc, enc.getMaxLevel()); - } - } - return true; - } - - /** - * For Serializing an item or printing - * - * @param is - * @return - */ - public static String getItemString(ItemStack is) { - if (is == null) { - return null; - } - StringBuilder sb = new StringBuilder(); - sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); - Map encs = is.getEnchantments(); - for (Enchantment enc : encs.keySet()) { - sb.append(enc.getName() + ":" + encs.get(enc) + " "); - } - sb.append(is.getAmount()); - return sb.toString(); - } - - public static boolean hasEnchantedItem(Player p) { - PlayerInventory inv = p.getInventory(); - for (ItemStack is : inv.getContents()) { - if (is != null && is.getType() != Material.AIR) { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) { - return true; - } - } - } - for (ItemStack is : inv.getArmorContents()) { - if (is != null && is.getType() != Material.AIR) { - Map enc = is.getEnchantments(); - if (enc != null && !enc.isEmpty()) { - return true; - } - } - } - return false; - } - - public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) { - Armor a = armor.get(is.getType()); - if (a == null) { - return false; - } - return a.level == lvl; - } - - public static ItemStack getWool(int color) { - return new ItemStack(Material.WOOL, 1, (short) color); - } - - private static void debug(String output) { - if (DEBUG) { - System.out.println(output); - } - } -} diff --git a/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java b/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java deleted file mode 100644 index 06f0fef..0000000 --- a/modules/util/src/test/java/mc/alk/virtualplayers/util/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.util; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - * - public static Test suite() - { - return new TestSuite( InventoryUtil.class ); - } */ - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java deleted file mode 100644 index 0c388b2..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java deleted file mode 100644 index 72ab4a7..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_4_5.DamageSource; -import net.minecraft.server.v1_4_5.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_4_5.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java deleted file mode 100644 index d6b8746..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java deleted file mode 100644 index 856fba0..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java deleted file mode 100644 index 488d838..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java deleted file mode 100644 index 10a671f..0000000 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_5; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java deleted file mode 100644 index d1717c6..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java deleted file mode 100644 index e220368..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_4_6.DamageSource; -import net.minecraft.server.v1_4_6.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_4_6.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java deleted file mode 100644 index 97e37de..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java deleted file mode 100644 index 5b9509e..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java deleted file mode 100644 index 910e559..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java deleted file mode 100644 index 82206ae..0000000 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_6; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java deleted file mode 100644 index 5142043..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java deleted file mode 100644 index 977420b..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_4_R1.DamageSource; -import net.minecraft.server.v1_4_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java deleted file mode 100644 index 7283146..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java deleted file mode 100644 index 2b7837b..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java deleted file mode 100644 index 9b9e3f1..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java deleted file mode 100644 index a134b82..0000000 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_4_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java deleted file mode 100644 index 6132c6b..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java deleted file mode 100644 index df13c24..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_5_R1.DamageSource; -import net.minecraft.server.v1_5_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java deleted file mode 100644 index 96c1403..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java deleted file mode 100644 index 3a57f82..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java deleted file mode 100644 index 7d4d263..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java deleted file mode 100644 index d786283..0000000 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java deleted file mode 100644 index a638486..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java deleted file mode 100644 index 8fbd215..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_5_R2.DamageSource; -import net.minecraft.server.v1_5_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java deleted file mode 100644 index d485405..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java deleted file mode 100644 index c31484c..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java deleted file mode 100644 index 1da776b..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java deleted file mode 100644 index 6f92eca..0000000 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R2; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java deleted file mode 100644 index 9f93945..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java deleted file mode 100644 index 0d955a5..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_5_R3.DamageSource; -import net.minecraft.server.v1_5_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java deleted file mode 100644 index 030de7c..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java deleted file mode 100644 index 6c07170..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java deleted file mode 100644 index f8a6a34..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java deleted file mode 100644 index 08f34f5..0000000 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_5_R3; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java deleted file mode 100644 index 5d78426..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java deleted file mode 100644 index 8e38b20..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_6_R1.DamageSource; -import net.minecraft.server.v1_6_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java deleted file mode 100644 index 09feb10..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java deleted file mode 100644 index 221b4d1..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java deleted file mode 100644 index 2b0c612..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java deleted file mode 100644 index 12830da..0000000 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java deleted file mode 100644 index 8c4d4ad..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java deleted file mode 100644 index 6538088..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_6_R2.DamageSource; -import net.minecraft.server.v1_6_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java deleted file mode 100644 index 0f5f314..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java deleted file mode 100644 index 8db50d8..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java deleted file mode 100644 index b58f96d..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java deleted file mode 100644 index 74ee57c..0000000 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R2; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java deleted file mode 100644 index 7eb4e9c..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java deleted file mode 100644 index 4fadd27..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_6_R3.DamageSource; -import net.minecraft.server.v1_6_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java deleted file mode 100644 index a59561d..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java deleted file mode 100644 index 41e492b..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java deleted file mode 100644 index e6aef4a..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java deleted file mode 100644 index 95d4c29..0000000 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_6_R3; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java deleted file mode 100644 index 123607c..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java deleted file mode 100644 index fb17fde..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_7_R1.DamageSource; -import net.minecraft.server.v1_7_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java deleted file mode 100644 index ddf255b..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java deleted file mode 100644 index 7b1bc7d..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java deleted file mode 100644 index 6f49191..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java deleted file mode 100644 index 728c428..0000000 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R1; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java deleted file mode 100644 index 8049ac6..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java deleted file mode 100644 index 0db7017..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerExecutor.java +++ /dev/null @@ -1,433 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_7_R2.DamageSource; -import net.minecraft.server.v1_7_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java deleted file mode 100644 index 99417d1..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java deleted file mode 100644 index 8a7f897..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/Util.java +++ /dev/null @@ -1,59 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import mc.alk.virtualplayers.nms.v1_7_R2.VirtualPlayer; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java deleted file mode 100644 index de964cd..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java deleted file mode 100644 index 8232635..0000000 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R2; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java deleted file mode 100644 index 7e55d67..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java deleted file mode 100644 index e7aeed7..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerExecutor.java +++ /dev/null @@ -1,434 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_7_R3.DamageSource; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin p) { - super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"),1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java deleted file mode 100644 index 2d4bdc2..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java deleted file mode 100644 index ea4d748..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java deleted file mode 100644 index 57dd9a0..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java deleted file mode 100644 index 3b0b617..0000000 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R3; - -import org.bukkit.command.CommandSender; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java deleted file mode 100644 index 569075e..0000000 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R4; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java deleted file mode 100644 index 95aa09f..0000000 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerExecutor.java +++ /dev/null @@ -1,455 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R4; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_7_R4.DamageSource; -import net.minecraft.server.v1_7_R4.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.ChatColor; -import org.bukkit.entity.Entity; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin p) { - super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"),1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) - continue; - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - - System.out.println("sender = " + sender.getName()); - System.out.println("vp = " + vp.getName()); - System.out.println("args = " + args.toString()); - System.out.println("players = " + players.toString()); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; - sendMessage(sender, message); - // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent event = new EntityDamageEvent( - damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damagee.getHealth() - h); - /* - EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, - null, - null); */ - if (!event.isCancelled() || force) { - damagee.setLastDamageCause(event); - damagee.setHealth(damagee.getHealth() - event.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = new EntityDamageByEntityEvent( - damager, damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damage); - /* - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((Entity) ((CraftPlayer) damager).getHandle()), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - */ - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java deleted file mode 100644 index 6b3ecec..0000000 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R4; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java deleted file mode 100644 index 52ec6ef..0000000 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R4; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java deleted file mode 100644 index 448d40f..0000000 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R4; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java deleted file mode 100644 index 2f634ed..0000000 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_7_R4; - -import org.bukkit.command.CommandSender; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java deleted file mode 100644 index e4b64f6..0000000 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java deleted file mode 100644 index 2dc081c..0000000 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerExecutor.java +++ /dev/null @@ -1,451 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R1; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_8_R1.DamageSource; -import net.minecraft.server.v1_8_R1.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.ChatColor; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin p) { - super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - - } - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) { - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - } - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) { - continue; - } - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak) { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - - System.out.println("sender = " + sender.getName()); - System.out.println("vp = " + vp.getName()); - System.out.println("args = " + args.toString()); - System.out.println("players = " + players.toString()); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; - sendMessage(sender, message); - // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) { - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent event = new EntityDamageEvent( - damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damagee.getHealth() - h); - /* - EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, - null, - null); */ - if (!event.isCancelled() || force) { - damagee.setLastDamageCause(event); - damagee.setHealth(damagee.getHealth() - event.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = new EntityDamageByEntityEvent( - damager, damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damage); - /* - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((Entity) ((CraftPlayer) damager).getHandle()), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - */ - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc", "disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { - vp.setOnline(connecting); - if (connecting) { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() { - @Override - public void run() { - try { - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex) {/* say nothing */ - - } - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable() { - @Override - public void run() { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex) {/* do nothing */ - - } - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent(playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } else { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " - + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java deleted file mode 100644 index dfdf0e6..0000000 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R1; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java deleted file mode 100644 index d12ca6a..0000000 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R1; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java deleted file mode 100644 index fcef908..0000000 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R1; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java deleted file mode 100644 index 74db145..0000000 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R1; - -import org.bukkit.command.CommandSender; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java deleted file mode 100644 index 520beed..0000000 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java deleted file mode 100644 index 46733c5..0000000 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerExecutor.java +++ /dev/null @@ -1,451 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R2; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_8_R2.DamageSource; -import net.minecraft.server.v1_8_R2.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.ChatColor; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin p) { - super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - - } - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) { - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - } - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) { - continue; - } - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak) { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - - System.out.println("sender = " + sender.getName()); - System.out.println("vp = " + vp.getName()); - System.out.println("args = " + args.toString()); - System.out.println("players = " + players.toString()); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; - sendMessage(sender, message); - // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) { - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent event = new EntityDamageEvent( - damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damagee.getHealth() - h); - /* - EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, - null, - null); */ - if (!event.isCancelled() || force) { - damagee.setLastDamageCause(event); - damagee.setHealth(damagee.getHealth() - event.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = new EntityDamageByEntityEvent( - damager, damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damage); - /* - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((Entity) ((CraftPlayer) damager).getHandle()), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - */ - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc", "disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { - vp.setOnline(connecting); - if (connecting) { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() { - @Override - public void run() { - try { - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex) {/* say nothing */ - - } - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable() { - @Override - public void run() { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex) {/* do nothing */ - - } - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent(playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } else { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " - + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java deleted file mode 100644 index 983da80..0000000 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R2; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java deleted file mode 100644 index bdd11db..0000000 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R2; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java deleted file mode 100644 index ec34432..0000000 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R2; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java deleted file mode 100644 index a7d223e..0000000 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R2; - -import org.bukkit.command.CommandSender; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java deleted file mode 100644 index acaa8c1..0000000 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java deleted file mode 100644 index fb6dbf3..0000000 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerExecutor.java +++ /dev/null @@ -1,451 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R3; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.v1_8_R3.DamageSource; -import net.minecraft.server.v1_8_R3.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Score; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.ChatColor; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin p) { - super((JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); - super.useAlias = 0; - - this.plugin = (JavaPlugin) Bukkit.getPluginManager().getPlugin("VirtualPlayers"); - - } - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"showScoreboard"}, op = true) - public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { - Scoreboard sc = vp.getScoreboard(); - if (sc == null) { - return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); - } - sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); - sendMessage(sender, "&e -- Teams -- "); - Collection ops = sc.getPlayers(); - for (Team t : sc.getTeams()) { - sendMessage(sender, t.getName() + " - " + t.getDisplayName()); - } - for (Objective o : sc.getObjectives()) { - sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); - for (OfflinePlayer op : ops) { - Score score = o.getScore(op); - if (score == null) { - continue; - } - sendMessage(sender, op.getName() + " : " + score.getScore()); - } - } - return true; - - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak) { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - - System.out.println("sender = " + sender.getName()); - System.out.println("vp = " + vp.getName()); - System.out.println("args = " + args.toString()); - System.out.println("players = " + players.toString()); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; - sendMessage(sender, message); - // sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) { - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent event = new EntityDamageEvent( - damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damagee.getHealth() - h); - /* - EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, - null, - null); */ - if (!event.isCancelled() || force) { - damagee.setLastDamageCause(event); - damagee.setHealth(damagee.getHealth() - event.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - EntityDamageEvent ede = new EntityDamageByEntityEvent( - damager, damagee, - EntityDamageEvent.DamageCause.ENTITY_ATTACK, - damage); - /* - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((Entity) ((CraftPlayer) damager).getHandle()), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - */ - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, (float) ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0.0); - vp.damage(100000.0); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc", "disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { - vp.setOnline(connecting); - if (connecting) { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() { - @Override - public void run() { - try { - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex) {/* say nothing */ - - } - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable() { - @Override - public void run() { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex) {/* do nothing */ - - } - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent(playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } else { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " - + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java deleted file mode 100644 index a7f5450..0000000 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R3; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author Nikolai - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20.0); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java deleted file mode 100644 index ccce1df..0000000 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R3; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java deleted file mode 100644 index 1a86eb5..0000000 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R3; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java deleted file mode 100644 index e0e0f37..0000000 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.v1_8_R3; - -import org.bukkit.command.CommandSender; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java deleted file mode 100644 index 91e7bfa..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CustomCommandExecutor.java +++ /dev/null @@ -1,772 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import mc.alk.virtualplayers.util.InventoryUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author alkarin - */ -public class CustomCommandExecutor implements CommandExecutor { - public static final String version = "2.1.2"; - final int commandIndex; - @Retention(RetentionPolicy.RUNTIME) - public static @interface MCCommand { - /// the cmd and all its aliases, can be blank if you want to do something when they just type - /// the command only - String[] cmds() default {}; - - /// subCommands - String[] subCmds() default {}; - - /// Verify the number of parameters, - int min() default 0; - int max() default Integer.MAX_VALUE; - int exact() default -1; - - int order() default -1; - float helpOrder() default Integer.MAX_VALUE; - boolean admin() default false; /// admin - boolean op() default false; /// op - - String usage() default ""; - String usageNode() default ""; - String perm() default ""; /// permission node - int[] alphanum() default {}; /// only alpha numeric - } - - static final boolean DEBUG = false; - private HashMap> methods = - new HashMap>(); - private HashMap>> subCmdMethods = - new HashMap>>(); - - final Plugin plugin; - final Logger log; - int useAlias = -1; - - protected PriorityQueue usage = new PriorityQueue(2, new Comparator(){ - @Override - public int compare(MethodWrapper mw1, MethodWrapper mw2) { - MCCommand cmd1 = mw1.getCommand(); - MCCommand cmd2 = mw2.getCommand(); - - int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); - if (c!=0) return c; - c = new Integer(cmd1.order()).compareTo(cmd2.order()); - return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); - } - }); - static final String DEFAULT_CMD = "_dcmd_"; - - /** - * Custom arguments class so that we can return a modified arguments - */ - protected class Arguments{ - public Object[] args; - } - - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; - } - - public Object obj; /// Object instance the method belongs to - public Method method; /// Method - public String usage; - Float helpOrder = null; - public MCCommand getCommand(){ - return this.method.getAnnotation(MCCommand.class); - } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); - } - } - - protected CustomCommandExecutor(Plugin plugin) { - this(plugin, 0); - } - - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ - this.plugin = plugin; - this.log = plugin.getLogger(); - this.commandIndex = commandIndex; - addMethods(this, getClass().getMethods()); - } - - - /** - * When no arguments are supplied, no method is found - * What to display when this happens - * @param sender the sender - */ - protected void showHelp(CommandSender sender, Command command){ - showHelp(sender,command,null); - } - - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); - } - - protected boolean validCommandSenderClass(Class clazz){ - return clazz != CommandSender.class || clazz != Player.class; - } - - public void addMethods(Object obj, Method[] methodArray){ - - for (Method method : methodArray){ - MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) - continue; - Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ - System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); - continue; - } - if (mc.cmds().length == 0){ /// There is no subcommand. just the command itself with arguments - addMethod(obj, method, mc, DEFAULT_CMD); - } else { - /// For each of the cmds, store them with the method - for (String cmd : mc.cmds()){ - addMethod(obj, method, mc, cmd.toLowerCase()); - } - } - } - } - - private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { - int ml = method.getParameterTypes().length; - if (mc.subCmds().length == 0){ - TreeMap mthds = methods.get(cmd); - if (mthds == null){ - mthds = new TreeMap(); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100 - mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - mthds.put(order, mw); - methods.put(cmd, mthds); - addUsage(mw, mc); - } else { - Map> basemthds = subCmdMethods.get(cmd); - if (basemthds == null){ - basemthds = new HashMap>(); - subCmdMethods.put(cmd, basemthds); - } - for (String subcmd: mc.subCmds()){ - TreeMap mthds = basemthds.get(subcmd); - if (mthds == null){ - mthds = new TreeMap(); - basemthds.put(subcmd, mthds); - } - int order = (mc.order() != -1? mc.order()*100000 :Integer.MAX_VALUE) - ml*100-mthds.size(); - MethodWrapper mw = new MethodWrapper(obj,method); - /// Set help order - if (mc.helpOrder() == Integer.MAX_VALUE){ - mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); - } - mthds.put(order, mw); - addUsage(mw, mc); - } - } - } - private void addUsage(MethodWrapper method, MCCommand mc) { - /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ - method.usage = mc.usage(); - } else { /// Generate an automatic usage string - method.usage = createUsage(method.method); - } - usage.add(method); - } - - private String createUsage(Method method) { - MCCommand cmd = method.getAnnotation(MCCommand.class); - List str = new ArrayList(); - String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; - String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0]: null; - - Class types[] = method.getParameterTypes(); - if (commandIndex==0){ - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - for (int i=1;i theclass = types[i]; - str.add(getUsageString(theclass)); - if (i==commandIndex) { - str.add(thecmd); - if (thesubcmd!=null) { - str.add(thesubcmd); - } - } - } - return StringUtils.join(str, " "); - } - - protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ - return ""; - } else if (OfflinePlayer.class ==clazz){ - return ""; - } else if (Location.class ==clazz){ - return ""; - } else if (String.class == clazz){ - return ""; - } else if (Integer.class == clazz || int.class == clazz){ - return ""; - } else if (Float.class == clazz || float.class == clazz){ - return ""; - } else if (Double.class == clazz || double.class == clazz){ - return ""; - } else if (Short.class == clazz || short.class == clazz){ - return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ - return ""; - } else if (String[].class == clazz || Object[].class == clazz){ - return "[string ...]"; - } else if (GameMode.class == clazz){ - return ""; - } else if (ItemStack.class == clazz) { - return ""; - } - - return " "; - } - - public class CommandException{ - final IllegalArgumentException err; - final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = mw; - } - } - - @Override - @SuppressWarnings("ConstantConditions") - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TreeMap methodmap = null; - - /// No method to handle, show some help - if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) - || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))){ - showHelp(sender, command,args); - return true; - } - final int length = args.length; - final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; - final String subcmd = length > commandIndex+1 ? args[commandIndex+1].toLowerCase() : null; - boolean hasCmd = false; - boolean hasSubCmd = false; - /// check for subcommands - if (subcmd!=null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)){ - methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; - } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations - methodmap = methods.get(cmd); - if (methodmap != null) - hasCmd =true; - } - - if (methodmap == null){ /// our last attempt - methodmap = methods.get(DEFAULT_CMD); - } - - if (methodmap == null || methodmap.isEmpty()){ - return sendMessage(sender, "&cThat command does not exist!&6 /"+command.getLabel()+" help &c for help");} - - MCCommand mccmd; - List errs =null; - boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ - mccmd = mwrapper.method.getAnnotation(MCCommand.class); - final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; - - if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass - continue; - Arguments newArgs = null; - try { - newArgs= verifyArgs(mwrapper,mccmd,sender,command, label, args, hasCmd, hasSubCmd); - - Object completed = invoke(mwrapper,newArgs); - if (completed != null && completed instanceof Boolean){ - success = (Boolean)completed; - if (!success){ - String usage = mwrapper.usage; - if (usage != null && !usage.isEmpty()){ - sendMessage(sender, usage);} - } - } else { - success = true; - } - break; /// success on one - } catch (IllegalArgumentException e){ /// One of the arguments wasn't correct, store the message - if (errs == null) - errs = new ArrayList(); - errs.add(new CommandException(e,mwrapper)); - } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); - } - } - /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ - HashSet usages = new HashSet(); - for (CommandException e: errs){ - usages.add(ChatColor.GOLD+e.mw.usage+" &c:"+e.err.getMessage()); - } - for (String msg : usages){ - sendMessage(sender, msg);} - } - return true; - } - - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - return mwrapper.method.invoke(mwrapper.obj,args.args); - } - - private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { - System.err.println("["+plugin.getName()+" Error] "+mwrapper.method +" : " + mwrapper.obj +" : " + newArgs); - if (newArgs!=null && newArgs.args != null){ - for (Object o: newArgs.args) - System.err.println("[Error] object=" + o); - } - System.err.println("[Error] Cause=" + e.getCause()); - if (e.getCause() != null){ - e.getCause().printStackTrace(); - log.log(Level.SEVERE, null, e.getCause()); - } - System.err.println("[Error] Trace Continued "); - log.log(Level.SEVERE, null, e); - } - - - - - public static final String ONLY_INGAME =ChatColor.RED+"You need to be in game to use this command"; - @SuppressWarnings("ConstantConditions") - protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, - Command command, String label, String[] args, - boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException{ - if (DEBUG){ - log.info(" method="+mwrapper.method.getName() + " verifyArgs " + cmd +" sender=" +sender+ - ", label=" + label+" args="+ Arrays.toString(args)); - for (String arg: args){ - log.info(" -- arg=" +arg);} - for (Class t: mwrapper.method.getParameterTypes()){ - log.info(" -- type=" +t);} - } - final int paramLength = mwrapper.method.getParameterTypes().length; - - /// Check our permissions - if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) - throw new IllegalArgumentException("You don't have permission to use this command"); - - /// Verify min number of arguments - if (args.length < cmd.min()){ - throw new IllegalArgumentException("You need at least "+cmd.min()+" arguments"); - } - /// Verfiy max number of arguments - if (args.length > cmd.max()){ - throw new IllegalArgumentException("You need less than "+cmd.max()+" arguments"); - } - /// Verfiy max number of arguments - if (cmd.exact()!= -1 && args.length != cmd.exact()){ - throw new IllegalArgumentException("You need exactly "+cmd.exact()+" arguments"); - } - final boolean isPlayer = sender instanceof Player; - final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; - - if (cmd.op() && !isOp) - throw new IllegalArgumentException("You need to be op to use this command"); - - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) - throw new IllegalArgumentException("You need to be an Admin to use this command"); - - Class types[] = mwrapper.method.getParameterTypes(); - - /// In game check - if (types[0] == Player.class && !isPlayer){ - throw new IllegalArgumentException(ONLY_INGAME); - } - int strIndex = 0; - int objIndex = 1; - - Arguments newArgs = new Arguments(); /// Our return value - Object[] objs = new Object[paramLength]; /// Our new array of castable arguments - - newArgs.args = objs; /// Set our return object with the new castable arguments - objs[0] = verifySender(sender, types[0]); - AtomicInteger numUsedStrings = new AtomicInteger(0); - for (int i=1;i clazz = types[i]; - try{ - if (CommandSender.class == clazz){ - objs[objIndex] = sender; - } else if (String[].class == clazz) { - objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); - } else if (Object[].class == clazz){ - objs[objIndex] =args; - } else { - objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ - throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); - } - } - if (DEBUG)log.info(" " + objIndex + " : " + strIndex + " " + - (args.length > strIndex ? args[strIndex] : null ) + " <-> " + objs[objIndex] +" !!! Cs = " + - clazz.getCanonicalName()); - if (numUsedStrings.get() > 0){ - strIndex+=numUsedStrings.get();} - } catch (ArrayIndexOutOfBoundsException e){ - throw new IllegalArgumentException("You didnt supply enough arguments for this method"); - } - objIndex++; - if (i==commandIndex) { - if (hasCmd) - strIndex++; - if (hasSubCmd) - strIndex++; - } - } - - /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) - throw new IllegalArgumentException("String Index out of range. "); - if (!args[index].matches("[a-zA-Z0-9_]*")) { - throw new IllegalArgumentException("argument '"+args[index]+"' can only be alphanumeric with underscores"); - } - } - } - return newArgs; /// Success - } - - protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} - return sender; - } - - @SuppressWarnings("UnusedParameters") - protected Object verifyArg(CommandSender sender, Class clazz, Command command, - String[] args, int curIndex, AtomicInteger numUsedStrings) { - numUsedStrings.set(0); - if (Command.class == clazz) { - return command; - } - String string = args[curIndex]; - if (string == null) - throw new ArrayIndexOutOfBoundsException(); - numUsedStrings.set(1); - if (Player.class == clazz) { - return verifyPlayer(string); - } else if (OfflinePlayer.class == clazz) { - return verifyOfflinePlayer(string); - } else if (String.class == clazz) { - return string; - } else if (Location.class == clazz) { - return verifyLocation(string); - } else if (Integer.class == clazz || int.class == clazz) { - return verifyInteger(string); - } else if (Boolean.class == clazz || boolean.class == clazz) { - return Boolean.parseBoolean(string); - } else if (Object.class == clazz) { - return string; - } else if (Float.class == clazz || float.class == clazz) { - return verifyFloat(string); - } else if (Double.class == clazz || double.class == clazz) { - return verifyDouble(string); - } else if (GameMode.class == clazz) { - return verifyGameMode(string); - } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); - } else if (Material.class == clazz) { - return verifyMaterial(args, curIndex, numUsedStrings); - } - return null; - } - - private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { - Material mat = InventoryUtil.getMat(args[curIndex]); - if (mat == null) { - throw new IllegalArgumentException("Error parsing block " + args[curIndex]); - } - numUsedStrings.set(1); - return mat; - } - - private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { - ItemStack is = InventoryUtil.getItemStack(args[curIndex]); - if (is == null){ - throw new IllegalArgumentException("Error parsing item " + args[curIndex]);} - numUsedStrings.set(1); - return is; - } - - private Location verifyLocation(String string) { - String split[] = string.split(","); - String w = split[0]; - float x = Float.valueOf(split[1]); - float y = Float.valueOf(split[2]); - float z = Float.valueOf(split[3]); - float yaw = 0, pitch = 0; - if (split.length > 4){yaw = Float.valueOf(split[4]);} - if (split.length > 5){pitch = Float.valueOf(split[5]);} - World world = null; - if (w != null){ - world = Bukkit.getWorld(w);} - if (world ==null){ - throw new IllegalArgumentException("Error parsing location, World '"+string+"' does not exist");} - return new Location(world,x,y,z,yaw,pitch); - } - - private GameMode verifyGameMode(String string) { - GameMode gm = null; - try{gm = GameMode.valueOf(string);} catch (Exception e){/* ignore */} - if (gm == null){ - try{ - gm = GameMode.getByValue(Integer.valueOf(string)); - } catch (Exception e){/* do nothing */} - if (gm == null){ - throw new IllegalArgumentException("&cGamemode " + string + " not found"); - } - } - return gm; - } - - private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { - OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); - return p; - } - - - private Player verifyPlayer(String name) throws IllegalArgumentException { - Player p = findPlayer(name); - if (p == null || !p.isOnline()) - throw new IllegalArgumentException(name+" is not online "); - return p; - } - - - private Integer verifyInteger(Object object) throws IllegalArgumentException { - try { - return Integer.parseInt(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid integer."); - } - } - - private Float verifyFloat(Object object) throws IllegalArgumentException { - try { - return Float.parseFloat(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid float."); - } - } - - private Double verifyDouble(Object object) throws IllegalArgumentException { - try { - return Double.parseDouble(object.toString()); - }catch (NumberFormatException e){ - throw new IllegalArgumentException(ChatColor.RED+(String)object+" is not a valid double."); - } - } - - protected boolean hasAdminPerms(CommandSender sender){ - return sender.isOp(); - } - - - static final int LINES_PER_PAGE = 8; - @SuppressWarnings("UnnecessaryContinue") - public void help(CommandSender sender, Command command, String[] args){ - Integer page = 1; - - if (args != null && args.length > 1){ - try{ - page = Integer.valueOf(args[1]); - } catch (Exception e){ - sendMessage(sender, ChatColor.RED+" " + args[1] +" is not a number, showing help for page 1."); - } - } - - List available = new ArrayList(); - List unavailable = new ArrayList(); - List onlyop = new ArrayList(); - Set dups = new HashSet(); - String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ - theCommand = command.getAliases().get(useAlias); - } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) - continue; - MCCommand cmd = mw.getCommand(); - final String use = "&6/" + theCommand +" " + mw.usage; - if (cmd.op() && !sender.isOp()) - onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) - continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) - unavailable.add(use); - else - available.add(use); - } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) - npages += onlyop.size(); - npages = (int) Math.ceil( (float)npages/LINES_PER_PAGE); - if (page > npages || page <= 0){ - if (npages <= 0){ - sendMessage(sender, "&4There are no methods for this command"); - } else { - sendMessage(sender, "&4That page doesnt exist, try 1-"+npages); - } - return; - } - if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { - String aliases = StringUtils.join(command.getAliases(), ", "); - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /"+command.getName()+" help "); - sendMessage(sender, "&e command &6"+command.getName()+"&e has aliases: &6" + aliases); - } else { - sendMessage(sender, "&eShowing page &6"+page +"/"+npages +"&6 : /cmd help "); - } - int i=0; - for (String use : available){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) - continue; - sendMessage(sender, use); - } - for (String use : unavailable){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); - } - if (sender.isOp()){ - for (String use : onlyop){ - i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) - continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); - } - } - } - - public boolean sendMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - if (message.contains("\n")) - return sendMultilineMessage(p,message); - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(message)); - } else { - p.sendMessage(colorChat(message)); - } - return true; - } - - public boolean sendMultilineMessage(CommandSender p, String message){ - if (message ==null || message.isEmpty()) return true; - String[] msgs = message.split("\n"); - for (String msg: msgs){ - if (p instanceof Player){ - if (((Player) p).isOnline()) - p.sendMessage(colorChat(msg)); - } else { - p.sendMessage(colorChat(msg)); - } - } - return true; - } - - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} - - public static Player findPlayer(String name) { - if (name == null) - return null; - Player foundPlayer = Bukkit.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayer.getPlayer(name); - if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayer.getOnlinePlayers(); - - for (Player player : online) { - String playerName = player.getName(); - - if (playerName.equalsIgnoreCase(name)) { - foundPlayer = player; - break; - } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { - if (foundPlayer != null) { - return null;} - - foundPlayer = player; - } - } - - return foundPlayer; - } - - public static OfflinePlayer findOfflinePlayer(String name) { - OfflinePlayer p = findPlayer(name); - if (p != null){ - return p; - } else{ - /// Iterate over the worlds to see if a player.dat file exists - for (World w : Bukkit.getWorlds()){ - File f = new File(w.getName()+"/players/"+name+".dat"); - if (f.exists()){ - return Bukkit.getOfflinePlayer(name); - } - } - return null; - } - } - protected void useAliasIndex(int index) { - useAlias = index; - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java deleted file mode 100644 index 722086a..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerExecutor.java +++ /dev/null @@ -1,403 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import mc.alk.virtualplayers.util.InventoryUtil; -import net.minecraft.server.DamageSource; -import net.minecraft.server.EntityPlayer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Sign; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.plugin.Plugin; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * @author alkarin - */ -public class PlayerExecutor extends VPBaseExecutor { - - JavaPlugin plugin; - - public PlayerExecutor(Plugin plugin) { - super(plugin,1); - super.useAlias = 0; - this.plugin = (JavaPlugin) plugin; - } - - - @MCCommand(op = true) - public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { - String command = StringUtils.join(args, " "); - sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); - PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); - Bukkit.getPluginManager().callEvent(pcpe); - if (pcpe.isCancelled()) { - return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); - } - Bukkit.getServer().dispatchCommand(vp, command); - return true; - } - - @MCCommand(cmds = {"status"}, op = true) - public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { - return sendMessage(sender, "&4" + vp); - } - - @MCCommand(cmds = {"op"}, op = true) - public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, true); - } - - @MCCommand(cmds = {"deop"}, op = true) - public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { - return opPlayer(sender, vp, false); - } - - private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { - vp.setOp(op); - String opped = op ? "opped" : "deopped"; - return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); - } - - @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") - public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { - boolean left = lr.equalsIgnoreCase("left"); - Action action; - if (l.getBlock().getType() == Material.AIR) { - action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; - } else { - action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; - } - ItemStack inhand = vp.getItemInHand(); - // Block b = w.getBlockAt(l); - Block b = l.getWorld().getBlockAt(l); - // PlayerInteractEvent(final Player who, final Action action, final - // ItemStack item, - // final Block clickedBlock, final BlockFace clickedFace) { - PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); - Bukkit.getPluginManager().callEvent(ede); - sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" - + b.getType() + "&2 with a &a" + inhand.getType().name()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - - return true; - } - - @MCCommand(cmds = {"sneak"}, op = true) - public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { - vp.setSneaking(sneak); - if (sneak){ - return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); - } else { - return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); - } - } - - - @MCCommand(cmds = {"examine"}, op = true) - public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { - Block b = l.getWorld().getBlockAt(l); - - sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); - if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { - Sign s = (Sign) b.getState(); - String[] lines = s.getLines(); - for (int i = 1; i <= lines.length; i++) { - sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); - } - } - return true; - } - - @MCCommand(cmds = {"tp", "teleport"}, op = true) - public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { - PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), - l, TeleportCause.COMMAND); - Bukkit.getPluginManager().callEvent(pte); - if (pte.isCancelled()) { - sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); - } else { - vp.teleport(l); - } - return true; - } - - @MCCommand(cmds = {"gm", "gamemode"}, op = true) - public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { - vp.setGameMode(gm); - sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); - return true; - } - - @MCCommand(cmds = {"chat"}, op = true) - public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { - final String msg = Util.colorChat(StringUtils.join(args, " ")); - final HashSet players = new HashSet( - Arrays.asList(VirtualPlayer.getOnlinePlayers())); - Runnable r = new Runnable() { - @Override - public void run() { - AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); - Bukkit.getPluginManager().callEvent(apce); - } - }; - new Thread(r).start(); - - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); - return true; - } - - @MCCommand(cmds = {"respawn"}, op = true) - public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { - World w = vp.getWorld(); - vp.respawn(w.getSpawnLocation()); - return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); - } - - @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) - public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { - - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - replaced.setType(mat); - BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, - replaced.getState(), replaced.getRelative(BlockFace.NORTH), - vp.getItemInHand(), vp, true); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - replaced.setType(old); - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" - + vp.getName()); - } else { - return sendMessage(sender, - "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) - ); - } - } - - @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) - public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { - Block replaced = loc.getBlock(); - Material old = replaced.getType(); - BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); - Bukkit.getPluginManager().callEvent(bpe); - if (bpe.isCancelled()) { - return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); - } else { - replaced.setType(Material.AIR); - return sendMessage(sender, "&6" + vp.getName() + "&e broke the " - + old + " at &4" + Util.getLocString(loc)); - } - } - - @MCCommand(cmds = {"giveInv"}, op = true) - public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { - int amount = is.getAmount() > 0 ? is.getAmount() : 1; - InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); - return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); - } - - @MCCommand(cmds = {"giveHelm"}, op = true) - public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { - vp.getInventory().setHelmet(is); - return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); - } - - @MCCommand(cmds = {"inv", "printInv"}, op = true) - public boolean printInv(CommandSender sender, VirtualPlayer vp) { - PlayerInventory inv = vp.getInventory(); - if (inv != null) { - sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); - sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); - sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); - sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); - sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); - ItemStack[] contents = inv.getContents(); - for (int i = 0; i < contents.length; i++) { - ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) - sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); - } - } - return true; - } - - @MCCommand(cmds = {"health"}, op = true) - public boolean health(CommandSender sender, VirtualPlayer damagee, int h, String... args) { - boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - null, - damagee.getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damagee.getHealth() - h); - if (!ede.isCancelled() || force) { - damagee.setLastDamageCause(ede); - damagee.setHealth(damagee.getHealth() - ede.getDamage()); - return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); - - } else { - return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"hit"}, op = true) - public boolean damageEvent(CommandSender sender, Player damager, Player damagee) { - if (damagee.getHealth() <= 0) { - return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); - } - Integer damage = 5; - EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( - ((CraftPlayer) damager).getHandle(), - ((CraftPlayer) damagee).getHandle(), - EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (!ede.isCancelled()) { - damagee.setLastDamageCause(ede); - EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); - if (damagee instanceof VirtualPlayer) { - ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); - } else { - ep.damageEntity(DamageSource.GENERIC, ede.getDamage()); - } - return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" - + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" - + damagee.getHealth()); - } else { - return sendMessage(sender, "&cDamage Event was cancelled for &6" - + damager.getName() + "&c hitting &6" + damagee.getName()); - } - } - - @MCCommand(cmds = {"kill"}, op = true) - public boolean playerKill(VirtualPlayer vp) { - Server cserver = Bukkit.getServer(); - List is = new LinkedList(); - vp.setHealth(0); - vp.damage(100000); - PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); - cserver.getPluginManager().callEvent(ede); - return true; - } - - @MCCommand(cmds = {"connect"}, op = true) - public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, true); - } - - @MCCommand(cmds = {"dc","disconnect"}, op = true) - public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { - return playerConnection(sender, vp, false); - } - - private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) - { - vp.setOnline(connecting); - if (connecting) - { - // PreLogin Event has to be called from a thread other than the - // main. - final String playerName = vp.getName(); - Runnable r = new Runnable() - { - @Override - public void run() - { - try{ - AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( - playerName, InetAddress.getLocalHost()); - Bukkit.getPluginManager().callEvent(playerPreLoginEvent); - } catch (UnknownHostException ex){/* say nothing */} - /// After we are done Asynchronously handling the - /// preloginevent - /// Sync back up and call the Login and Join events - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, new Runnable(){ - @Override - public void run() - { - // Then the Login Event. - Server cserver = Bukkit.getServer(); - try - { - PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( - vp, "localhost", InetAddress - .getLocalHost()); - cserver.getPluginManager().callEvent( - playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} - - // Finally, the player join event. - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( - vp, "\u00A7e" + vp.getName() - + " joined the game."); - cserver.getPluginManager().callEvent( playerJoinEvent); - } - }); - - } - }; - new Thread(r).start(); - } - else - { /// Disconnecting - Server cserver = Bukkit.getServer(); - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" - + vp.getName() + " left the game."); - cserver.getPluginManager().callEvent(playerQuitEvent); - } - String msg = "&6" + vp.getName() + "&2 " + - (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); - sendMessage(sender, vp, msg); - return true; - } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java deleted file mode 100644 index 8f2a19c..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/PlayerListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerRespawnEvent; - -/** - * - * @author alkarin - */ -public class PlayerListener implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerRespawnBegin(PlayerRespawnEvent event){ - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - p.setHealth(20); - p.setLastDamageCause(null); - ((VirtualPlayer) p).setOnline(true); - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerRespawnEnd(PlayerRespawnEvent event) - { - Player p = event.getPlayer(); - if (VirtualPlayer.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) - { - final Location l = event.getRespawnLocation(); - ((VirtualPlayer) p).teleport(l, true); - } - } - - @EventHandler - public void onAsyncChatEvent(AsyncPlayerChatEvent event) - { - if (!VirtualPlayer.getVps().containsKey(event.getPlayer().getUniqueId())) // / don't need to - // handle it - return; - // / For some reason we do need to actually send the messages from - // virtualplayers ourself - final String message = String.format(event.getFormat(), event - .getPlayer().getDisplayName(), event.getMessage()); - for (Player p : event.getRecipients()) - { - p.sendMessage(message); - } - } - -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java deleted file mode 100644 index 0ec6021..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/Util.java +++ /dev/null @@ -1,58 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Util -{ - public interface VPMessageListener{ - public void gettingMessage(Player player, String msg); - } - - static final List listeners = new ArrayList(); - - static public String getLocString(Location l) - { - if (l == null) return "null"; - StringBuilder sb = new StringBuilder(); - sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); - sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); - sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); - if (l.getYaw() != 0f) sb.append(",").append(l.getYaw()); - if (l.getPitch() != 0f) sb.append(",").append(l.getPitch()); - return sb.toString(); - } - - public static void sendMessage(VirtualPlayer p, String msg) - { - final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'"+ msg + "'"); - Bukkit.getConsoleSender().sendMessage(finalMsg); - if (!listeners.isEmpty()){ - for (VPMessageListener l: listeners) { - l.gettingMessage(p, msg);} - } - if (p.getInformed() != null) p.getInformed().sendMessage(finalMsg); - } - - public static String colorChat(String msg) - { - return msg.replace('&', (char) 167); - } - - public static boolean isInt(double f) - { - return Math.floor(f) == f; - } - - public static boolean addListener(VPMessageListener listener) { - return listeners.add(listener); - } - - public static boolean removeListener(VPMessageListener listener) { - return listeners.remove(listener); - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java deleted file mode 100644 index 8c77d31..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPBaseExecutor.java +++ /dev/null @@ -1,115 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author alkarin - */ -public class VPBaseExecutor extends CustomCommandExecutor{ - static boolean showTransitionsToPlayer = true; - static boolean showEventMessages = true; - - protected VPBaseExecutor(Plugin plugin) { - super(plugin); - } - - public VPBaseExecutor(Plugin plugin, int i) { - super(plugin, i); - } - - @Override - protected String getUsageString(Class clazz) { - if (VirtualPlayer.class == clazz){ - return ""; - } - return super.getUsageString(clazz); - } - - @Override - protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args,int curIndex, AtomicInteger numUsedStrings) { - if (VirtualPlayer.class == clazz){ - return verifyVirtualPlayer(args[curIndex], numUsedStrings); - } - return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); - } - - private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayer.getPlayerExact(name); - if (p == null) { - if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayer.getOrCreate(name); - } - if (!(p instanceof VirtualPlayer)){ - throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); - } - numUsedStrings.set(1); - return p; - } - - @SuppressWarnings("unchecked") - @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) - throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { - Object ret = null; - Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[])args.args[2]).length); - args.args[2] = o; - List list = (List) args.args[1]; - for (Object vp : list){ - args.args[1] = vp; - ret = mwrapper.method.invoke(mwrapper.obj, args.args); - } - return ret; - } else { - return mwrapper.method.invoke(mwrapper.obj, args.args); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; - return super.sendMessage(sender, string); - } - - protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) - { - if (string == null || !showEventMessages) return true; - if (showTransitionsToPlayer) - Util.sendMessage(p, string); - return super.sendMessage(sender,string); - } - - - private List getVps(String names) { - String name = names; - List players = new ArrayList(); - if (names.contains("-")){ - String[] split = names.split("-"); - name = split[0]; - Integer start = Integer.valueOf(split[1]); - Integer end = Integer.valueOf(split[2]); - for (int i=start;i<=end;i++){ - players.add(VirtualPlayer.getOrCreate(name + i)); - } - } else { - players.add(VirtualPlayer.getOrCreate(name)); - } - return players; - } - - public static void setShowEventMessages(boolean show) { - showEventMessages = show; - } -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java deleted file mode 100644 index de325eb..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/VPExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author alkarin - */ -public class VPExecutor extends VPBaseExecutor { - public VPExecutor(Plugin plugin) { - super(plugin); - useAliasIndex(0); - } - - @MCCommand(cmds = {"ap","addPlayers"}, op = true) - public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception - { - for (int i = 0; i < numPlayers; i++){ - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayer.makeVirtualPlayer(); - sendMessage(sender, "Added Player " + p1.getName()); - } - return true; - } - - @MCCommand(cmds = {"removeAll"}, op = true) - public boolean removeAll(CommandSender sender) { - VirtualPlayer.deleteVirtualPlayers(); - return sendMessage(sender, "&2Removed all VirtualPlayers"); - } - - @MCCommand(cmds = {"listPlayers"}, op = true) - public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayer.getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); - - Collections.sort(players, new Comparator() { - @Override - public int compare(VirtualPlayer o1, VirtualPlayer o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - for (VirtualPlayer vp : players) { - sendMessage(sender, vp.getName() + " : " + vp); - } - } - - @MCCommand(cmds = {"showMessages"}, op = true) - public boolean showMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); - } - - - @MCCommand(cmds = {"hideMessages"}, op = true) - public boolean hideMessages(CommandSender sender) { - return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); - } - - - @MCCommand(cmds = {"setMessages"}, op = true) - public static void setPlayerMessages(boolean show) { - VirtualPlayer.setGlobalMessages(show); - } - - @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; - } - - -} From eada98e49b1e486e21a5b1fa734dae2ef9f554db Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 00:53:39 -0500 Subject: [PATCH 42/74] Added module/api & VirtualPlayer interface This module contains all the interfaces and utilities: - interface VirtualPlayer - abstract VirtualPlayerFactory - static InventoryUtil - static Util - api.VirtualPlayer implementations: mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer - api.VirtualPlayerFactory implementations: mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayerFactory The factory is responsible for creating, tracking, & deleting VirtualPlayer instances. All other modules depend on the API module in order to implement its interfaces/abstractions. --- modules/api/pom.xml | 96 +++ .../alk/virtualplayers/api/VirtualPlayer.java | 21 + .../api/VirtualPlayerFactory.java | 91 +++ .../virtualplayers/util/InventoryUtil.java | 721 ++++++++++++++++++ .../java/mc/alk/virtualplayers/util/Util.java | 70 ++ 5 files changed, 999 insertions(+) create mode 100644 modules/api/pom.xml create mode 100644 modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayer.java create mode 100644 modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java create mode 100644 modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java create mode 100644 modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java diff --git a/modules/api/pom.xml b/modules/api/pom.xml new file mode 100644 index 0000000..c105181 --- /dev/null +++ b/modules/api/pom.xml @@ -0,0 +1,96 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-api + parent + jar + + virtualplayers-api + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.10-R0.1-SNAPSHOT + provided + + + mc.euro + Version + 1.2 + compile + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-API + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + false + + + mc.alk:* + mc.euro:Version + + + + + mc.euro.version + mc.alk.virtualplayers.version + + + + + *:* + + META-INF/*.* + META-INF/**/*.* + META-INF/**/* + + + + + + + + + + diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayer.java b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayer.java new file mode 100644 index 0000000..0312af6 --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayer.java @@ -0,0 +1,21 @@ +package mc.alk.virtualplayers.api; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +/** + * + * @author Nikolai + */ +public interface VirtualPlayer extends Player { + + public void setOnline(boolean b); + + public void respawn(Location loc); + public void moveTo(Location loc); + public boolean teleport(Location location, boolean respawn); + + public Player getInformed(); + public void setShowMessages(boolean visibility); + +} diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java new file mode 100644 index 0000000..a97f717 --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java @@ -0,0 +1,91 @@ +package mc.alk.virtualplayers.api; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import mc.euro.version.VersionFactory; + +import org.bukkit.entity.Player; + +/** + * abstract VirtualPlayerFactory: handle the creation, tracking, & deletion of VirtualPlayers.
+ *
+ * Abstractions:
+ *     makeVirtualPlayer();
+ *     deleteVirtualPlayer();
+ * Implementations:
+ *     mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayerFactory;
+ * 
+ * @author Nikolai + */ +public abstract class VirtualPlayerFactory { + + static String NMS = VersionFactory.getNmsVersion().toString(); + protected static final Map vps = new HashMap(); + protected static final Map names = new HashMap(); + + protected static final VirtualPlayerFactory factory = newInstance(); + + /** + * mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayerFactory;. + */ + public static synchronized VirtualPlayerFactory newInstance() { + if (factory != null) { + return factory; + } + Class[] args = {}; + Constructor con = null; + VirtualPlayerFactory $factory = null; + try { + con = getNmsClass("CraftVirtualPlayerFactory").getConstructor(args); + $factory = (VirtualPlayerFactory) con.newInstance(); + } catch (Exception ex) { + ex.printStackTrace(); + } + return $factory; + } + + private static Class getNmsClass(String clazz) throws Exception { + return Class.forName("mc.alk.virtualplayers.nms." + NMS + "." + clazz); + } + + public abstract VirtualPlayer makeVirtualPlayer(String name) throws Exception; + public abstract void deleteVirtualPlayer(String name); + public abstract void deleteVirtualPlayer(VirtualPlayer vp); + + public static VirtualPlayer getOrCreate(String name) { + Player vp = names.get(name); + if (vp == null) { + try { + vp = factory.makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public static Collection getVirtualPlayers() { + return names.values(); + } + + public static Map getVps() { + return vps; + } + + public static Map getNames() { + return names; + } + + public static List getNewPlayerList() { + synchronized (vps) { + return new ArrayList(vps.values()); + } + } + +} diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java new file mode 100644 index 0000000..2709870 --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -0,0 +1,721 @@ +package mc.alk.virtualplayers.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import mc.alk.virtualplayers.api.VirtualPlayer; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class InventoryUtil { + + static final String version = "InventoryUtil 2.1.4"; + static final boolean DEBUG = false; + static final Map armor = initArmor(); + + public enum ArmorType { + + HELM, CHEST, LEGGINGS, BOOTS; + } + + public enum ArmorLevel { + + WOOL, LEATHER, IRON, GOLD, CHAINMAIL, DIAMOND; + } + + public static class Armor { + + public ArmorLevel level; + public ArmorType type; + + Armor(ArmorType at, ArmorLevel al) { + this.level = al; + this.type = at; + } + } + + public static class EnchantmentWithLevel { + + public EnchantmentWithLevel() { + } + + public EnchantmentWithLevel(boolean all) { + this.all = all; + } + + public Enchantment e; + public Integer lvl; + boolean all = false; + + @Override + public String toString() { + return (e != null ? e.getName() : "null") + ":" + lvl; + } + } + + private static Map initArmor() { + Map temp = new HashMap(); // or EnumMap + temp.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); + temp.put(Material.LEATHER_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.IRON)); + temp.put(Material.GOLD_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_HELMET, new Armor(ArmorType.HELM, + ArmorLevel.CHAINMAIL)); + + temp.put(Material.LEATHER_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.IRON)); + temp.put(Material.GOLD_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_CHESTPLATE, new Armor(ArmorType.CHEST, + ArmorLevel.CHAINMAIL)); + + temp.put(Material.LEATHER_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.IRON)); + temp.put(Material.GOLD_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_LEGGINGS, new Armor(ArmorType.LEGGINGS, + ArmorLevel.CHAINMAIL)); + + temp.put(Material.LEATHER_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.LEATHER)); + temp.put(Material.IRON_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.IRON)); + temp.put(Material.GOLD_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.GOLD)); + temp.put(Material.DIAMOND_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.DIAMOND)); + temp.put(Material.CHAINMAIL_BOOTS, new Armor(ArmorType.BOOTS, + ArmorLevel.CHAINMAIL)); + return temp; + } + + public static Enchantment getEnchantmentByCommonName(String iname) { + iname = iname.toLowerCase(); + if (iname.contains("smite")) { + return Enchantment.getByName("DAMAGE_UNDEAD"); + } + if (iname.contains("sharp")) { + return Enchantment.getByName("DAMAGE_ALL"); + } + if (iname.contains("fire") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_FIRE"); + } + if (iname.contains("fire")) { + return Enchantment.getByName("FIRE_ASPECT"); + } + if (iname.contains("exp") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + } + if (iname.contains("blast") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_EXPLOSIONS"); + } + if (iname.contains("arrow") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_PROJECTILE"); + } + if (iname.contains("proj") && iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_PROJECTILE"); + } + if (iname.contains("respiration")) { + return Enchantment.getByName("OXYGEN"); + } + if (iname.contains("fall")) { + return Enchantment.getByName("PROTECTION_FALL"); + } + if (iname.contains("prot")) { + return Enchantment.getByName("PROTECTION_ENVIRONMENTAL"); + } + if (iname.contains("respiration")) { + return Enchantment.getByName("OXYGEN"); + } + if (iname.contains("oxygen")) { + return Enchantment.getByName("OXYGEN"); + } + if (iname.contains("aqua")) { + return Enchantment.getByName("WATER_WORKER"); + } + if (iname.contains("arth")) { + return Enchantment.getByName("DAMAGE_ARTHROPODS"); + } + if (iname.contains("knockback")) { + return Enchantment.getByName("KNOCKBACK"); + } + if (iname.contains("loot")) { + return Enchantment.getByName("LOOT_BONUS_MOBS"); + } + if (iname.contains("dig")) { + return Enchantment.getByName("DIG_SPEED"); + } + if (iname.contains("silk")) { + return Enchantment.getByName("SILK_TOUCH"); + } + if (iname.contains("unbreaking")) { + return Enchantment.getByName("DURABILITY"); + } + if (iname.contains("dura")) { + return Enchantment.getByName("DURABILITY"); + } + return null; + } + + public static int arrowCount(Player p) { + return getItemAmount(p.getInventory().getContents(), new ItemStack( + Material.ARROW, 1)); + } + + public static int getItemAmountFromInventory(Inventory inv, ItemStack is) { + return getItemAmount(inv.getContents(), is); + } + + public static boolean hasArmor(Player p) { + PlayerInventory pi = p.getInventory(); + return ((pi.getBoots() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getHelmet() != null && pi.getBoots().getType() != Material.AIR) + && (pi.getLeggings() != null && pi.getBoots().getType() != Material.AIR) && (pi + .getChestplate() != null && pi.getBoots().getType() != Material.AIR)); + } + + public static ArmorLevel hasArmorSet(List inv) { + ArmorLevel armorSet[] = new ArmorLevel[4]; + for (ItemStack is : inv) { + Armor a = armor.get(is.getType()); + if (a == null) { + continue; + } + switch (a.type) { + case BOOTS: + armorSet[0] = a.level; + break; + case LEGGINGS: + armorSet[1] = a.level; + break; + case CHEST: + armorSet[2] = a.level; + break; + case HELM: + armorSet[3] = a.level; + break; + } + } + ArmorLevel lvl = null; + for (ArmorLevel a : armorSet) { + if (lvl == null) { + lvl = a; + } else if (lvl != a) { + return null; + } + } + return lvl; + } + + // + // private static Material getMaterial(ArmorLevel level) { + // switch(level){ + // case WOOL: return Material.WOOL; + // case LEATHER : return Material.LEATHER; + // case IRON: return Material.IRON_BOOTS; + // case GOLD : return Material.GOLD_BOOTS; + // case CHAINMAIL: return Material.CHAINMAIL_BOOTS; + // case DIAMOND: return Material.DIAMOND; + // default : return null; + // } + // } + + public static int getItemAmount(ItemStack[] items, ItemStack is) { + int count = 0; + for (ItemStack item : items) { + if (item == null) { + continue; + } + if (item.getType() == is.getType() + && ((item.getDurability() == is.getDurability() || item + .getDurability() == -1))) { + count += item.getAmount(); + } + } + return count; + } + + public static ItemStack getItemStack(String name) { + if (name == null || name.isEmpty()) { + return null; + } + name = name.replace(" ", "_"); + name = name.replace(":", ";"); + + int dataIndex = name.indexOf(';'); + dataIndex = (dataIndex != -1 ? dataIndex : -1); + int dataValue = 0; + if (dataIndex != -1) { + dataValue = (isInt(name.substring(dataIndex + 1)) ? Integer + .parseInt(name.substring(dataIndex + 1)) : 0); + name = name.substring(0, dataIndex); + } + + dataValue = dataValue < 0 ? 0 : dataValue; + Material mat = getMat(name); + + if (mat != null && mat != Material.AIR) { + return new ItemStack(mat, 0, (short) dataValue); + } + return null; + } + + public static boolean isInt(String i) { + try { + Integer.parseInt(i); + return true; + } catch (Exception e) { + return false; + } + } + + public static boolean isFloat(String i) { + try { + Float.parseFloat(i); + return true; + } catch (Exception e) { + return false; + } + } + + // / Get the Material + public static Material getMat(String name) { + Integer id = null; + try { + id = Integer.parseInt(name); + } catch (Exception e) { + } + if (id == null) { + id = getMaterialID(name); + } + return id != null && id >= 0 ? Material.getMaterial(id) : null; + } + + // / This allows for abbreviations to work, useful for sign etc + public static int getMaterialID(String name) { + name = name.toUpperCase(); + // / First try just getting it from the Material Name + Material mat = Material.getMaterial(name); + if (mat != null) { + return mat.getId(); + } + // / Might be an abbreviation, or a more complicated + int temp = Integer.MAX_VALUE; + mat = null; + name = name.replaceAll("\\s+", "").replaceAll("_", ""); + for (Material m : Material.values()) { + if (m.name().replaceAll("_", "").startsWith(name)) { + if (m.name().length() < temp) { + mat = m; + temp = m.name().length(); + } + } + } + return mat != null ? mat.getId() : -1; + } + + public static boolean hasItem(Player p, ItemStack itemType) { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) { + if (is != null && is.getType() == itemType.getType()) { + return true; + } + } + for (ItemStack is : inv.getArmorContents()) { + if (is != null && is.getType() == itemType.getType()) { + return true; + } + } + return false; + } + + public static boolean hasAnyItem(Player p) { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) { + if (is != null && is.getType() != Material.AIR) { + // System.out.println("item=" + is); + return true; + } + } + for (ItemStack is : inv.getArmorContents()) { + if (is != null && is.getType() != Material.AIR) { + // System.out.println("item=" + is); + return true; + } + } + + return false; + } + + public static void addItemToInventory(Player player, ItemStack itemStack) { + addItemToInventory(player, itemStack, itemStack.getAmount(), true, + false); + } + + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount) { + addItemToInventory(player, itemStack, stockAmount, true, false); + } + + @SuppressWarnings("deprecation") + public static void addItemsToInventory(Player p, List items, + boolean ignoreHelmet) { + for (ItemStack is : items) { + InventoryUtil.addItemToInventory(p, is.clone(), is.getAmount(), + false, false); + } + try { + p.updateInventory(); + } catch (Exception e) { + } + } + + @SuppressWarnings("deprecation") + public static void addItemToInventory(Player player, ItemStack itemStack, + int stockAmount, boolean update, boolean ignoreHelmet) { + PlayerInventory inv = player.getInventory(); + Material itemType = itemStack.getType(); + if (armor.containsKey(itemType)) { + // / no item: add to armor slot + // / item better: add old to inventory, new to armor slot + // / item notbetter: add to inventory + ItemStack oldArmor = getArmorSlot(inv, armor.get(itemType)); + boolean empty = (oldArmor == null || oldArmor.getType() == Material.AIR); + boolean better = empty ? false : armorSlotBetter( + armor.get(oldArmor.getType()), armor.get(itemType)); + final boolean isHelmet = armor.get(itemType).type == ArmorType.HELM; + if (empty || better) { + switch (armor.get(itemType).type) { + case HELM: + inv.setHelmet(itemStack); + break; + case CHEST: + inv.setChestplate(itemStack); + break; + case LEGGINGS: + inv.setLeggings(itemStack); + break; + case BOOTS: + inv.setBoots(itemStack); + break; + } + } + if (!empty) { + if (better && (!isHelmet && ignoreHelmet)) { + addItemToInventory(inv, oldArmor, oldArmor.getAmount()); + } else { + addItemToInventory(inv, itemStack, stockAmount); + } + } + } else { + addItemToInventory(inv, itemStack, stockAmount); + } + if (update) { + try { + player.updateInventory(); + } catch (Exception e) { + } + } + } + + private static boolean armorSlotBetter(Armor oldArmor, Armor newArmor) { + if (oldArmor == null || newArmor == null) // / technically we could + // throw an exception.. but + // nah + { + return false; + } + return oldArmor.level.ordinal() < newArmor.level.ordinal(); + } + + private static ItemStack getArmorSlot(PlayerInventory inv, Armor armor) { + switch (armor.type) { + case HELM: + return inv.getHelmet(); + case CHEST: + return inv.getChestplate(); + case LEGGINGS: + return inv.getLeggings(); + case BOOTS: + return inv.getBoots(); + } + return null; + } + + // /Adds item to inventory + public static void addItemToInventory(Inventory inv, ItemStack is, int left) { + int maxStackSize = is.getType().getMaxStackSize(); + if (left <= maxStackSize) { + is.setAmount(left); + inv.addItem(is); + return; + } + + if (maxStackSize != 64) { + ArrayList items = new ArrayList(); + for (int i = 0; i < Math.ceil(left / maxStackSize); i++) { + if (left < maxStackSize) { + is.setAmount(left); + items.add(is); + return; + } else { + is.setAmount(maxStackSize); + items.add(is); + } + } + Object[] iArray = items.toArray(); + for (Object o : iArray) { + inv.addItem((ItemStack) o); + } + } else { + inv.addItem(is); + } + } + + public static void closeInventory(Player p) { + + try { + p.closeInventory(); + } catch (Exception closeInventoryError) { + // / This almost always throws an NPE, but does its job so ignore + } + } + + public static void clearInventory(Player p) { + try { + PlayerInventory inv = p.getInventory(); + closeInventory(p); + + if (inv != null) { + inv.clear(); + inv.setArmorContents(null); + inv.setItemInHand(null); + } + } catch (Exception ee) { + ee.printStackTrace(); + } + } + + public static Object getCommonName(ItemStack is) { + int id = is.getTypeId(); + int datavalue = is.getDurability(); + if (datavalue > 0) { + return Material.getMaterial(id).toString() + ":" + datavalue; + } + return Material.getMaterial(id).toString(); + } + + public static boolean isItem(String str) { + // System.out.println("string = " + str); + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + + debug("item=" + str); + + ItemStack is = null; + try { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + is.setAmount(Integer.valueOf(split[split.length - 1])); + for (int i = 1; i < split.length - 1; i++) { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) { + return false; + } + } + } catch (Exception e) { + return false; + } + return true; + } + + public static ItemStack parseItem(String str) throws Exception { + str = str.replaceAll("[}{]", ""); + str = str.replaceAll("=", " "); + + debug("item=" + str); + + ItemStack is = null; + try { + String split[] = str.split(" "); + is = InventoryUtil.getItemStack(split[0].trim()); + // System.out.println(" split = " + split); + final int amt = split.length > 1 ? Integer + .valueOf(split[split.length - 1]) : 1; + is.setAmount(amt); + for (int i = 1; i < split.length - 1; i++) { + EnchantmentWithLevel ewl = getEnchantment(split[i].trim()); + try { + is.addEnchantment(ewl.e, ewl.lvl); + } catch (IllegalArgumentException iae) { + Logger.getLogger("minecraft").warning( + ewl + " can not be applied to the item " + str); + } + } + } catch (Exception e) { + e.printStackTrace(); + Logger.getLogger("minecraft").severe("Couldnt parse item=" + str); + throw new Exception("parse item was bad"); + } + return is; + } + + public static EnchantmentWithLevel getEnchantment(String str) { + if (str.equalsIgnoreCase("all")) { + return new EnchantmentWithLevel(true); + } + Enchantment e = null; + str = str.replaceAll(",", ":"); + int index = str.indexOf(':'); + index = (index != -1 ? index : -1); + int lvl = -1; + if (index != -1) { + try { + lvl = Integer.parseInt(str.substring(index + 1)); + } catch (Exception err) { + } + str = str.substring(0, index); + } + + // System.out.println("String = <" + str +"> " + lvl); + try { + e = Enchantment.getById(Integer.valueOf(str)); + } catch (Exception err) { + } + if (e == null) { + e = Enchantment.getByName(str); + } + if (e == null) { + e = getEnchantmentByCommonName(str); + } + if (e == null) { + return null; + } + EnchantmentWithLevel ewl = new EnchantmentWithLevel(); + ewl.e = e; + if (lvl < e.getStartLevel()) { + lvl = e.getStartLevel(); + } + if (lvl > e.getMaxLevel()) { + lvl = e.getMaxLevel(); + } + ewl.lvl = lvl; + return ewl; + } + + public boolean addEnchantments(ItemStack is, String[] args) { + Map encs = new HashMap(); + for (String s : args) { + EnchantmentWithLevel ewl = getEnchantment(s); + if (ewl != null) { + if (ewl.all) { + return addAllEnchantments(is); + } + encs.put(ewl.e, ewl.lvl); + } + } + addEnchantments(is, encs); + return true; + } + + public void addEnchantments(ItemStack is, + Map enchantments) { + for (Enchantment e : enchantments.keySet()) { + if (e.canEnchantItem(is)) { + is.addUnsafeEnchantment(e, enchantments.get(e)); + } + } + } + + public boolean addAllEnchantments(ItemStack is) { + for (Enchantment enc : Enchantment.values()) { + if (enc.canEnchantItem(is)) { + is.addUnsafeEnchantment(enc, enc.getMaxLevel()); + } + } + return true; + } + + /** + * For Serializing an item or printing + * + * @param is + * @return + */ + public static String getItemString(ItemStack is) { + if (is == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + sb.append(is.getType().toString() + ":" + is.getData().getData() + " "); + Map encs = is.getEnchantments(); + for (Enchantment enc : encs.keySet()) { + sb.append(enc.getName() + ":" + encs.get(enc) + " "); + } + sb.append(is.getAmount()); + return sb.toString(); + } + + public static boolean hasEnchantedItem(Player p) { + PlayerInventory inv = p.getInventory(); + for (ItemStack is : inv.getContents()) { + if (is != null && is.getType() != Material.AIR) { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) { + return true; + } + } + } + for (ItemStack is : inv.getArmorContents()) { + if (is != null && is.getType() != Material.AIR) { + Map enc = is.getEnchantments(); + if (enc != null && !enc.isEmpty()) { + return true; + } + } + } + return false; + } + + public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) { + Armor a = armor.get(is.getType()); + if (a == null) { + return false; + } + return a.level == lvl; + } + + public static ItemStack getWool(int color) { + return new ItemStack(Material.WOOL, 1, (short) color); + } + + private static void debug(String output) { + if (DEBUG) { + System.out.println(output); + } + } + +} diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java b/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java new file mode 100644 index 0000000..0c0e81a --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java @@ -0,0 +1,70 @@ +package mc.alk.virtualplayers.util; + +import java.util.ArrayList; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +/** + * + * @author Alkarin + */ +public class Util { + + public interface VPMessageListener { + + public void gettingMessage(Player player, String msg); + } + + static final List listeners = new ArrayList(); + + static public String getLocString(Location l) { + if (l == null) { + return "null"; + } + StringBuilder sb = new StringBuilder(); + sb.append((isInt(l.getX())) ? l.getBlockX() : l.getX()).append(","); + sb.append((isInt(l.getY())) ? l.getBlockY() : l.getY()).append(","); + sb.append(((isInt(l.getZ())) ? l.getBlockZ() : l.getZ())); + if (l.getYaw() != 0f) { + sb.append(",").append(l.getYaw()); + } + if (l.getPitch() != 0f) { + sb.append(",").append(l.getPitch()); + } + return sb.toString(); + } + + public static void sendMessage(VirtualPlayer p, String msg) { + final String finalMsg = colorChat("&5[" + p.getDisplayName() + "] &b'" + msg + "'"); + Bukkit.getConsoleSender().sendMessage(finalMsg); + if (!listeners.isEmpty()) { + for (VPMessageListener l : listeners) { + l.gettingMessage(p, msg); + } + } + if (p.getInformed() != null) { + p.getInformed().sendMessage(finalMsg); + } + } + + public static String colorChat(String msg) { + return msg.replace('&', (char) 167); + } + + public static boolean isInt(double f) { + return Math.floor(f) == f; + } + + public static boolean addListener(VPMessageListener listener) { + return listeners.add(listener); + } + + public static boolean removeListener(VPMessageListener listener) { + return listeners.remove(listener); + } +} From b54224e64121117f5431f5c12568edfe401d3436 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 00:58:09 -0500 Subject: [PATCH 43/74] Updated POM for each module This update adds the module/api as a dependency. --- modules/v1_4_5/pom.xml | 2 +- modules/v1_4_6/pom.xml | 2 +- modules/v1_4_R1/pom.xml | 2 +- modules/v1_5_R1/pom.xml | 2 +- modules/v1_5_R2/pom.xml | 2 +- modules/v1_5_R3/pom.xml | 2 +- modules/v1_6_R1/pom.xml | 2 +- modules/v1_6_R2/pom.xml | 2 +- modules/v1_6_R3/pom.xml | 2 +- modules/v1_7_R1/pom.xml | 2 +- modules/v1_7_R2/pom.xml | 2 +- modules/v1_7_R3/pom.xml | 2 +- modules/v1_7_R4/pom.xml | 2 +- modules/v1_8_R1/pom.xml | 2 +- modules/v1_8_R2/pom.xml | 2 +- modules/v1_8_R3/pom.xml | 21 ++++++++++++++++++++- modules/vpre/pom.xml | 2 +- 17 files changed, 36 insertions(+), 17 deletions(-) diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml index f7384fa..1108f1c 100644 --- a/modules/v1_4_5/pom.xml +++ b/modules/v1_4_5/pom.xml @@ -34,7 +34,7 @@
mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml index 8744ddd..4ee05ff 100644 --- a/modules/v1_4_6/pom.xml +++ b/modules/v1_4_6/pom.xml @@ -34,7 +34,7 @@
mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml index b4dccf9..86dc8a1 100644 --- a/modules/v1_4_R1/pom.xml +++ b/modules/v1_4_R1/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml index e8f9c33..d73dc4b 100644 --- a/modules/v1_5_R1/pom.xml +++ b/modules/v1_5_R1/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_5_R2/pom.xml b/modules/v1_5_R2/pom.xml index d74fc85..6ec72d5 100644 --- a/modules/v1_5_R2/pom.xml +++ b/modules/v1_5_R2/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_5_R3/pom.xml b/modules/v1_5_R3/pom.xml index 9dd770a..7a2e527 100644 --- a/modules/v1_5_R3/pom.xml +++ b/modules/v1_5_R3/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml index bd40408..0bfdf26 100644 --- a/modules/v1_6_R1/pom.xml +++ b/modules/v1_6_R1/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_6_R2/pom.xml b/modules/v1_6_R2/pom.xml index 64a218c..f8e5ee8 100644 --- a/modules/v1_6_R2/pom.xml +++ b/modules/v1_6_R2/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_6_R3/pom.xml b/modules/v1_6_R3/pom.xml index 245dd0a..0b30770 100644 --- a/modules/v1_6_R3/pom.xml +++ b/modules/v1_6_R3/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_7_R1/pom.xml b/modules/v1_7_R1/pom.xml index 3b2519c..2f75518 100644 --- a/modules/v1_7_R1/pom.xml +++ b/modules/v1_7_R1/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml index b1b2698..74c454b 100644 --- a/modules/v1_7_R2/pom.xml +++ b/modules/v1_7_R2/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_7_R3/pom.xml b/modules/v1_7_R3/pom.xml index ea15ab8..a0d5b95 100644 --- a/modules/v1_7_R3/pom.xml +++ b/modules/v1_7_R3/pom.xml @@ -22,7 +22,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_7_R4/pom.xml b/modules/v1_7_R4/pom.xml index 0aca778..045645c 100644 --- a/modules/v1_7_R4/pom.xml +++ b/modules/v1_7_R4/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_8_R1/pom.xml b/modules/v1_8_R1/pom.xml index 31b732f..ba462b0 100644 --- a/modules/v1_8_R1/pom.xml +++ b/modules/v1_8_R1/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_8_R2/pom.xml b/modules/v1_8_R2/pom.xml index bfe895e..2125786 100644 --- a/modules/v1_8_R2/pom.xml +++ b/modules/v1_8_R2/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true diff --git a/modules/v1_8_R3/pom.xml b/modules/v1_8_R3/pom.xml index 646bab2..d8e3ab2 100644 --- a/modules/v1_8_R3/pom.xml +++ b/modules/v1_8_R3/pom.xml @@ -34,7 +34,7 @@ mc.alk - vp-util + vp-api parent true @@ -59,6 +59,25 @@ 1.6 + diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml index 7907d91..852eb1f 100644 --- a/modules/vpre/pom.xml +++ b/modules/vpre/pom.xml @@ -28,7 +28,7 @@ mc.alk - vp-util + vp-api parent true From 949926bda9cc59cf455fa037ede0e9b972c5fe55 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 01:02:32 -0500 Subject: [PATCH 44/74] Added CraftVirtualPlayer + Factory implementations - added CraftVirtualPlayer - added CraftVirtualPlayerFactory --- .../nms/v1_4_5/CraftVirtualPlayer.java | 156 ++---------- .../nms/v1_4_5/CraftVirtualPlayerFactory.java | 60 +++++ .../nms/v1_4_6/CraftVirtualPlayer.java | 187 +++----------- .../nms/v1_4_6/CraftVirtualPlayerFactory.java | 62 +++++ .../nms/v1_4_R1/CraftVirtualPlayer.java | 187 +++----------- .../v1_4_R1/CraftVirtualPlayerFactory.java | 61 +++++ .../nms/v1_5_R1/CraftVirtualPlayer.java | 187 +++----------- .../v1_5_R1/CraftVirtualPlayerFactory.java | 61 +++++ .../nms/v1_5_R2/CraftVirtualPlayer.java | 191 +++------------ .../v1_5_R2/CraftVirtualPlayerFactory.java | 61 +++++ .../nms/v1_5_R3/CraftVirtualPlayer.java | 191 +++------------ .../v1_5_R3/CraftVirtualPlayerFactory.java | 62 +++++ .../nms/v1_6_R1/CraftVirtualPlayer.java | 215 ++++++---------- .../v1_6_R1/CraftVirtualPlayerFactory.java | 61 +++++ .../nms/v1_6_R2/CraftVirtualPlayer.java | 211 ++++++---------- .../v1_6_R2/CraftVirtualPlayerFactory.java | 61 +++++ .../nms/v1_6_R3/CraftVirtualPlayer.java | 209 ++++++---------- .../v1_6_R3/CraftVirtualPlayerFactory.java | 61 +++++ .../nms/v1_7_R1/CraftVirtualPlayer.java | 213 ++++++---------- .../v1_7_R1/CraftVirtualPlayerFactory.java | 62 +++++ .../nms/v1_7_R2/CraftVirtualPlayer.java | 219 ++++++----------- .../v1_7_R2/CraftVirtualPlayerFactory.java | 62 +++++ .../nms/v1_7_R3/CraftVirtualPlayer.java | 231 ++++++------------ .../v1_7_R3/CraftVirtualPlayerFactory.java | 64 +++++ .../nms/v1_7_R4/CraftVirtualPlayer.java | 230 ++++++----------- .../v1_7_R4/CraftVirtualPlayerFactory.java | 64 +++++ .../nms/v1_8_R1/CraftVirtualPlayer.java | 220 ++++++----------- .../v1_8_R1/CraftVirtualPlayerFactory.java | 65 +++++ .../nms/v1_8_R2/CraftVirtualPlayer.java | 220 ++++++----------- .../v1_8_R2/CraftVirtualPlayerFactory.java | 65 +++++ .../nms/v1_8_R3/CraftVirtualPlayer.java | 220 ++++++----------- .../v1_8_R3/CraftVirtualPlayerFactory.java | 65 +++++ .../nms/pre/CraftVirtualPlayer.java | 163 ++---------- .../nms/pre/CraftVirtualPlayerFactory.java | 60 +++++ 34 files changed, 2012 insertions(+), 2495 deletions(-) create mode 100644 modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayerFactory.java create mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java index 562ecf4..9da4414 100644 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java @@ -1,22 +1,21 @@ package mc.alk.virtualplayers.nms.v1_4_5; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.UUID; +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.ItemInWorldManager; import net.minecraft.server.v1_4_5.MinecraftServer; import net.minecraft.server.v1_4_5.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_4_5.CraftServer; import org.bukkit.craftbukkit.v1_4_5.CraftWorld; import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; @@ -29,29 +28,30 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; Location loc; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, ItemInWorldManager iiw, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, String s, ItemInWorldManager iiw) { - /// mcserver, worldserver, string, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, world, s, iiw)); this.loc = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); this.loc = this.getLocation(); } @@ -135,16 +135,18 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; @@ -153,7 +155,7 @@ public boolean teleport(Location l, boolean respawn) { boolean changedWorlds = !this.loc.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { @@ -194,6 +196,7 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; boolean changedWorlds = !this.loc.getWorld().getName() @@ -219,8 +222,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -249,128 +253,14 @@ public void setLocation(Location l) { loc = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - ItemInWorldManager iiw = new ItemInWorldManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayerFactory.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..e08ffe4 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayerFactory.java @@ -0,0 +1,60 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_4_5.ItemInWorldManager; +import net.minecraft.server.v1_4_5.MinecraftServer; +import net.minecraft.server.v1_4_5.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_5.CraftServer; +import org.bukkit.craftbukkit.v1_4_5.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer vp = new CraftVirtualPlayer(cserver, mcserver, world, name, iiw, location); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java index da86ee6..60cc9b0 100644 --- a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java @@ -1,22 +1,18 @@ package mc.alk.virtualplayers.nms.v1_4_6; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.MinecraftServer; import net.minecraft.server.v1_4_6.PlayerInteractManager; import net.minecraft.server.v1_4_6.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_4_6.CraftServer; import org.bukkit.craftbukkit.v1_4_6.CraftWorld; import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; @@ -29,31 +25,32 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -135,43 +132,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -194,9 +193,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -211,7 +211,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -219,8 +219,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -239,138 +240,24 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayerFactory.java b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..4435a39 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayerFactory.java @@ -0,0 +1,62 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_4_6.MinecraftServer; +import net.minecraft.server.v1_4_6.PlayerInteractManager; +import net.minecraft.server.v1_4_6.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_6.CraftServer; +import org.bukkit.craftbukkit.v1_4_6.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} + diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java index 88444a6..c15853e 100644 --- a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java @@ -1,22 +1,18 @@ package mc.alk.virtualplayers.nms.v1_4_R1; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.MinecraftServer; import net.minecraft.server.v1_4_R1.PlayerInteractManager; import net.minecraft.server.v1_4_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_4_R1.CraftServer; import org.bukkit.craftbukkit.v1_4_R1.CraftWorld; import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; @@ -29,31 +25,32 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -135,43 +132,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -194,9 +193,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -211,7 +211,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -219,8 +219,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -239,138 +240,24 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayerFactory.java b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..cf6733f --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,61 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_4_R1.MinecraftServer; +import net.minecraft.server.v1_4_R1.PlayerInteractManager; +import net.minecraft.server.v1_4_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_4_R1.CraftServer; +import org.bukkit.craftbukkit.v1_4_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java index 9396f66..2b18124 100644 --- a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java @@ -1,22 +1,18 @@ package mc.alk.virtualplayers.nms.v1_5_R1; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_5_R1.EntityPlayer; import net.minecraft.server.v1_5_R1.MinecraftServer; import net.minecraft.server.v1_5_R1.PlayerInteractManager; import net.minecraft.server.v1_5_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_5_R1.CraftServer; import org.bukkit.craftbukkit.v1_5_R1.CraftWorld; import org.bukkit.craftbukkit.v1_5_R1.entity.CraftPlayer; @@ -29,31 +25,32 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -135,43 +132,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -194,9 +193,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -211,7 +211,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -219,8 +219,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -239,138 +240,24 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayerFactory.java b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..a507a6d --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,61 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_5_R1.MinecraftServer; +import net.minecraft.server.v1_5_R1.PlayerInteractManager; +import net.minecraft.server.v1_5_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R1.CraftServer; +import org.bukkit.craftbukkit.v1_5_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java index 212c03d..bcb1150 100644 --- a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java @@ -1,22 +1,18 @@ package mc.alk.virtualplayers.nms.v1_5_R2; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.MinecraftServer; import net.minecraft.server.v1_5_R2.PlayerInteractManager; import net.minecraft.server.v1_5_R2.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_5_R2.CraftServer; import org.bukkit.craftbukkit.v1_5_R2.CraftWorld; import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; @@ -32,32 +28,33 @@ import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -139,43 +136,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -198,9 +197,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -215,7 +215,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -223,8 +223,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -243,12 +244,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -263,7 +264,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -274,131 +275,17 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayerFactory.java b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..44e3381 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayerFactory.java @@ -0,0 +1,61 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_5_R2.MinecraftServer; +import net.minecraft.server.v1_5_R2.PlayerInteractManager; +import net.minecraft.server.v1_5_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R2.CraftServer; +import org.bukkit.craftbukkit.v1_5_R2.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java index 43ce5cb..93578ab 100644 --- a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java @@ -1,22 +1,18 @@ package mc.alk.virtualplayers.nms.v1_5_R3; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.MinecraftServer; import net.minecraft.server.v1_5_R3.PlayerInteractManager; import net.minecraft.server.v1_5_R3.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_5_R3.CraftServer; import org.bukkit.craftbukkit.v1_5_R3.CraftWorld; import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; @@ -32,32 +28,33 @@ import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -139,43 +136,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -198,9 +197,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -215,7 +215,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -223,8 +223,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -243,12 +244,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -263,7 +264,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -274,131 +275,17 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayerFactory.java b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..2a5f281 --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayerFactory.java @@ -0,0 +1,62 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_5_R3.MinecraftServer; +import net.minecraft.server.v1_5_R3.PlayerInteractManager; +import net.minecraft.server.v1_5_R3.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_5_R3.CraftServer; +import org.bukkit.craftbukkit.v1_5_R3.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} + diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java index b6c973e..7d83b0b 100644 --- a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java @@ -1,26 +1,23 @@ package mc.alk.virtualplayers.nms.v1_6_R1; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.MinecraftServer; import net.minecraft.server.v1_6_R1.PlayerInteractManager; import net.minecraft.server.v1_6_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_6_R1.CraftServer; import org.bukkit.craftbukkit.v1_6_R1.CraftWorld; import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -31,33 +28,35 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; - double health = 20D; + double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -139,43 +138,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -198,9 +199,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -215,7 +217,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -223,8 +225,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -243,12 +246,16 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } + public void setLocation(Location l) { + location = l; + } + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -263,7 +270,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -273,132 +280,54 @@ public CraftScoreboard getScoreboard() { return this.scoreboard; } - public void setLocation(Location l) { - loc = l; - } - + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static Map getVps() { - return vps; + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static Map getNames() { - return names; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayerFactory.java b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..aa1241d --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,61 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_6_R1.MinecraftServer; +import net.minecraft.server.v1_6_R1.PlayerInteractManager; +import net.minecraft.server.v1_6_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R1.CraftServer; +import org.bukkit.craftbukkit.v1_6_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java index 1727082..e66d3f6 100644 --- a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java @@ -1,26 +1,23 @@ package mc.alk.virtualplayers.nms.v1_6_R2; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.MinecraftServer; import net.minecraft.server.v1_6_R2.PlayerInteractManager; import net.minecraft.server.v1_6_R2.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_6_R2.CraftServer; import org.bukkit.craftbukkit.v1_6_R2.CraftWorld; import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -31,33 +28,35 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; - double health = 20D; + double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, string, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -139,43 +138,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -198,9 +199,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -215,7 +217,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -223,8 +225,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -243,12 +246,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -263,7 +266,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -274,131 +277,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static Map getVps() { - return vps; + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static Map getNames() { - return names; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayerFactory.java b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..81513ad --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayerFactory.java @@ -0,0 +1,61 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_6_R2.MinecraftServer; +import net.minecraft.server.v1_6_R2.PlayerInteractManager; +import net.minecraft.server.v1_6_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R2.CraftServer; +import org.bukkit.craftbukkit.v1_6_R2.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java index ef67ac3..28c25cf 100644 --- a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java @@ -1,26 +1,23 @@ package mc.alk.virtualplayers.nms.v1_6_R3; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.MinecraftServer; import net.minecraft.server.v1_6_R3.PlayerInteractManager; import net.minecraft.server.v1_6_R3.WorldServer; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_6_R3.CraftServer; import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -31,33 +28,35 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, PlayerInteractManager pim) { super(cserver, new EntityPlayer(mcserver, world, s, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override @@ -139,43 +138,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -198,9 +199,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -215,7 +217,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -223,8 +225,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -243,12 +246,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -263,7 +266,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -274,131 +277,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static Map getVps() { - return vps; + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static Map getNames() { - return names; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayerFactory.java b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..9a7f946 --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayerFactory.java @@ -0,0 +1,61 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.v1_6_R3.MinecraftServer; +import net.minecraft.server.v1_6_R3.PlayerInteractManager; +import net.minecraft.server.v1_6_R3.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_6_R3.CraftServer; +import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, world, name, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(cvp.getUniqueId(), vp); + names.put(cvp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java index 099ced9..7ff885b 100644 --- a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java @@ -1,25 +1,24 @@ package mc.alk.virtualplayers.nms.v1_7_R1; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_7_R1.EntityPlayer; import net.minecraft.server.v1_7_R1.MinecraftServer; import net.minecraft.server.v1_7_R1.PlayerInteractManager; import net.minecraft.server.v1_7_R1.WorldServer; import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_7_R1.CraftServer; import org.bukkit.craftbukkit.v1_7_R1.CraftWorld; import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -30,40 +29,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -138,43 +139,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -197,9 +200,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -214,7 +218,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -222,8 +226,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -242,12 +247,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -262,7 +267,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -273,131 +278,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static Map getVps() { - return vps; + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static Map getNames() { - return names; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayerFactory.java b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..f68e5a0 --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,62 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_7_R1.MinecraftServer; +import net.minecraft.server.v1_7_R1.PlayerInteractManager; +import net.minecraft.server.v1_7_R1.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R1.CraftServer; +import org.bukkit.craftbukkit.v1_7_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java index 86c108c..31e5f64 100644 --- a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java @@ -1,25 +1,24 @@ package mc.alk.virtualplayers.nms.v1_7_R2; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_7_R2.EntityPlayer; import net.minecraft.server.v1_7_R2.MinecraftServer; import net.minecraft.server.v1_7_R2.PlayerInteractManager; import net.minecraft.server.v1_7_R2.WorldServer; import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_7_R2.CraftServer; import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -30,40 +29,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -138,43 +139,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -197,9 +200,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -214,7 +218,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -222,8 +226,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -242,12 +247,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -262,7 +267,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -273,137 +278,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static Map getVps() { - return vps; + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static Map getNames() { - return names; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayerFactory.java b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..8a9e8d1 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayerFactory.java @@ -0,0 +1,62 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_7_R2.MinecraftServer; +import net.minecraft.server.v1_7_R2.PlayerInteractManager; +import net.minecraft.server.v1_7_R2.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R2.CraftServer; +import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) + throw new Exception("There must be at least one world"); + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1);} + GameProfile gameProfile = new GameProfile(UUID.randomUUID().toString(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java index 96fb93c..5ca1976 100644 --- a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java @@ -1,27 +1,25 @@ package mc.alk.virtualplayers.nms.v1_7_R3; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_7_R3.EntityPlayer; import net.minecraft.server.v1_7_R3.MinecraftServer; import net.minecraft.server.v1_7_R3.PlayerInteractManager; import net.minecraft.server.v1_7_R3.WorldServer; import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_7_R3.CraftServer; import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -31,43 +29,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -142,43 +139,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -201,9 +200,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -218,7 +218,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -226,8 +226,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -246,12 +247,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -266,7 +267,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -277,137 +278,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayerFactory.java b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..5e10617 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayerFactory.java @@ -0,0 +1,64 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_7_R3.MinecraftServer; +import net.minecraft.server.v1_7_R3.PlayerInteractManager; +import net.minecraft.server.v1_7_R3.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R3.CraftServer; +import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java index d9f4545..943772a 100644 --- a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java @@ -1,25 +1,24 @@ package mc.alk.virtualplayers.nms.v1_7_R4; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_7_R4.EntityPlayer; import net.minecraft.server.v1_7_R4.MinecraftServer; import net.minecraft.server.v1_7_R4.PlayerInteractManager; import net.minecraft.server.v1_7_R4.WorldServer; import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_7_R4.CraftServer; import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R4.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -30,43 +29,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -141,43 +139,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -200,9 +200,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -217,7 +218,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -225,8 +226,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -245,12 +247,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -265,7 +267,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -276,137 +278,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) vp = vps.get(id); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); - return (Player[]) ArrayUtils.addAll(ps, bps); + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } + } diff --git a/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayerFactory.java b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..9cc34ca --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayerFactory.java @@ -0,0 +1,64 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_7_R4.MinecraftServer; +import net.minecraft.server.v1_7_R4.PlayerInteractManager; +import net.minecraft.server.v1_7_R4.WorldServer; +import net.minecraft.util.com.mojang.authlib.GameProfile; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java index f539884..0d25cbf 100644 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java @@ -1,25 +1,25 @@ package mc.alk.virtualplayers.nms.v1_8_R1; import com.mojang.authlib.GameProfile; -import java.util.ArrayList; + import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_8_R1.EntityPlayer; import net.minecraft.server.v1_8_R1.MinecraftServer; import net.minecraft.server.v1_8_R1.PlayerInteractManager; import net.minecraft.server.v1_8_R1.WorldServer; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_8_R1.CraftServer; import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -30,43 +30,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -141,43 +140,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -200,9 +201,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -217,7 +219,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -225,8 +227,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -245,12 +248,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -265,7 +268,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -276,140 +279,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static Player getPlayer(String pname) { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) { - vp = names.get(pname); - } - return vp; + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) { - vp = vps.get(id); - } - return vp; + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player getPlayerExact(String pname) { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) { - vp = names.get(pname); - } - return vp; + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static Player getOrMakePlayer(String pname) { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) { - vp = names.get(pname); - } - if (vp == null) { - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static Player[] getOnlinePlayers() { - List players = new ArrayList(); - for (Player p : vps.values()) { - if (p.isOnline()) { - players.add(p); - } - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) { - throw new Exception("There must be at least one world"); - } - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1); - } - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() { - for (VirtualPlayer vp : vps.values()) { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try { - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } } diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayerFactory.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..49d5ae4 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_8_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_8_R1.MinecraftServer; +import net.minecraft.server.v1_8_R1.PlayerInteractManager; +import net.minecraft.server.v1_8_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R1.CraftServer; +import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java index 42fd2a3..9280216 100644 --- a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java @@ -1,25 +1,25 @@ package mc.alk.virtualplayers.nms.v1_8_R2; import com.mojang.authlib.GameProfile; -import java.util.ArrayList; + import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_8_R2.EntityPlayer; import net.minecraft.server.v1_8_R2.MinecraftServer; import net.minecraft.server.v1_8_R2.PlayerInteractManager; import net.minecraft.server.v1_8_R2.WorldServer; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_8_R2.CraftServer; import org.bukkit.craftbukkit.v1_8_R2.CraftWorld; import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -30,43 +30,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -141,43 +140,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -200,9 +201,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -217,7 +219,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -225,8 +227,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -245,12 +248,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -265,7 +268,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -276,140 +279,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static Player getPlayer(String pname) { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) { - vp = names.get(pname); - } - return vp; + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) { - vp = vps.get(id); - } - return vp; + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player getPlayerExact(String pname) { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) { - vp = names.get(pname); - } - return vp; + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static Player getOrMakePlayer(String pname) { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) { - vp = names.get(pname); - } - if (vp == null) { - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static Player[] getOnlinePlayers() { - List players = new ArrayList(); - for (Player p : vps.values()) { - if (p.isOnline()) { - players.add(p); - } - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) { - throw new Exception("There must be at least one world"); - } - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1); - } - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() { - for (VirtualPlayer vp : vps.values()) { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try { - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } } diff --git a/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayerFactory.java b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..ad13d8a --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_8_R2.MinecraftServer; +import net.minecraft.server.v1_8_R2.PlayerInteractManager; +import net.minecraft.server.v1_8_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R2.CraftServer; +import org.bukkit.craftbukkit.v1_8_R2.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java index 65d87bd..da6d013 100644 --- a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java @@ -1,25 +1,25 @@ package mc.alk.virtualplayers.nms.v1_8_R3; import com.mojang.authlib.GameProfile; -import java.util.ArrayList; + import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.MinecraftServer; import net.minecraft.server.v1_8_R3.PlayerInteractManager; import net.minecraft.server.v1_8_R3.WorldServer; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.v1_8_R3.CraftServer; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.scoreboard.CraftScoreboard; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -30,43 +30,42 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; double health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; - Location loc; + Location location; CraftScoreboard scoreboard; - - /** - * Added static maps from VirtualPlayers JavaPlugin class. - */ - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, GameProfile gameProfile, PlayerInteractManager pim) { - /// mcserver, worldserver, GameProfile, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); - this.loc = this.getLocation(); + this.location = this.getLocation(); } - - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); - this.loc = this.getLocation(); + this.location = this.getLocation(); } @Override public InventoryView openInventory(Inventory inv) { return null; } - + @Override public boolean addPotionEffect(PotionEffect effect) { return false; @@ -141,43 +140,45 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; } try { - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + fromWorld = "&5" + location.getWorld().getName() + "&4,"; toWorld = "&5" + l.getWorld().getName() + "&4,"; } Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + Util.getLocString(l)); } - this.loc = l.clone(); + this.location = l.clone(); if (changedWorlds) { PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, l.getWorld()); CraftServer cserver = (CraftServer) Bukkit.getServer(); cserver.getPluginManager().callEvent(pcwe); /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); } } catch (Exception e) { e.printStackTrace(); @@ -200,9 +201,10 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() + boolean changedWorlds = !this.location.getWorld().getName() .equals(loc.getWorld().getName()); CraftServer cserver = (CraftServer) Bukkit.getServer(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, @@ -217,7 +219,7 @@ public void respawn(Location loc) { @Override public Location getLocation() { - return loc; + return location; } @Override @@ -225,8 +227,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -245,12 +248,12 @@ public void setOp(boolean b) { @Override public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; + String world = "&5" + this.location.getWorld().getName() + ","; return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); } - + @Override public void setScoreboard(Scoreboard scoreboard) { Object s = null; @@ -265,7 +268,7 @@ public void setScoreboard(Scoreboard scoreboard) { s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); } } - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " setting scoreboard " + s); } } @@ -276,140 +279,57 @@ public CraftScoreboard getScoreboard() { } public void setLocation(Location l) { - loc = l; + location = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was moved out of VirtualPlayers JavaPlugin class.
- * - * ********************************************************************* - * ********************************************************************* - */ - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static Player getPlayer(String pname) { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) { - vp = names.get(pname); - } - return vp; + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); } - public static Player getPlayer(UUID id) { - Player vp = Bukkit.getPlayer(id); - if (vp == null) { - vp = vps.get(id); - } - return vp; + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); } - public static Player getPlayerExact(String pname) { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) { - vp = names.get(pname); - } - return vp; + @Override + public void _INVALID_damage(int amount) { + damage(amount); } - public static Player getOrMakePlayer(String pname) { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) { - vp = names.get(pname); - } - if (vp == null) { - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); } - public static Player[] getOnlinePlayers() { - List players = new ArrayList(); - for (Player p : vps.values()) { - if (p.isOnline()) { - players.add(p); - } - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); - return (Player[]) ArrayUtils.addAll(ps, bps); + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); } - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) { - throw new Exception("There must be at least one world"); - } - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer worldServer = mcserver.getWorldServer(0); - PlayerInteractManager pim = new PlayerInteractManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1); - } - GameProfile gameProfile = new GameProfile(UUID.randomUUID(), CustomCommandExecutor.colorChat(name)); - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() { - for (VirtualPlayer vp : vps.values()) { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); } - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try { - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } } diff --git a/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayerFactory.java b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..77a69f6 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_8_R3.MinecraftServer; +import net.minecraft.server.v1_8_R3.PlayerInteractManager; +import net.minecraft.server.v1_8_R3.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java index 12f4bb0..f74dd84 100644 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java @@ -1,20 +1,18 @@ package mc.alk.virtualplayers.nms.pre; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + import net.minecraft.server.EntityPlayer; import net.minecraft.server.ItemInWorldManager; import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldServer; -import org.apache.commons.lang.ArrayUtils; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -27,29 +25,30 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class VirtualPlayer extends CraftPlayer { +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { Player keepInformed; // / who to send the messages to boolean online = true; int health = 20; boolean isop = true; - static boolean enableMessages = true; boolean showMessages = true; boolean showTeleports = true; GameMode gamemode = GameMode.SURVIVAL; Location loc; - static final Map vps = new HashMap(); - static final Map names = new HashMap(); - - public VirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, ItemInWorldManager iiw, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, String s, ItemInWorldManager iiw) { - /// mcserver, worldserver, string, PlayerInteractManager super(cserver, new EntityPlayer(mcserver, world, s, iiw)); this.loc = this.getLocation(); } - public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { super(cserver, ep); this.loc = this.getLocation(); } @@ -58,20 +57,17 @@ public VirtualPlayer(CraftServer cserver, EntityPlayer ep) { public InventoryView openInventory(Inventory inv) { return null; } - - /** Needs to be fixed: Generating errors. */ + @Override public boolean addPotionEffect(PotionEffect effect) { return false; } - /** Needs to be fixed: Generating errors. */ @Override public boolean addPotionEffect(PotionEffect effect, boolean force) { return false; } - /** Needs to be fixed: Generating errors. */ @Override public boolean addPotionEffects(Collection effects) { return false; @@ -136,16 +132,18 @@ public boolean isDead() { @Override public void sendMessage(String s) { - if (showMessages && enableMessages) { + if (showMessages) { Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + getName() + " gettingMessage= " + s); } } + @Override public void moveTo(Location loc) { entity.move(loc.getX(), loc.getY(), loc.getZ()); } + @Override public boolean teleport(Location l, boolean respawn) { if (isDead()) { return false; @@ -154,7 +152,7 @@ public boolean teleport(Location l, boolean respawn) { boolean changedWorlds = !this.loc.getWorld().getName() .equals(l.getWorld().getName()); final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && enableMessages) { + if (showTeleports && showMessages) { String fromWorld = ""; String toWorld = ""; if (changedWorlds) { @@ -195,6 +193,7 @@ public boolean teleport(Location l) { return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); } + @Override public void respawn(Location loc) { this.health = 20; boolean changedWorlds = !this.loc.getWorld().getName() @@ -220,8 +219,9 @@ public boolean isOnline() { return online; } + @Override public void setOnline(boolean b) { - if (enableMessages) { + if (showMessages) { Util.sendMessage(this, getName() + " is " + (b ? "connecting" : "disconnecting")); } @@ -250,125 +250,14 @@ public void setLocation(Location l) { loc = l; } + @Override public Player getInformed() { return keepInformed; } - public static void setGlobalMessages(boolean enable) { - VirtualPlayer.enableMessages = enable; - } - - /** - * Everything below was factored out of VirtualPlayers JavaPlugin class. - */ - public static Player getPlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getPlayerExact(String pname) - { - Player vp = Bukkit.getPlayerExact(pname); - if (vp == null) vp = names.get(pname); - return vp; - } - - public static Player getOrMakePlayer(String pname) - { - Player vp = Bukkit.getPlayer(pname); - if (vp == null) vp = names.get(pname); - if (vp == null){ - try { - return makeVirtualPlayer(pname); - } catch (Exception e) { - e.printStackTrace(); - } - } - return vp; - } - - public static Player[] getOnlinePlayers() - { - List players = new ArrayList(); - for (Player p : vps.values()){ - if (p.isOnline()){ - players.add(p);} - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers(); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) - throw new Exception("There must be at least one world"); - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - ItemInWorldManager iiw = new ItemInWorldManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1);} - VirtualPlayer vp = new VirtualPlayer(cserver, mcserver, world, name, iiw); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - vp.loc = location; - return vp; - } - - public static Player deleteVirtualPlayer(VirtualPlayer vp) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - vps.remove(vp.getUniqueId()); - return vp; - } - - public static void deleteVirtualPlayers() - { - for (VirtualPlayer vp : vps.values()) - { - WorldServer world = ((CraftWorld) vp.getLocation().getWorld()).getHandle(); - world.removeEntity(vp.getHandle()); - vp.remove(); - } - vps.clear(); - } - - public static List getPlayerList() { - synchronized (vps) { - return new ArrayList(vps.values()); - } + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; } - public static VirtualPlayer getOrCreate(String name) { - Player vp = names.get(name); - if (vp == null) { - try{ - vp = makeVirtualPlayer(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - return (VirtualPlayer) vp; - } - - public static Map getVps() { - return vps; - } - - public static Map getNames() { - return names; - } } diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..69a7988 --- /dev/null +++ b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java @@ -0,0 +1,60 @@ +package mc.alk.virtualplayers.nms.pre; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer vp = new CraftVirtualPlayer(cserver, mcserver, world, name, iiw, location); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 4e11648d4950cbbfb1d7b9fc905a91a9a7b5dc3b Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 01:05:59 -0500 Subject: [PATCH 45/74] Added command alias vps --- modules/VirtualPlayers/src/main/java/plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/VirtualPlayers/src/main/java/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml index 3625765..1e59524 100644 --- a/modules/VirtualPlayers/src/main/java/plugin.yml +++ b/modules/VirtualPlayers/src/main/java/plugin.yml @@ -6,7 +6,7 @@ main: mc.alk.virtualplayers.VirtualPlayers website: https://github.com/Europia79/VirtualPlayers commands: virtualplayers: - aliases: [vp,virtualplayer] + aliases: [vp,vps,virtualplayer] ap: description: add virtual player usage: /ap [arguments] From e51d0748dd671c6854a60d0d9189646021b162e1 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 01:42:28 -0500 Subject: [PATCH 46/74] Added BattleBukkitLib v2.2.1 BattleBukkitLib abstracts away the implementations details for DamageUtil.damage() which uses an interface handler behind the scenes. These are the details that need to be hidden: (because they're version dependent): EntityPlayer ep = ((CraftPlayer) damagee).getHandle(); ep.damageEntity(DamageSource.GENERIC, (float) damage); which uses import org.bukkit.craftbukkit.{version}.entity.CraftPlayer; import net.minecraft.server.{version}.EntityPlayer; import net.minecraft.server.{version}.DamageSource; DamageUtil.damage() is used in PlayerExecutor for the "hit" cmd. Using DamageUtil makes PlayerExecutor version independent. --- modules/api/pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/api/pom.xml b/modules/api/pom.xml index c105181..bdd3467 100644 --- a/modules/api/pom.xml +++ b/modules/api/pom.xml @@ -26,6 +26,12 @@ 1.7.10-R0.1-SNAPSHOT provided + + mc.alk + BattleBukkitLib + 2.2.1 + compile + mc.euro Version @@ -67,8 +73,8 @@ false - mc.alk:* mc.euro:Version + mc.alk:BattleBukkitLib @@ -76,6 +82,10 @@ mc.euro.version mc.alk.virtualplayers.version + + mc.alk.util + mc.alk.virtualplayers.battlelib + From 3db28cec292f4e475e04d72ef0303538187413b3 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 01:53:12 -0500 Subject: [PATCH 47/74] Added version independent Executors Added: - CustomCommandExecutor.java - PlayerExecutor.java - VPBaseExecutor.java - VPExecutor.java - VirtualPlayerListener.java Previously, these were located in the nms.{version} packages/modules. By design, it was necessary to have these classes duplicated per module because they contained version dependent code. The problem with having them duplicated in each module is that it was tedious to make changes, or make additions because each module would have to be modified & updated. But with the introduction of the VirtualPlayer interface, they have now been made version independent. Now, any changes or additions to these classes will be propagated to each version of Minecraft... As long as there is an implementation module that implements the VirtualPlayer interface and the VirtualPlayerFactory abstraction. --- .../executors/CustomCommandExecutor.java | 849 ++++++++++++++++++ .../executors/PlayerExecutor.java | 449 +++++++++ .../executors/VPBaseExecutor.java | 123 +++ .../virtualplayers/executors/VPExecutor.java | 80 ++ .../listeners/VirtualPlayerListener.java | 55 ++ 5 files changed, 1556 insertions(+) create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java create mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java new file mode 100644 index 0000000..7afb97f --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java @@ -0,0 +1,849 @@ +package mc.alk.virtualplayers.executors; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +import mc.alk.virtualplayers.VirtualPlayers; +import mc.alk.virtualplayers.util.InventoryUtil; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class CustomCommandExecutor implements CommandExecutor { + + public static final String version = "2.1.2"; + final int commandIndex; + + @Retention(RetentionPolicy.RUNTIME) + public static @interface MCCommand { + + /// the cmd and all its aliases, can be blank if you want to do something when they just type + /// the command only + String[] cmds() default {}; + + /// subCommands + String[] subCmds() default {}; + + /// Verify the number of parameters, + int min() default 0; + + int max() default Integer.MAX_VALUE; + + int exact() default -1; + + int order() default -1; + + float helpOrder() default Integer.MAX_VALUE; + + boolean admin() default false; /// admin + + boolean op() default false; /// op + + String usage() default ""; + + String usageNode() default ""; + + String perm() default ""; /// permission node + + int[] alphanum() default {}; /// only alpha numeric + } + + static final boolean DEBUG = false; + private HashMap> methods + = new HashMap>(); + private HashMap>> subCmdMethods + = new HashMap>>(); + + final Plugin plugin; + final Logger log; + int useAlias = -1; + + protected PriorityQueue usage = new PriorityQueue(2, new Comparator() { + @Override + public int compare(MethodWrapper mw1, MethodWrapper mw2) { + MCCommand cmd1 = mw1.getCommand(); + MCCommand cmd2 = mw2.getCommand(); + + int c = new Float(mw1.getHelpOrder()).compareTo(mw2.getHelpOrder()); + if (c != 0) { + return c; + } + c = new Integer(cmd1.order()).compareTo(cmd2.order()); + return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); + } + }); + static final String DEFAULT_CMD = "_dcmd_"; + + /** + * Custom arguments class so that we can return a modified arguments + */ + protected class Arguments { + + public Object[] args; + } + + class MethodWrapper { + + public MethodWrapper(Object obj, Method method) { + this.obj = obj; + this.method = method; + } + + public Object obj; /// Object instance the method belongs to + public Method method; /// Method + public String usage; + Float helpOrder = null; + + public MCCommand getCommand() { + return this.method.getAnnotation(MCCommand.class); + } + + public float getHelpOrder() { + return helpOrder != null + ? helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + } + } + + protected CustomCommandExecutor(Plugin plugin) { + this(plugin, 0); + } + + protected CustomCommandExecutor(Plugin plugin, int commandIndex) { + this.plugin = plugin; + this.log = plugin.getLogger(); + this.commandIndex = commandIndex; + addMethods(this, getClass().getMethods()); + } + + /** + * When no arguments are supplied, no method is found What to display when + * this happens + * + * @param sender the sender + */ + protected void showHelp(CommandSender sender, Command command) { + showHelp(sender, command, null); + } + + protected void showHelp(CommandSender sender, Command command, String[] args) { + help(sender, command, args); + } + + protected boolean validCommandSenderClass(Class clazz) { + return clazz != CommandSender.class || clazz != Player.class; + } + + public void addMethods(Object obj, Method[] methodArray) { + + for (Method method : methodArray) { + MCCommand mc = method.getAnnotation(MCCommand.class); + if (mc == null) { + continue; + } + Class types[] = method.getParameterTypes(); + if (types.length == 0 || !validCommandSenderClass(types[0])) { + System.err.println("MCCommands must start with a CommandSender,Player, or ArenaPlayer"); + continue; + } + if (mc.cmds().length == 0) { /// There is no subcommand. just the command itself with arguments + addMethod(obj, method, mc, DEFAULT_CMD); + } else { + /// For each of the cmds, store them with the method + for (String cmd : mc.cmds()) { + addMethod(obj, method, mc, cmd.toLowerCase()); + } + } + } + } + + private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { + int ml = method.getParameterTypes().length; + if (mc.subCmds().length == 0) { + TreeMap mthds = methods.get(cmd); + if (mthds == null) { + mthds = new TreeMap(); + } + int order = (mc.order() != -1 ? mc.order() * 100000 : Integer.MAX_VALUE) - ml * 100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj, method); + mthds.put(order, mw); + methods.put(cmd, mthds); + addUsage(mw, mc); + } else { + Map> basemthds = subCmdMethods.get(cmd); + if (basemthds == null) { + basemthds = new HashMap>(); + subCmdMethods.put(cmd, basemthds); + } + for (String subcmd : mc.subCmds()) { + TreeMap mthds = basemthds.get(subcmd); + if (mthds == null) { + mthds = new TreeMap(); + basemthds.put(subcmd, mthds); + } + int order = (mc.order() != -1 ? mc.order() * 100000 : Integer.MAX_VALUE) - ml * 100 - mthds.size(); + MethodWrapper mw = new MethodWrapper(obj, method); + /// Set help order + if (mc.helpOrder() == Integer.MAX_VALUE) { + mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); + } + mthds.put(order, mw); + addUsage(mw, mc); + } + } + } + + private void addUsage(MethodWrapper method, MCCommand mc) { + /// save the usages, for showing help messages + if (!mc.usage().isEmpty()) { + method.usage = mc.usage(); + } else { /// Generate an automatic usage string + method.usage = createUsage(method.method); + } + usage.add(method); + } + + private String createUsage(Method method) { + MCCommand cmd = method.getAnnotation(MCCommand.class); + List str = new ArrayList(); + String thecmd = cmd.cmds().length > 0 ? cmd.cmds()[0] : ""; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0] : null; + + Class types[] = method.getParameterTypes(); + if (commandIndex == 0) { + str.add(thecmd); + if (thesubcmd != null) { + str.add(thesubcmd); + } + } + for (int i = 1; i < types.length; i++) { + Class theclass = types[i]; + str.add(getUsageString(theclass)); + if (i == commandIndex) { + str.add(thecmd); + if (thesubcmd != null) { + str.add(thesubcmd); + } + } + } + return StringUtils.join(str, " "); + } + + protected String getUsageString(Class clazz) { + if (Player.class == clazz) { + return ""; + } else if (OfflinePlayer.class == clazz) { + return ""; + } else if (Location.class == clazz) { + return ""; + } else if (String.class == clazz) { + return ""; + } else if (Integer.class == clazz || int.class == clazz) { + return ""; + } else if (Float.class == clazz || float.class == clazz) { + return ""; + } else if (Double.class == clazz || double.class == clazz) { + return ""; + } else if (Short.class == clazz || short.class == clazz) { + return ""; + } else if (Boolean.class == clazz || boolean.class == clazz) { + return ""; + } else if (String[].class == clazz || Object[].class == clazz) { + return "[string ...]"; + } else if (GameMode.class == clazz) { + return ""; + } else if (ItemStack.class == clazz) { + return ""; + } + + return " "; + } + + public class CommandException { + + final IllegalArgumentException err; + final MethodWrapper mw; + + public CommandException(IllegalArgumentException err, MethodWrapper mw) { + this.err = err; + this.mw = mw; + } + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + TreeMap methodmap = null; + + /// No method to handle, show some help + if ((args.length == 0 && !methods.containsKey(DEFAULT_CMD)) + || (args.length > 0 && (args[0].equals("?") || args[0].equals("help")))) { + showHelp(sender, command, args); + return true; + } + final int length = args.length; + final String cmd = length > commandIndex ? args[commandIndex].toLowerCase() : null; + final String subcmd = length > commandIndex + 1 ? args[commandIndex + 1].toLowerCase() : null; + boolean hasCmd = false; + boolean hasSubCmd = false; + /// check for subcommands + if (subcmd != null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)) { + methodmap = subCmdMethods.get(cmd).get(subcmd); + hasSubCmd = true; + } + if (methodmap == null && cmd != null) { /// Find our method, and verify all the annotations + methodmap = methods.get(cmd); + if (methodmap != null) { + hasCmd = true; + } + } + + if (methodmap == null) { /// our last attempt + methodmap = methods.get(DEFAULT_CMD); + } + + if (methodmap == null || methodmap.isEmpty()) { + return sendMessage(sender, "&cThat command does not exist!&6 /" + command.getLabel() + " help &c for help"); + } + + MCCommand mccmd; + List errs = null; + boolean success = false; + for (MethodWrapper mwrapper : methodmap.values()) { + mccmd = mwrapper.method.getAnnotation(MCCommand.class); + final boolean isOp = sender == null || sender.isOp() || sender instanceof ConsoleCommandSender; + + if (mccmd.op() && !isOp || mccmd.admin() && !hasAdminPerms(sender)) /// no op, no pass + { + continue; + } + Arguments newArgs = null; + try { + newArgs = verifyArgs(mwrapper, mccmd, sender, command, label, args, hasCmd, hasSubCmd); + + Object completed = invoke(mwrapper, newArgs); + if (completed != null && completed instanceof Boolean) { + success = (Boolean) completed; + if (!success) { + String usage = mwrapper.usage; + if (usage != null && !usage.isEmpty()) { + sendMessage(sender, usage); + } + } + } else { + success = true; + } + break; /// success on one + } catch (IllegalArgumentException e) { /// One of the arguments wasn't correct, store the message + if (errs == null) { + errs = new ArrayList(); + } + errs.add(new CommandException(e, mwrapper)); + } catch (Exception e) { /// Just all around bad + logInvocationError(e, mwrapper, newArgs); + } + } + /// and handle all errors + if (!success && errs != null && !errs.isEmpty()) { + HashSet usages = new HashSet(); + for (CommandException e : errs) { + usages.add(ChatColor.GOLD + e.mw.usage + " &c:" + e.err.getMessage()); + } + for (String msg : usages) { + sendMessage(sender, msg); + } + } + return true; + } + + protected Object invoke(MethodWrapper mwrapper, Arguments args) + throws InvocationTargetException, IllegalAccessException { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + + private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments newArgs) { + System.err.println("[" + plugin.getName() + " Error] " + mwrapper.method + " : " + mwrapper.obj + " : " + newArgs); + if (newArgs != null && newArgs.args != null) { + for (Object o : newArgs.args) { + System.err.println("[Error] object=" + o); + } + } + System.err.println("[Error] Cause=" + e.getCause()); + if (e.getCause() != null) { + e.getCause().printStackTrace(); + log.log(Level.SEVERE, null, e.getCause()); + } + System.err.println("[Error] Trace Continued "); + log.log(Level.SEVERE, null, e); + } + + public static final String ONLY_INGAME = ChatColor.RED + "You need to be in game to use this command"; + + @SuppressWarnings("ConstantConditions") + protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSender sender, + Command command, String label, String[] args, + boolean hasCmd, boolean hasSubCmd) throws IllegalArgumentException { + if (DEBUG) { + log.info(" method=" + mwrapper.method.getName() + " verifyArgs " + cmd + " sender=" + sender + + ", label=" + label + " args=" + Arrays.toString(args)); + for (String arg : args) { + log.info(" -- arg=" + arg); + } + for (Class t : mwrapper.method.getParameterTypes()) { + log.info(" -- type=" + t); + } + } + final int paramLength = mwrapper.method.getParameterTypes().length; + + /// Check our permissions + if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm()) && !(cmd.admin() && hasAdminPerms(sender))) { + throw new IllegalArgumentException("You don't have permission to use this command"); + } + + /// Verify min number of arguments + if (args.length < cmd.min()) { + throw new IllegalArgumentException("You need at least " + cmd.min() + " arguments"); + } + /// Verfiy max number of arguments + if (args.length > cmd.max()) { + throw new IllegalArgumentException("You need less than " + cmd.max() + " arguments"); + } + /// Verfiy max number of arguments + if (cmd.exact() != -1 && args.length != cmd.exact()) { + throw new IllegalArgumentException("You need exactly " + cmd.exact() + " arguments"); + } + final boolean isPlayer = sender instanceof Player; + final boolean isOp = (isPlayer && sender.isOp()) || sender == null || sender instanceof ConsoleCommandSender; + + if (cmd.op() && !isOp) { + throw new IllegalArgumentException("You need to be op to use this command"); + } + + if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) { + throw new IllegalArgumentException("You need to be an Admin to use this command"); + } + + Class types[] = mwrapper.method.getParameterTypes(); + + /// In game check + if (types[0] == Player.class && !isPlayer) { + throw new IllegalArgumentException(ONLY_INGAME); + } + int strIndex = 0; + int objIndex = 1; + + Arguments newArgs = new Arguments(); /// Our return value + Object[] objs = new Object[paramLength]; /// Our new array of castable arguments + + newArgs.args = objs; /// Set our return object with the new castable arguments + objs[0] = verifySender(sender, types[0]); + AtomicInteger numUsedStrings = new AtomicInteger(0); + for (int i = 1; i < types.length; i++) { + Class clazz = types[i]; + try { + if (CommandSender.class == clazz) { + objs[objIndex] = sender; + } else if (String[].class == clazz) { + objs[objIndex] = Arrays.copyOfRange(args, strIndex, args.length); + } else if (Object[].class == clazz) { + objs[objIndex] = args; + } else { + objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); + if (objs[objIndex] == null) { + throw new IllegalArgumentException("Argument " + args[strIndex] + " can not be null"); + } + } + if (DEBUG) { + log.info(" " + objIndex + " : " + strIndex + " " + + (args.length > strIndex ? args[strIndex] : null) + " <-> " + objs[objIndex] + " !!! Cs = " + + clazz.getCanonicalName()); + } + if (numUsedStrings.get() > 0) { + strIndex += numUsedStrings.get(); + } + } catch (ArrayIndexOutOfBoundsException e) { + throw new IllegalArgumentException("You didnt supply enough arguments for this method"); + } + objIndex++; + if (i == commandIndex) { + if (hasCmd) { + strIndex++; + } + if (hasSubCmd) { + strIndex++; + } + } + } + + /// Verify alphanumeric + if (cmd.alphanum().length > 0) { + for (int index : cmd.alphanum()) { + if (index >= args.length) { + throw new IllegalArgumentException("String Index out of range. "); + } + if (!args[index].matches("[a-zA-Z0-9_]*")) { + throw new IllegalArgumentException("argument '" + args[index] + "' can only be alphanumeric with underscores"); + } + } + } + return newArgs; /// Success + } + + protected Object verifySender(CommandSender sender, Class clazz) { + if (!clazz.isAssignableFrom(sender.getClass())) { + throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName()); + } + return sender; + } + + @SuppressWarnings("UnusedParameters") + protected Object verifyArg(CommandSender sender, Class clazz, Command command, + String[] args, int curIndex, AtomicInteger numUsedStrings) { + numUsedStrings.set(0); + if (Command.class == clazz) { + return command; + } + String string = args[curIndex]; + if (string == null) { + throw new ArrayIndexOutOfBoundsException(); + } + numUsedStrings.set(1); + if (Player.class == clazz) { + return verifyPlayer(string); + } else if (OfflinePlayer.class == clazz) { + return verifyOfflinePlayer(string); + } else if (String.class == clazz) { + return string; + } else if (Location.class == clazz) { + return verifyLocation(string); + } else if (Integer.class == clazz || int.class == clazz) { + return verifyInteger(string); + } else if (Boolean.class == clazz || boolean.class == clazz) { + return Boolean.parseBoolean(string); + } else if (Object.class == clazz) { + return string; + } else if (Float.class == clazz || float.class == clazz) { + return verifyFloat(string); + } else if (Double.class == clazz || double.class == clazz) { + return verifyDouble(string); + } else if (GameMode.class == clazz) { + return verifyGameMode(string); + } else if (ItemStack.class == clazz) { + return verifyItemStack(args, curIndex, numUsedStrings); + } else if (Material.class == clazz) { + return verifyMaterial(args, curIndex, numUsedStrings); + } + return null; + } + + private Material verifyMaterial(String[] args, int curIndex, AtomicInteger numUsedStrings) { + Material mat = InventoryUtil.getMat(args[curIndex]); + if (mat == null) { + throw new IllegalArgumentException("Error parsing block " + args[curIndex]); + } + numUsedStrings.set(1); + return mat; + } + + private ItemStack verifyItemStack(String[] args, int curIndex, AtomicInteger numUsedStrings) { + ItemStack is = InventoryUtil.getItemStack(args[curIndex]); + if (is == null) { + throw new IllegalArgumentException("Error parsing item " + args[curIndex]); + } + numUsedStrings.set(1); + return is; + } + + private Location verifyLocation(String string) { + String split[] = string.split(","); + String w = split[0]; + float x = Float.valueOf(split[1]); + float y = Float.valueOf(split[2]); + float z = Float.valueOf(split[3]); + float yaw = 0, pitch = 0; + if (split.length > 4) { + yaw = Float.valueOf(split[4]); + } + if (split.length > 5) { + pitch = Float.valueOf(split[5]); + } + World world = null; + if (w != null) { + world = Bukkit.getWorld(w); + } + if (world == null) { + throw new IllegalArgumentException("Error parsing location, World '" + string + "' does not exist"); + } + return new Location(world, x, y, z, yaw, pitch); + } + + private GameMode verifyGameMode(String string) { + GameMode gm = null; + try { + gm = GameMode.valueOf(string); + } catch (Exception e) {/* ignore */ + + } + if (gm == null) { + try { + gm = GameMode.getByValue(Integer.valueOf(string)); + } catch (Exception e) {/* do nothing */ + + } + if (gm == null) { + throw new IllegalArgumentException("&cGamemode " + string + " not found"); + } + } + return gm; + } + + private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { + OfflinePlayer p = findOfflinePlayer(name); + if (p == null) { + throw new IllegalArgumentException("Player " + name + " can not be found"); + } + return p; + } + + private Player verifyPlayer(String name) throws IllegalArgumentException { + Player p = findPlayer(name); + if (p == null || !p.isOnline()) { + throw new IllegalArgumentException(name + " is not online "); + } + return p; + } + + private Integer verifyInteger(Object object) throws IllegalArgumentException { + try { + return Integer.parseInt(object.toString()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ChatColor.RED + (String) object + " is not a valid integer."); + } + } + + private Float verifyFloat(Object object) throws IllegalArgumentException { + try { + return Float.parseFloat(object.toString()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ChatColor.RED + (String) object + " is not a valid float."); + } + } + + private Double verifyDouble(Object object) throws IllegalArgumentException { + try { + return Double.parseDouble(object.toString()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ChatColor.RED + (String) object + " is not a valid double."); + } + } + + protected boolean hasAdminPerms(CommandSender sender) { + return sender.isOp(); + } + + static final int LINES_PER_PAGE = 8; + + @SuppressWarnings("UnnecessaryContinue") + public void help(CommandSender sender, Command command, String[] args) { + Integer page = 1; + + if (args != null && args.length > 1) { + try { + page = Integer.valueOf(args[1]); + } catch (Exception e) { + sendMessage(sender, ChatColor.RED + " " + args[1] + " is not a number, showing help for page 1."); + } + } + + List available = new ArrayList(); + List unavailable = new ArrayList(); + List onlyop = new ArrayList(); + Set dups = new HashSet(); + String theCommand = command.getName(); + if (useAlias != -1 && useAlias < command.getAliases().size()) { + theCommand = command.getAliases().get(useAlias); + } + for (MethodWrapper mw : usage) { + if (!dups.add(mw.method)) { + continue; + } + MCCommand cmd = mw.getCommand(); + final String use = "&6/" + theCommand + " " + mw.usage; + if (cmd.op() && !sender.isOp()) { + onlyop.add(use); + } else if (cmd.admin() && !hasAdminPerms(sender)) { + continue; + } else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) { + unavailable.add(use); + } else { + available.add(use); + } + } + int npages = available.size() + unavailable.size(); + if (sender.isOp()) { + npages += onlyop.size(); + } + npages = (int) Math.ceil((float) npages / LINES_PER_PAGE); + if (page > npages || page <= 0) { + if (npages <= 0) { + sendMessage(sender, "&4There are no methods for this command"); + } else { + sendMessage(sender, "&4That page doesnt exist, try 1-" + npages); + } + return; + } + if (command != null && command.getAliases() != null && !command.getAliases().isEmpty()) { + String aliases = StringUtils.join(command.getAliases(), ", "); + sendMessage(sender, "&eShowing page &6" + page + "/" + npages + "&6 : /" + command.getName() + " help "); + sendMessage(sender, "&e command &6" + command.getName() + "&e has aliases: &6" + aliases); + } else { + sendMessage(sender, "&eShowing page &6" + page + "/" + npages + "&6 : /cmd help "); + } + int i = 0; + for (String use : available) { + i++; + if (i < (page - 1) * LINES_PER_PAGE || i >= page * LINES_PER_PAGE) { + continue; + } + sendMessage(sender, use); + } + for (String use : unavailable) { + i++; + if (i < (page - 1) * LINES_PER_PAGE || i >= page * LINES_PER_PAGE) { + continue; + } + sendMessage(sender, ChatColor.RED + "[Insufficient Perms] " + use); + } + if (sender.isOp()) { + for (String use : onlyop) { + i++; + if (i < (page - 1) * LINES_PER_PAGE || i >= page * LINES_PER_PAGE) { + continue; + } + sendMessage(sender, ChatColor.AQUA + "[OP only] &6" + use); + } + } + } + + public boolean sendMessage(CommandSender p, String message) { + if (message == null || message.isEmpty()) { + return true; + } + if (message.contains("\n")) { + return sendMultilineMessage(p, message); + } + if (p instanceof Player) { + if (((Player) p).isOnline()) { + p.sendMessage(colorChat(message)); + } + } else { + p.sendMessage(colorChat(message)); + } + return true; + } + + public boolean sendMultilineMessage(CommandSender p, String message) { + if (message == null || message.isEmpty()) { + return true; + } + String[] msgs = message.split("\n"); + for (String msg : msgs) { + if (p instanceof Player) { + if (((Player) p).isOnline()) { + p.sendMessage(colorChat(msg)); + } + } else { + p.sendMessage(colorChat(msg)); + } + } + return true; + } + + public static String colorChat(String msg) { + return msg.replace('&', (char) 167); + } + + public static Player findPlayer(String name) { + if (name == null) { + return null; + } + Player foundPlayer = Bukkit.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer; + } + foundPlayer = VirtualPlayers.getPlayer(name); + if (foundPlayer != null) { + return foundPlayer; + } + Player[] online = VirtualPlayers.getOnlinePlayers(); + + for (Player player : online) { + String playerName = player.getName(); + + if (playerName.equalsIgnoreCase(name)) { + foundPlayer = player; + break; + } + if (playerName.toLowerCase().indexOf(name.toLowerCase(), 0) != -1) { + if (foundPlayer != null) { + return null; + } + + foundPlayer = player; + } + } + + return foundPlayer; + } + + public static OfflinePlayer findOfflinePlayer(String name) { + OfflinePlayer p = findPlayer(name); + if (p != null) { + return p; + } else { + /// Iterate over the worlds to see if a player.dat file exists + for (World w : Bukkit.getWorlds()) { + File f = new File(w.getName() + "/players/" + name + ".dat"); + if (f.exists()) { + return Bukkit.getOfflinePlayer(name); + } + } + return null; + } + } + + protected void useAliasIndex(int index) { + useAlias = index; + } +} diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java new file mode 100644 index 0000000..f5cd1d3 --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java @@ -0,0 +1,449 @@ +package mc.alk.virtualplayers.executors; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import mc.alk.virtualplayers.VirtualPlayers; +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.battlelib.DamageUtil; +import mc.alk.virtualplayers.util.InventoryUtil; +import mc.alk.virtualplayers.util.Util; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +/** + * @author alkarin + */ +public class PlayerExecutor extends VPBaseExecutor { + + public PlayerExecutor() { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); + super.useAlias = 0; + } + + public PlayerExecutor(Plugin p) { + super(p, 1); + super.useAlias = 0; + } + + @MCCommand(op = true) + public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { + String command = StringUtils.join(args, " "); + sendMessage(sender, "&6 " + vp.getName() + "&2 executing '&6" + command + "&2'"); + PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(vp, "/" + command); + Bukkit.getPluginManager().callEvent(pcpe); + if (pcpe.isCancelled()) { + return sendMessage(sender, "&6 " + vp.getName() + "&c command cancelled : &6" + command); + } + Bukkit.getServer().dispatchCommand(vp, command); + return true; + } + + @MCCommand(cmds = {"showScoreboard"}, op = true) + public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { + Scoreboard sc = vp.getScoreboard(); + if (sc == null) { + return sendMessage(sender, "&4Scoreboard for " + vp.getName() + " is null"); + } + sendMessage(sender, "&4Scoreboard &f" + sc.hashCode()); + sendMessage(sender, "&e -- Teams -- "); + Collection ops = sc.getPlayers(); + for (Team t : sc.getTeams()) { + sendMessage(sender, t.getName() + " - " + t.getDisplayName()); + } + for (Objective o : sc.getObjectives()) { + sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); + for (OfflinePlayer op : ops) { + Score score = o.getScore(op); + if (score == null) { + continue; + } + sendMessage(sender, op.getName() + " : " + score.getScore()); + } + } + return true; + } + + @MCCommand(cmds = {"status"}, op = true) + public boolean constructStatusMessages(CommandSender sender, VirtualPlayer vp) { + return sendMessage(sender, "&4" + vp); + } + + @MCCommand(cmds = {"op"}, op = true) + public boolean opPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, true); + } + + @MCCommand(cmds = {"deop"}, op = true) + public boolean deopPlayer(CommandSender sender, VirtualPlayer vp) { + return opPlayer(sender, vp, false); + } + + private boolean opPlayer(CommandSender sender, VirtualPlayer vp, boolean op) { + vp.setOp(op); + String opped = op ? "opped" : "deopped"; + return sendMessage(sender, "&6" + vp.getName() + "&2 " + opped + "!"); + } + + @MCCommand(cmds = {"click", "interact"}, op = true, usage = "/dc click ") + public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, Location l) { + boolean left = lr.equalsIgnoreCase("left"); + Action action; + if (l.getBlock().getType() == Material.AIR) { + action = left ? Action.LEFT_CLICK_AIR : Action.RIGHT_CLICK_AIR; + } else { + action = left ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; + } + ItemStack inhand = vp.getItemInHand(); + // Block b = w.getBlockAt(l); + Block b = l.getWorld().getBlockAt(l); + // PlayerInteractEvent(final Player who, final Action action, final + // ItemStack item, + // final Block clickedBlock, final BlockFace clickedFace) { + PlayerInteractEvent ede = new PlayerInteractEvent(vp, action, inhand, b, BlockFace.EAST); + Bukkit.getPluginManager().callEvent(ede); + sendMessage(sender, "&6" + vp.getName() + "&e " + action.name() + " &4" + + b.getType() + "&2 with a &a" + inhand.getType().name()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + + return true; + } + + @MCCommand(cmds = {"sneak"}, op = true) + public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { + vp.setSneaking(sneak); + if (sneak) { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &8sneaking"); + } else { + return sendMessage(sender, "&6" + vp.getName() + "&e is now &fnot sneaking"); + } + } + + @MCCommand(cmds = {"examine"}, op = true) + public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { + Block b = l.getWorld().getBlockAt(l); + + sendMessage(sender, "&6" + vp.getName() + "&e examining location " + l + " &4" + b.getType()); + if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST) { + Sign s = (Sign) b.getState(); + String[] lines = s.getLines(); + for (int i = 1; i <= lines.length; i++) { + sendMessage(sender, "&6Line: " + i + "=&f'" + lines[i - 1] + "&f'"); + } + } + return true; + } + + @MCCommand(cmds = {"tp", "teleport"}, op = true) + public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { + PlayerTeleportEvent pte = new PlayerTeleportEvent(vp, vp.getLocation(), + l, TeleportCause.COMMAND); + Bukkit.getPluginManager().callEvent(pte); + if (pte.isCancelled()) { + sendMessage(sender, "&cTeleport of " + vp.getDisplayName() + " was cancelled by some plugin"); + } else { + vp.teleport(l); + } + return true; + } + + @MCCommand(cmds = {"gm", "gamemode"}, op = true) + public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) { + vp.setGameMode(gm); + sendMessage(sender, "&6" + vp.getName() + "&2 gamemode &6" + gm); + return true; + } + + @MCCommand(cmds = {"chat"}, op = true) + public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { + final String msg = Util.colorChat(StringUtils.join(args, " ")); + final Set players = new HashSet( + Arrays.asList(VirtualPlayers.getOnlinePlayers())); + + System.out.println("sender = " + sender.getName()); + System.out.println("vp = " + vp.getName()); + System.out.println("args = " + args.toString()); + System.out.println("players = " + players.toString()); + Runnable r = new Runnable() { + @Override + public void run() { + AsyncPlayerChatEvent apce = new AsyncPlayerChatEvent(true, vp, msg, players); + Bukkit.getPluginManager().callEvent(apce); + } + }; + new Thread(r).start(); + + String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; + sendMessage(sender, message); + return true; + } + + @MCCommand(cmds = {"respawn"}, op = true) + public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { + World w = vp.getWorld(); + vp.respawn(w.getSpawnLocation()); + return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); + } + + @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) + public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { + + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + replaced.setType(mat); + BlockPlaceEvent bpe = new BlockPlaceEvent(replaced, + replaced.getState(), replaced.getRelative(BlockFace.NORTH), + vp.getItemInHand(), vp, true); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + replaced.setType(old); + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + + vp.getName()); + } else { + return sendMessage(sender, + "&6" + vp.getName() + "&e placed " + mat + " on " + + old + " at &4" + Util.getLocString(loc) + ); + } + } + + @MCCommand(cmds = {"bbe", "BlockBreakEvent"}, op = true) + public boolean blockBreakEvent(CommandSender sender, VirtualPlayer vp, Location loc) { + Block replaced = loc.getBlock(); + Material old = replaced.getType(); + BlockBreakEvent bpe = new BlockBreakEvent(replaced, vp); + Bukkit.getPluginManager().callEvent(bpe); + if (bpe.isCancelled()) { + return sendMessage(sender, "&cBlockPlaceEvent was cancelled for &6" + vp.getName()); + } else { + replaced.setType(Material.AIR); + return sendMessage(sender, "&6" + vp.getName() + "&e broke the " + + old + " at &4" + Util.getLocString(loc)); + } + } + + @MCCommand(cmds = {"giveInv"}, op = true) + public boolean giveInv(CommandSender sender, VirtualPlayer vp, ItemStack is) { + int amount = is.getAmount() > 0 ? is.getAmount() : 1; + InventoryUtil.addItemToInventory(vp.getInventory(), is, amount); + return sendMessage(sender, "&2Added &6" + is + "&2 to inventory"); + } + + @MCCommand(cmds = {"giveHelm"}, op = true) + public boolean giveHelm(CommandSender sender, VirtualPlayer vp, ItemStack is) { + vp.getInventory().setHelmet(is); + return sendMessage(sender, "&2Added &6" + is + "&2 as the helm"); + } + + @MCCommand(cmds = {"inv", "printInv"}, op = true) + public boolean printInv(CommandSender sender, VirtualPlayer vp) { + PlayerInventory inv = vp.getInventory(); + if (inv != null) { + sendMessage(sender, "&bHelm:&6" + InventoryUtil.getItemString(inv.getHelmet())); + sendMessage(sender, "&bChest:&6" + InventoryUtil.getItemString(inv.getChestplate())); + sendMessage(sender, "&bLegs:&6" + InventoryUtil.getItemString(inv.getLeggings())); + sendMessage(sender, "&bBoot:&6" + InventoryUtil.getItemString(inv.getBoots())); + sendMessage(sender, "&4InHand:&6" + InventoryUtil.getItemString(inv.getItemInHand())); + ItemStack[] contents = inv.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack is = contents[i]; + if (is != null && is.getType() != Material.AIR) { + sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } + } + } + return true; + } + + @MCCommand(cmds = {"health"}, op = true) + public boolean health(CommandSender sender, VirtualPlayer damagee, double h, String... args) { + boolean force = (args.length > 0 && args[0].equalsIgnoreCase("force")); + EntityDamageEvent event = new EntityDamageEvent( + damagee, + DamageCause.ENTITY_ATTACK, + damagee.getHealth() - h); + /* + EntityDamageEvent ede = PlayerExecutor.callEntityDamageEvent( + null, + damagee.getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, // damagee.getHealth() - h, + null, + null); */ + if (!event.isCancelled() || force) { + damagee.setLastDamageCause(event); + damagee.setHealth(damagee.getHealth() - event.getDamage()); + return sendMessage(sender, damagee, "&6" + damagee.getName() + "&2, life=&4" + damagee.getHealth()); + + } else { + return sendMessage(sender, damagee, "&cHealth set was cancelled for &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"hit"}, op = true) + public boolean damageEvent(CommandSender sender, Player damager, Player damagee, int damage) { + if (damagee.getHealth() <= 0) { + return sendMessage(sender, "&6" + damagee.getName() + "&c is already dead!"); + } + EntityDamageEvent ede = new EntityDamageByEntityEvent( + damager, damagee, + EntityDamageEvent.DamageCause.ENTITY_ATTACK, + damage); + /* + EntityDamageEvent ede = CraftEventFactory.callEntityDamageEvent( + ((Entity) ((CraftPlayer) damager).getHandle()), + ((CraftPlayer) damagee).getHandle(), + EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); + */ + if (!ede.isCancelled()) { + damagee.setLastDamageCause(ede); + if (damagee instanceof VirtualPlayer) { + ((VirtualPlayer) damagee).setHealth(damagee.getHealth() - ede.getDamage()); + } else { + DamageUtil.damageEntity(damagee, ede.getDamage()); + } + return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" + + damagee.getHealth()); + } else { + return sendMessage(sender, "&cDamage Event was cancelled for &6" + + damager.getName() + "&c hitting &6" + damagee.getName()); + } + } + + @MCCommand(cmds = {"kill"}, op = true) + public boolean playerKill(VirtualPlayer vp) { + Server cserver = Bukkit.getServer(); + List is = new LinkedList(); + vp.setHealth(0.0); + vp.damage(100000.0); + PlayerDeathEvent ede = new PlayerDeathEvent(vp, is, 0, ""); + cserver.getPluginManager().callEvent(ede); + return true; + } + + @MCCommand(cmds = {"connect"}, op = true) + public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, true); + } + + @MCCommand(cmds = {"dc", "disconnect"}, op = true) + public boolean playerDisconnect(CommandSender sender, final VirtualPlayer vp) { + return playerConnection(sender, vp, false); + } + + private boolean playerConnection(CommandSender sender, final VirtualPlayer vp, boolean connecting) { + vp.setOnline(connecting); + if (connecting) { + // PreLogin Event has to be called from a thread other than the main thread. + final String playerName = vp.getName(); + Runnable r = new Runnable() { + @Override + public void run() { + try { + AsyncPlayerPreLoginEvent playerPreLoginEvent = new AsyncPlayerPreLoginEvent( + playerName, InetAddress.getLocalHost()); + Bukkit.getPluginManager().callEvent(playerPreLoginEvent); + } catch (UnknownHostException ex) {/* say nothing */ + + } + /// After we are done Asynchronously handling the preloginevent + /// Sync back up and call the Login and Join events + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, new Runnable() { + @Override + public void run() { + // Then the Login Event. + Server cserver = Bukkit.getServer(); + try { + PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( + vp, "localhost", InetAddress + .getLocalHost()); + cserver.getPluginManager().callEvent( + playerLoginEvent); + } catch (UnknownHostException ex) {/* do nothing */ + + } + + // Finally, the player join event. + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent( + vp, "\u00A7e" + vp.getName() + + " joined the game."); + cserver.getPluginManager().callEvent(playerJoinEvent); + } + }); + + } + }; + new Thread(r).start(); + } else { /// Disconnecting + Server cserver = Bukkit.getServer(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(vp, "\u00A7e" + + vp.getName() + " left the game."); + cserver.getPluginManager().callEvent(playerQuitEvent); + } + String msg = "&6" + vp.getName() + "&2 " + + (connecting ? "connecting. Details:&6" + vp : "&cdisconnecting"); + sendMessage(sender, vp, msg); + return true; + } + + @MCCommand(cmds = {"movetome"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } +} diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java new file mode 100644 index 0000000..e707497 --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java @@ -0,0 +1,123 @@ +package mc.alk.virtualplayers.executors; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import mc.alk.virtualplayers.VirtualPlayers; +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPBaseExecutor extends CustomCommandExecutor { + + static boolean showTransitionsToPlayer = true; + static boolean showEventMessages = true; + + protected VPBaseExecutor(Plugin plugin) { + super(plugin); + } + + public VPBaseExecutor(Plugin plugin, int i) { + super(plugin, i); + } + + @Override + protected String getUsageString(Class clazz) { + if (VirtualPlayer.class == clazz) { + return ""; + } + return super.getUsageString(clazz); + } + + @Override + protected Object verifyArg(CommandSender sender, Class clazz, Command command, String[] args, int curIndex, AtomicInteger numUsedStrings) { + if (VirtualPlayer.class == clazz) { + return verifyVirtualPlayer(args[curIndex], numUsedStrings); + } + return super.verifyArg(sender, clazz, command, args, curIndex, numUsedStrings); + } + + private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { + Player p = VirtualPlayers.getPlayerExact(name); + if (p == null) { + if (name.contains("-")) { /// return range + return getVps(name); + } + p = VirtualPlayers.getOrCreate(name); + } + if (!(p instanceof VirtualPlayer)) { + throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); + } + numUsedStrings.set(1); + return p; + } + + @SuppressWarnings("unchecked") + @Override + protected Object invoke(CustomCommandExecutor.MethodWrapper mwrapper, CustomCommandExecutor.Arguments args) + throws InvocationTargetException, IllegalAccessException { + if (args.args.length > 1 && args.args[1] instanceof List) { + Object ret = null; + Object[] o = Arrays.copyOfRange((Object[]) args.args[2], 1, ((Object[]) args.args[2]).length); + args.args[2] = o; + List list = (List) args.args[1]; + for (Object vp : list) { + args.args[1] = vp; + ret = mwrapper.method.invoke(mwrapper.obj, args.args); + } + return ret; + } else { + return mwrapper.method.invoke(mwrapper.obj, args.args); + } + } + + @SuppressWarnings("SimplifiableIfStatement") + @Override + public boolean sendMessage(CommandSender sender, String string) { + if (string == null || !showEventMessages) { + return true; + } + return super.sendMessage(sender, string); + } + + protected boolean sendMessage(CommandSender sender, VirtualPlayer p, String string) { + if (string == null || !showEventMessages) { + return true; + } + if (showTransitionsToPlayer) { + Util.sendMessage(p, string); + } + return super.sendMessage(sender, string); + } + + private List getVps(String names) { + String name = names; + List players = new ArrayList(); + if (names.contains("-")) { + String[] split = names.split("-"); + name = split[0]; + Integer start = Integer.valueOf(split[1]); + Integer end = Integer.valueOf(split[2]); + for (int i = start; i <= end; i++) { + players.add(VirtualPlayers.getOrCreate(name + i)); + } + } else { + players.add(VirtualPlayers.getOrCreate(name)); + } + return players; + } + + public static void setEventMessages(boolean visibility) { + showEventMessages = visibility; + } +} diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java new file mode 100644 index 0000000..d3e65aa --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java @@ -0,0 +1,80 @@ +package mc.alk.virtualplayers.executors; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import mc.alk.virtualplayers.VirtualPlayers; +import mc.alk.virtualplayers.api.VirtualPlayer; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + +/** + * @author alkarin + */ +public class VPExecutor extends VPBaseExecutor { + + public VPExecutor() { + super(Bukkit.getPluginManager().getPlugin("VirtualPlayers")); + useAliasIndex(0); + } + + public VPExecutor(Plugin plugin) { + super(plugin); + useAliasIndex(0); + } + + @MCCommand(cmds = {"ap", "addPlayers"}, op = true) + public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception { + for (int i = 0; i < numPlayers; i++) { + final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayers.makeVirtualPlayer(); + sendMessage(sender, "Added Player " + p1.getName()); + } + return true; + } + + @MCCommand(cmds = {"removeAll"}, op = true) + public boolean removeAll(CommandSender sender) { + VirtualPlayers.deleteVirtualPlayers(); + return sendMessage(sender, "&2Removed all VirtualPlayers"); + } + + @MCCommand(cmds = {"listPlayers"}, op = true) + public void listVirtualPlayers(CommandSender sender) { + List players = VirtualPlayers.getPlayerList(); + sender.sendMessage("VirtualPlayers count=" + players.size()); + + Collections.sort(players, new Comparator() { + @Override + public int compare(VirtualPlayer o1, VirtualPlayer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + for (VirtualPlayer vp : players) { + sendMessage(sender, vp.getName() + " : " + vp); + } + } + + @MCCommand(cmds = {"showMessages"}, op = true) + public boolean showMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &eenabled"); + } + + @MCCommand(cmds = {"hideMessages"}, op = true) + public boolean hideMessages(CommandSender sender) { + return sendMessage(sender, "&2VirtualPlayer messages &cdisabled"); + } + + @MCCommand(cmds = {"setMessages"}, op = true) + public static void setPlayerMessages(boolean visibility) { + VirtualPlayers.setGlobalMessages(visibility); + } + + @MCCommand(cmds = {"setEventMessages"}, op = true) + public static void setEventMessages(boolean visibility) { + showEventMessages = visibility; + } + +} diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java new file mode 100644 index 0000000..fe317db --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java @@ -0,0 +1,55 @@ +package mc.alk.virtualplayers.listeners; + +import mc.alk.virtualplayers.VirtualPlayers; +import mc.alk.virtualplayers.api.VirtualPlayer; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +/** + * Handles all Events related to VirtualPlayer instances. + * + * @author alkarin + */ +public class VirtualPlayerListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawnBegin(PlayerRespawnEvent event) { + Player p = event.getPlayer(); + if (VirtualPlayers.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { + p.setHealth(20); + p.setLastDamageCause(null); + ((VirtualPlayer) p).setOnline(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerRespawnEnd(PlayerRespawnEvent event) { + Player p = event.getPlayer(); + if (VirtualPlayers.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) { + if (!VirtualPlayers.getVps().containsKey(event.getPlayer().getUniqueId())) { + return; + } + // For some reason we do need to actually send the messages from + // virtualplayers ourself + final String message = String.format( + event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage() + ); + for (Player p : event.getRecipients()) { + p.sendMessage(message); + } + } + +} From 9f92b1658cea2dece231fab11d98ed74e13579c0 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 25 Jun 2015 02:06:42 -0500 Subject: [PATCH 48/74] VirtualPlayers v1.6.6 This is a temporary, intermediate version just before the release of v2.0 which will contain backwards-incompatible changes. v1.6.6 adds the VirtualPlayer interface while hopefully maintaing backwards compatibility. This commit also contains a method generateErrorOnPurose() which is a self reminder, in the form of a compile-time error that cannot be ignored: The reminder is to fix VirtualPlayers.getOnlinePlayers() First, the implementation details must change. Right now, the problem is that it uses Bukkit.getOnlinePlayers() which returns a Collection: This cannot be used on older versions of Minecraft. So it breaks backwards compatibility. Planned for v1.6.7 Next, the return value should probably changed from an array of Player[] to a Collection. Planned for v2.0 --- modules/VirtualPlayers/pom.xml | 50 +-- .../mc/alk/virtualPlayer/VirtualPlayers.java | 28 +- .../mc/alk/virtualplayers/VirtualPlayers.java | 303 ++++++++---------- pom.xml | 2 +- 4 files changed, 164 insertions(+), 219 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index be75066..9f4a99d 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.5 + 1.6.6 jar VirtualPlayers @@ -25,18 +25,12 @@ org.bukkit bukkit - 1.7.2-R0.3 + 1.7.10-R0.1-SNAPSHOT provided - - mc.euro - Version - 1.1.1 - compile - mc.alk - vp-util + vp-api parent true @@ -171,12 +165,12 @@ ./target ./src/main/java - - org.apache.maven.wagon - wagon-ssh - 2.6 - - + + org.apache.maven.wagon + wagon-ssh + 2.6 + + . @@ -229,6 +223,7 @@ package + shade @@ -236,26 +231,9 @@ false - mc.alk:* - mc.euro:Version + mc.alk:vp-* - - - mc.euro.version - mc.alk.virtualplayers.version - - - - - *:* - - META-INF/*.* - META-INF/**/*.* - META-INF/**/* - - - @@ -278,10 +256,4 @@ - - - rainbowcraft-repo - scp://23.29.127.102/var/www/maven/repository - - diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java index ac99e00..98e57cf 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java @@ -3,6 +3,9 @@ import java.util.List; import java.util.Map; import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; + import org.bukkit.entity.Player; /** @@ -18,6 +21,7 @@ * versioned package structure. * * @author Nikolai + * @deprecated scheduled for removal in v2.0 */ public class VirtualPlayers { @@ -67,16 +71,34 @@ public static synchronized Player makeVirtualPlayer(String name) throws Exceptio { return mc.alk.virtualplayers.VirtualPlayers.makeVirtualPlayer(name); } - + /** * Object parameter needs to be changed to a VirtualPlayer interface. * @param vp Pass in an instance of VirtualPlayer. * @return */ @Deprecated - public static Player deleteVirtualPlayer(Object vp) + public static void deleteVirtualPlayer(Object obj) + { + if (obj instanceof VirtualPlayer) { + VirtualPlayer vp = (VirtualPlayer) obj; + mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(vp); + } else if (obj instanceof String) { + String name = (String) obj; + mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(name); + } + } + + @Deprecated + public static void deleteVirtualPlayer(String name) + { + mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(name); + } + + @Deprecated + public static void deleteVirtualPlayer(VirtualPlayer vp) { - return mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(vp); + mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(vp); } @Deprecated diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index b7ffd6b..6d43968 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -1,30 +1,35 @@ package mc.alk.virtualplayers; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; -import mc.euro.version.Version; -import mc.euro.version.VersionFactory; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.executors.PlayerExecutor; +import mc.alk.virtualplayers.executors.VPBaseExecutor; +import mc.alk.virtualplayers.executors.VPExecutor; +import mc.alk.virtualplayers.listeners.VirtualPlayerListener; +import mc.alk.virtualplayers.version.Version; +import mc.alk.virtualplayers.version.VersionFactory; + +import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.Server; -import org.bukkit.command.CommandExecutor; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; - public class VirtualPlayers extends JavaPlugin { - + public static final String MAX = "1.8.7-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; public static final Version server = VersionFactory.getServerVersion(); public static final String NMS = VersionFactory.getNmsVersion().toString(); + static final VirtualPlayerFactory factory = VirtualPlayerFactory.newInstance(); + @Override public void onEnable() { if (!server.isSupported(MAX) || !server.isCompatible(MIN)) { @@ -34,217 +39,163 @@ public void onEnable() { Bukkit.getServer().getPluginManager().disablePlugin(this); return; } - // Bukkit.getPluginManager().registerEvents(this, this); - // getCommand("vdc").setExecutor(new PlayerExecutor(this)); - // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); - registerCommands(); - registerListeners(); + Bukkit.getPluginManager().registerEvents(new VirtualPlayerListener(), this); + getCommand("vdc").setExecutor(new PlayerExecutor(this)); + getCommand("virtualplayers").setExecutor(new VPExecutor(this)); } @Override - public void onDisable() - { - // mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer.deleteVirtualPlayers(); - try { - getVirtualPlayerClass().getDeclaredMethod("deleteVirtualPlayers", new Class[]{}).invoke(null); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } + public void onDisable() { + deleteVirtualPlayers(); } - public void setPlayerMessages(boolean show){ - // mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer.setGlobalMessages(show); - try { - getVirtualPlayerClass().getDeclaredMethod("setGlobalMessages", boolean.class).invoke(null, show); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + public void setPlayerMessages(boolean visibility) { + for (VirtualPlayer vp : getVirtualPlayers()) { + vp.setShowMessages(visibility); } } - public void setEventMessages(boolean show){ - // mc.alk.virtualplayers.nms.{version}.VPBaseExecutor.setShowEventMessages(show); - try { - getNmsClass("VPBaseExecutor").getDeclaredMethod("setShowEventMessages", boolean.class).invoke(null, show); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } + public void setEventMessages(boolean visibility) { + VPBaseExecutor.setEventMessages(visibility); } - - public static Class getVirtualPlayerClass() throws Exception { - return getNmsClass("CraftVirtualPlayer"); + + public static Map getVps() { + return VirtualPlayerFactory.getVps(); } - public static Class getNmsClass(String clazz) throws Exception { - return Class.forName("mc.alk.virtualplayers.nms." + NMS + "." + clazz); + public static Map getNames() { + return VirtualPlayerFactory.getNames(); } - private void registerListeners() { - // mc.alk.virtualplayers.nms.{version}.PlayerListener - try { - getServer().getPluginManager().registerEvents( - (Listener) getNmsClass("PlayerListener").getConstructor().newInstance(), this); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + public static Player getPlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = getNames().get(pname); } + return vp; } - private void registerCommands() { - // getCommand("vdc").setExecutor(new PlayerExecutor(this)); - // getCommand("virtualplayers").setExecutor(new VPExecutor(this)); - try { - getCommand("vdc").setExecutor( - (CommandExecutor) getNmsClass("PlayerExecutor") - .getConstructor(new Class[]{Plugin.class}).newInstance(this)); - getCommand("virtualplayers").setExecutor( - (CommandExecutor) getNmsClass("VPExecutor") - .getConstructor(new Class[]{Plugin.class}).newInstance(this)); - } catch (Exception ex) { - Logger.getLogger(VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + public static Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) { + vp = getVps().get(id); } + return vp; } - /** - * Used by mc.alk.arena.util.ServerUtil. - * Implementation moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer: - */ - public static Player getPlayer(String pname) { - return (Player) invoke("getPlayer", pname); - } - - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static Player getPlayer(UUID id) { - return (Player) invoke("getPlayer", id); - } - - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static Player getPlayerExact(String pname) { - return (Player) invoke("getPlayerExact", pname); + public static Player getPlayerExact(String pname) { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) { + vp = getNames().get(pname); + } + return vp; } /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. + * Calls getNewPlayerList() : i.e. Makes a copy. + * + * @return A new list, or copy. */ - public static Player getOrMakePlayer(String pname) { - return (Player) invoke("getOrMakePlayer", pname); + public static List getPlayerList() { + return getNewPlayerList(); } - + /** - * Used by mc.alk.arena.util.ServerUtil. - * Implementation moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer:getOnlinePlayers(). + * @since v2.0 : This is getPlayerList() renamed to reflect that it's a + * copy. + * @return A new list, or copy. */ - public static Player[] getOnlinePlayers() { - return (Player[]) invoke("getOnlinePlayers"); + public static List getNewPlayerList() { + return VirtualPlayerFactory.getNewPlayerList(); } - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); + public static Collection getVirtualPlayers() { + return VirtualPlayerFactory.getVirtualPlayers(); } - + /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. + * This absolutely MUST be fixed:. + *
+     * Bukkit.getOnlinePlayers() won't work on older versions because of the return type.
+     * 
+ * + * @return */ - public static synchronized Player makeVirtualPlayer(String name) throws Exception { - return (Player) invoke("makeVirtualPlayer", name); + public static Player[] getOnlinePlayers() { + generateErrorOnPurpose(); // Self reminder that can't be ignored. + List players = new ArrayList(); + for (Player p : VirtualPlayerFactory.getVirtualPlayers()) { + if (p.isOnline()) { + players.add(p); + } + } + Player[] ps = players.toArray(new Player[players.size()]); + Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); + return (Player[]) ArrayUtils.addAll(ps, bps); } - - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static Player deleteVirtualPlayer(Object vp) { - Player player = null; - Method[] methods = null; - try { - methods = getVirtualPlayerClass().getDeclaredMethods(); - } catch (Exception ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + + public static Player getOrMakePlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = getNames().get(pname); } - for (Method m : methods) { - Class[] params = m.getParameterTypes(); - if (m.getName().equalsIgnoreCase("deleteVirtualPlayer")) { - try { - player = (Player) m.invoke(null, vp); - } catch (IllegalAccessException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (IllegalArgumentException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (InvocationTargetException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } + if (vp == null) { + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); } } - return player; + return vp; } - - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static void deleteVirtualPlayers() { - invoke("deleteVirtualPlayers"); + + public static VirtualPlayer getOrCreate(String name) { + Player vp = VirtualPlayerFactory.getNames().get(name); + if (vp == null) { + try { + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; } - - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static List getPlayerList() { - return (List) invoke("getPlayerList"); + + public static Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); } - - /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. - */ - public static Object getOrCreate(String name) { - return invoke("getOrCreate", name); + + public static synchronized Player makeVirtualPlayer(String name) throws Exception { + return factory.makeVirtualPlayer(name); } - + /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. + * @since v2.0 + * @param name */ - public static Map getVps() { - return (Map) invoke("getVps"); + public static void deleteVirtualPlayer(String name) { + VirtualPlayer vp = getNames().get(name); + deleteVirtualPlayer(vp); } - + /** - * Method moved to mc.alk.virtualplayers.nms.{version}.CraftVirtualPlayer. + * @since v2.0 : return value changed from Player to void. + * @param vp */ - public static Map getNames() { - return (Map) invoke("getNames"); + public static void deleteVirtualPlayer(VirtualPlayer vp) { + factory.deleteVirtualPlayer(vp); } - - private static Object invoke(String methodName, Object... params) { - Object object = null; - Method method; - try { - if (params == null) { - method = getVirtualPlayerClass().getDeclaredMethod(methodName); - } else { - Class[] classParams = new Class[params.length]; - for (int index = 0; index < params.length; index = index + 1) { - classParams[index] = params[index].getClass(); - } - method = getVirtualPlayerClass().getDeclaredMethod(methodName, classParams); - } - object = method.invoke(null, params); - } catch (NoSuchMethodException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (SecurityException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (IllegalAccessException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (IllegalArgumentException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (InvocationTargetException ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); - } catch (Exception ex) { - Logger.getLogger(mc.alk.virtualPlayer.VirtualPlayers.class.getName()).log(Level.SEVERE, null, ex); + + public static void deleteVirtualPlayers() { + for (VirtualPlayer vp : getNewPlayerList()) { + factory.deleteVirtualPlayer(vp); + } + } + + public static void setGlobalMessages(boolean visibility) { + for (VirtualPlayer vp : VirtualPlayerFactory.getVirtualPlayers()) { + vp.setShowMessages(visibility); } - return object; } } diff --git a/pom.xml b/pom.xml index 165c102..83984e1 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ UTF-8 - modules/util + modules/api modules/vpre modules/v1_4_5 modules/v1_4_6 From dbf239277b56bb5827ea9c25cea605765bc27e17 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:40:46 -0500 Subject: [PATCH 49/74] Trimmed extra spaces & empty lines --- modules/VirtualPlayers/src/main/java/plugin.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/VirtualPlayers/src/main/java/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml index 1e59524..c818c9b 100644 --- a/modules/VirtualPlayers/src/main/java/plugin.yml +++ b/modules/VirtualPlayers/src/main/java/plugin.yml @@ -14,6 +14,3 @@ commands: aliases: [dc] description: do command as a virtual player usage: /dc [arguments] - - - From d8e8392ae969252610b12e849926acf38adade38 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:42:37 -0500 Subject: [PATCH 50/74] Removed unused imports --- .../mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java index 9da4414..977cd83 100644 --- a/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java @@ -1,9 +1,6 @@ package mc.alk.virtualplayers.nms.v1_4_5; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; import mc.alk.virtualplayers.api.VirtualPlayer; import mc.alk.virtualplayers.util.Util; From 4c49745d89aea37bf8be93f3dd6e9fa367d8f544 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:44:33 -0500 Subject: [PATCH 51/74] Added BattleBukkitLib v2.3 - replaces mc.euro:Version dependency, because BattleBukkitLib includes it - adds BukkitInterface.getOnlinePlayers() --- modules/api/pom.xml | 23 +------------------ .../api/VirtualPlayerFactory.java | 2 +- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/modules/api/pom.xml b/modules/api/pom.xml index bdd3467..ea8a7e0 100644 --- a/modules/api/pom.xml +++ b/modules/api/pom.xml @@ -29,13 +29,7 @@ mc.alk BattleBukkitLib - 2.2.1 - compile - - - mc.euro - Version - 1.2 + 2.3 compile @@ -73,30 +67,15 @@ false - mc.euro:Version mc.alk:BattleBukkitLib - - mc.euro.version - mc.alk.virtualplayers.version - mc.alk.util mc.alk.virtualplayers.battlelib - - - *:* - - META-INF/*.* - META-INF/**/*.* - META-INF/**/* - - - diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java index a97f717..ab64f67 100644 --- a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java +++ b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.UUID; -import mc.euro.version.VersionFactory; +import mc.alk.util.version.VersionFactory; // BattleBukkitLib import org.bukkit.entity.Player; From ccb89fb363477d3884e670f8b516b48ae80bf130 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:49:29 -0500 Subject: [PATCH 52/74] Added modules/v1_2_5 --- modules/v1_2_5/pom.xml | 64 +++++ .../nms/v1_2_5/CraftVirtualPlayer.java | 263 ++++++++++++++++++ .../nms/v1_2_5/CraftVirtualPlayerFactory.java | 60 ++++ 3 files changed, 387 insertions(+) create mode 100644 modules/v1_2_5/pom.xml create mode 100644 modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayer.java create mode 100644 modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayerFactory.java diff --git a/modules/v1_2_5/pom.xml b/modules/v1_2_5/pom.xml new file mode 100644 index 0000000..05df6cf --- /dev/null +++ b/modules/v1_2_5/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_2_5 + parent + jar + + virtualplayers-v1_2_5 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.2.5-R5.0 + provided + + + org.bukkit + craftbukkit + 1.2.5-R5.0 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_2_5 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayer.java b/modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayer.java new file mode 100644 index 0000000..94cf004 --- /dev/null +++ b/modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_2_5; + +import java.util.Collection; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, ItemInWorldManager iiw, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + +} diff --git a/modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayerFactory.java b/modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..2d23d9e --- /dev/null +++ b/modules/v1_2_5/src/main/java/mc/alk/virtualplayers/nms/v1_2_5/CraftVirtualPlayerFactory.java @@ -0,0 +1,60 @@ +package mc.alk.virtualplayers.nms.v1_2_5; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer vp = new CraftVirtualPlayer(cserver, mcserver, world, name, iiw, location); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From e04973adddd1c9ec33a838880500bbe569de82ce Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:50:18 -0500 Subject: [PATCH 53/74] Added modules/v1_3_2 --- modules/v1_3_2/pom.xml | 64 +++++ .../nms/v1_3_2/CraftVirtualPlayer.java | 263 ++++++++++++++++++ .../nms/v1_3_2/CraftVirtualPlayerFactory.java | 60 ++++ 3 files changed, 387 insertions(+) create mode 100644 modules/v1_3_2/pom.xml create mode 100644 modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayer.java create mode 100644 modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayerFactory.java diff --git a/modules/v1_3_2/pom.xml b/modules/v1_3_2/pom.xml new file mode 100644 index 0000000..e2326fa --- /dev/null +++ b/modules/v1_3_2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_3_2 + parent + jar + + virtualplayers-v1_3_2 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.3.2-R3.0 + provided + + + org.bukkit + craftbukkit + 1.3.2-R3.0 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_3_2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayer.java b/modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayer.java new file mode 100644 index 0000000..6746b79 --- /dev/null +++ b/modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_3_2; + +import java.util.Collection; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, ItemInWorldManager iiw, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + +} diff --git a/modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayerFactory.java b/modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..f15595c --- /dev/null +++ b/modules/v1_3_2/src/main/java/mc/alk/virtualplayers/nms/v1_3_2/CraftVirtualPlayerFactory.java @@ -0,0 +1,60 @@ +package mc.alk.virtualplayers.nms.v1_3_2; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer vp = new CraftVirtualPlayer(cserver, mcserver, world, name, iiw, location); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 9cff6614a199e28ee63946ab07f4720abb7ef158 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:50:49 -0500 Subject: [PATCH 54/74] Added modules/v1_4_2 --- modules/v1_4_2/pom.xml | 64 +++++ .../nms/v1_4_2/CraftVirtualPlayer.java | 263 ++++++++++++++++++ .../nms/v1_4_2/CraftVirtualPlayerFactory.java | 60 ++++ 3 files changed, 387 insertions(+) create mode 100644 modules/v1_4_2/pom.xml create mode 100644 modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayer.java create mode 100644 modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayerFactory.java diff --git a/modules/v1_4_2/pom.xml b/modules/v1_4_2/pom.xml new file mode 100644 index 0000000..17ae731 --- /dev/null +++ b/modules/v1_4_2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_4_2 + parent + jar + + virtualplayers-v1_4_2 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.4.2-R0.2 + provided + + + org.bukkit + craftbukkit + 1.4.2-R0.2 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_4_2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayer.java b/modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayer.java new file mode 100644 index 0000000..856bf8d --- /dev/null +++ b/modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_4_2; + +import java.util.Collection; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + int health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location loc; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, + WorldServer world, String s, ItemInWorldManager iiw, Location loc) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, + String s, ItemInWorldManager iiw) { + super(cserver, new EntityPlayer(mcserver, world, s, iiw)); + this.loc = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.loc = this.getLocation(); + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public int getHealth() { + return health; + } + + @Override + public void setHealth(int h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth(h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + loc.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.loc = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.loc.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return loc; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.loc.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); + } + + public void setLocation(Location l) { + loc = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + +} diff --git a/modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayerFactory.java b/modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..b9b7cce --- /dev/null +++ b/modules/v1_4_2/src/main/java/mc/alk/virtualplayers/nms/v1_4_2/CraftVirtualPlayerFactory.java @@ -0,0 +1,60 @@ +package mc.alk.virtualplayers.nms.v1_4_2; + +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; + +import net.minecraft.server.ItemInWorldManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + WorldServer worldServer = mcserver.getWorldServer(0); + ItemInWorldManager iiw = new ItemInWorldManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + CraftVirtualPlayer vp = new CraftVirtualPlayer(cserver, mcserver, world, name, iiw, location); + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 7c7656e47f1a5997d0bee66e52a1108cbf663cb8 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sun, 28 Jun 2015 16:53:27 -0500 Subject: [PATCH 55/74] VirtualPlayers v1.6.7 Added modules: - v1_2_5 - v1_3_2 - v1_4_2 - fixed VirtualPlayers.getOnlinePlayers() to be backwards compatible: This is achieved using the BukkitInterface from BattleBukkitLib. --- modules/VirtualPlayers/pom.xml | 23 ++++++++++++++++++- .../mc/alk/virtualplayers/VirtualPlayers.java | 21 ++++++++++------- pom.xml | 3 +++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 9f4a99d..5d00fb8 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.6 + 1.6.7 jar VirtualPlayers @@ -41,6 +41,27 @@ jar true + + mc.alk + vp-v1_2_5 + parent + jar + true + + + mc.alk + vp-v1_3_2 + parent + jar + true + + + mc.alk + vp-v1_4_2 + parent + jar + true + mc.alk vp-v1_4_5 diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 6d43968..9a54402 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -8,12 +8,13 @@ import mc.alk.virtualplayers.api.VirtualPlayer; import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.battlelib.bukkit.BukkitInterface; +import mc.alk.virtualplayers.battlelib.version.Version; +import mc.alk.virtualplayers.battlelib.version.VersionFactory; import mc.alk.virtualplayers.executors.PlayerExecutor; import mc.alk.virtualplayers.executors.VPBaseExecutor; import mc.alk.virtualplayers.executors.VPExecutor; import mc.alk.virtualplayers.listeners.VirtualPlayerListener; -import mc.alk.virtualplayers.version.Version; -import mc.alk.virtualplayers.version.VersionFactory; import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; @@ -26,7 +27,7 @@ public class VirtualPlayers extends JavaPlugin { public static final String MAX = "1.8.7-R9.9-SNAPSHOT"; public static final String MIN = "1.2.5"; public static final Version server = VersionFactory.getServerVersion(); - public static final String NMS = VersionFactory.getNmsVersion().toString(); + public static final String NMS = VersionFactory.getNmsPackage(); static final VirtualPlayerFactory factory = VirtualPlayerFactory.newInstance(); @@ -114,15 +115,19 @@ public static Collection getVirtualPlayers() { } /** - * This absolutely MUST be fixed:. + * Returns all online players, including api.VirtualPlayers.

*
-     * Bukkit.getOnlinePlayers() won't work on older versions because of the return type.
+     * VirtualPlayers.getOnlinePlayers() :
+     * Using this method has an added bonus: It is backwards compatible.
+     * v1.7.9 - Bukkit.getOnlinePlayers - returns Player[]
+     * v1.7.10 - Bukkit.getOnlinePlayers - returns {@code Collection }
+     * It doesn't matter what the return type for Bukkit.getOnlinePlayers() is,
+     * this method will work.
      * 
* - * @return + * @return an Array of bukkit.entity.Player + api.VirtualPlayer. */ public static Player[] getOnlinePlayers() { - generateErrorOnPurpose(); // Self reminder that can't be ignored. List players = new ArrayList(); for (Player p : VirtualPlayerFactory.getVirtualPlayers()) { if (p.isOnline()) { @@ -130,7 +135,7 @@ public static Player[] getOnlinePlayers() { } } Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = Bukkit.getOnlinePlayers().toArray(new Player[0]); + Player[] bps = BukkitInterface.getOnlinePlayers().toArray(new Player[0]); return (Player[]) ArrayUtils.addAll(ps, bps); } diff --git a/pom.xml b/pom.xml index 83984e1..a05923f 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,9 @@ modules/api modules/vpre + modules/v1_2_5 + modules/v1_3_2 + modules/v1_4_2 modules/v1_4_5 modules/v1_4_6 modules/v1_4_R1 From fc977369cab79367f8954d189e3f64f19608943c Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 24 Dec 2015 15:56:49 -0600 Subject: [PATCH 56/74] VirtualPlayers 1.6.7.2 - Changed the start-up logic that determines if the server is compatible with VirtualPlayers or not. - Added rainbowcraft-repo - Removed SNAPSHOT designation so that local repositories would not get over-written by the remote rainbowcraft-repo --- modules/VirtualPlayers/pom.xml | 6 ++++- .../mc/alk/virtualplayers/VirtualPlayers.java | 26 ++++++++++++------- modules/v1_8_R1/pom.xml | 2 +- modules/v1_8_R2/pom.xml | 2 +- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 5d00fb8..7d65444 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.7 + 1.6.7.2 jar VirtualPlayers @@ -19,6 +19,10 @@ bukkit-repo http://repo.bukkit.org/content/groups/public/ + + rainbowcraft-repo + http://rainbowcraft.sytes.net/maven/repository/ + diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 9a54402..8b46e33 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -5,11 +5,11 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.logging.Level; import mc.alk.virtualplayers.api.VirtualPlayer; import mc.alk.virtualplayers.api.VirtualPlayerFactory; import mc.alk.virtualplayers.battlelib.bukkit.BukkitInterface; -import mc.alk.virtualplayers.battlelib.version.Version; import mc.alk.virtualplayers.battlelib.version.VersionFactory; import mc.alk.virtualplayers.executors.PlayerExecutor; import mc.alk.virtualplayers.executors.VPBaseExecutor; @@ -18,25 +18,18 @@ import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; -import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; public class VirtualPlayers extends JavaPlugin { - public static final String MAX = "1.8.7-R9.9-SNAPSHOT"; - public static final String MIN = "1.2.5"; - public static final Version server = VersionFactory.getServerVersion(); - public static final String NMS = VersionFactory.getNmsPackage(); + private static final String NMS = VersionFactory.getNmsPackage(); static final VirtualPlayerFactory factory = VirtualPlayerFactory.newInstance(); @Override public void onEnable() { - if (!server.isSupported(MAX) || !server.isCompatible(MIN)) { - getLogger().info("VirtualPlayers is not compatible with your server."); - getLogger().info("The maximum supported version is " + MAX); - getLogger().info("The minimum capatible version is " + MIN); + if (!isServerCompatible()) { Bukkit.getServer().getPluginManager().disablePlugin(this); return; } @@ -49,6 +42,19 @@ public void onEnable() { public void onDisable() { deleteVirtualPlayers(); } + + private boolean isServerCompatible() { + String className = "mc.alk.virtualplayers.nms." + NMS + ".CraftVirtualPlayer"; + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException ex) { + getLogger().log(Level.WARNING, "VirtualPlayers is not compatible with your server."); + getLogger().log(Level.WARNING, "IMPLEMENTATION NOT FOUND: "); + getLogger().log(Level.WARNING, className); + return false; + } + } public void setPlayerMessages(boolean visibility) { for (VirtualPlayer vp : getVirtualPlayers()) { diff --git a/modules/v1_8_R1/pom.xml b/modules/v1_8_R1/pom.xml index ba462b0..45b434a 100644 --- a/modules/v1_8_R1/pom.xml +++ b/modules/v1_8_R1/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.8.0-R0.1-SNAPSHOT + 1.8.0-R0.1 provided diff --git a/modules/v1_8_R2/pom.xml b/modules/v1_8_R2/pom.xml index 2125786..e3f958f 100644 --- a/modules/v1_8_R2/pom.xml +++ b/modules/v1_8_R2/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.8.3-R0.1-SNAPSHOT + 1.8.3-R0.1 provided From e77e41ac1b6146a79adb4142cdceb264fe38fa0a Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 24 Dec 2015 16:19:35 -0600 Subject: [PATCH 57/74] Updated dependency in order to NOT over-write someone's local repository --- modules/v1_5_R1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml index d73dc4b..731d8bb 100644 --- a/modules/v1_5_R1/pom.xml +++ b/modules/v1_5_R1/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.5-R0.1-SNAPSHOT + 1.5.0-R0.1 provided From cac2c9e4cc9c9f240d1328eac51205955221512e Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 9 Mar 2016 12:19:16 -0600 Subject: [PATCH 58/74] VirtualPlayers v1.6.8 - adds support for Minecraft 1.9 --- modules/VirtualPlayers/pom.xml | 19 +- modules/v1_9_R1/pom.xml | 83 ++++ .../nms/v1_9_R1/CraftVirtualPlayer.java | 365 ++++++++++++++++++ .../v1_9_R1/CraftVirtualPlayerFactory.java | 65 ++++ pom.xml | 1 + 5 files changed, 530 insertions(+), 3 deletions(-) create mode 100644 modules/v1_9_R1/pom.xml create mode 100644 modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayer.java create mode 100644 modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayerFactory.java diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 7d65444..b2be060 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.7.2 + 1.6.8 jar VirtualPlayers @@ -178,6 +178,13 @@ jar true + + mc.alk + vp-v1_9_R1 + parent + jar + true + junit junit @@ -185,6 +192,12 @@ test + + + rainbowcraft-repo + scp://rainbowcraft.sytes.net/var/www/maven/repository + + VirtualPlayers2 ./target @@ -193,7 +206,7 @@ org.apache.maven.wagon wagon-ssh - 2.6 + 2.10 @@ -210,7 +223,7 @@ org.apache.maven.plugins maven-deploy-plugin - 2.7 + 2.8.2 false diff --git a/modules/v1_9_R1/pom.xml b/modules/v1_9_R1/pom.xml new file mode 100644 index 0000000..e481288 --- /dev/null +++ b/modules/v1_9_R1/pom.xml @@ -0,0 +1,83 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_9_R1 + parent + jar + + virtualplayers-v1_9_R1 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.9-R0.1-SNAPSHOT + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_9_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + + diff --git a/modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayer.java b/modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayer.java new file mode 100644 index 0000000..bc7262b --- /dev/null +++ b/modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayer.java @@ -0,0 +1,365 @@ +package mc.alk.virtualplayers.nms.v1_9_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_9_R1.EntityPlayer; +import net.minecraft.server.v1_9_R1.MinecraftServer; +import net.minecraft.server.v1_9_R1.PlayerInteractManager; +import net.minecraft.server.v1_9_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_9_R1.CraftServer; +import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_9_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Egg; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_9_R1.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); + } + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); + } + + @Override + public void _INVALID_damage(int amount) { + damage(amount); + } + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); + } + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); + } + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); + } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); + } + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); + } + + @Override + public Egg throwEgg() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Snowball throwSnowball() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Arrow shootArrow() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayerFactory.java b/modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..e59b6ce --- /dev/null +++ b/modules/v1_9_R1/src/main/java/mc/alk/virtualplayers/nms/v1_9_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_9_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_9_R1.MinecraftServer; +import net.minecraft.server.v1_9_R1.PlayerInteractManager; +import net.minecraft.server.v1_9_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_9_R1.CraftServer; +import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/pom.xml b/pom.xml index a05923f..960f25b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,7 @@ modules/v1_8_R1 modules/v1_8_R2 modules/v1_8_R3 + modules/v1_9_R1 modules/VirtualPlayers From 9ec2c784bff662edbfc621888549c9462d2eb030 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 9 Mar 2016 12:39:06 -0600 Subject: [PATCH 59/74] Removed SNAPSHOT designation We don't want to over-write someone's local maven repository here, so we're using craftbukkit 1.9-R0.1 instead of the proper version which is 1.9-R0.1-SNAPSHOT --- modules/v1_9_R1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/v1_9_R1/pom.xml b/modules/v1_9_R1/pom.xml index e481288..1059f5a 100644 --- a/modules/v1_9_R1/pom.xml +++ b/modules/v1_9_R1/pom.xml @@ -29,7 +29,7 @@ org.bukkit craftbukkit - 1.9-R0.1-SNAPSHOT + 1.9-R0.1 provided From 52596d413668496c0d57cc0a50ac71c92c7e941a Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 11 May 2016 18:08:47 -0500 Subject: [PATCH 60/74] Added modules/v1_9_R2 - for Minecraft 1.9.4 --- modules/v1_9_R2/pom.xml | 64 +++ .../nms/v1_9_R2/CraftVirtualPlayer.java | 365 ++++++++++++++++++ .../v1_9_R2/CraftVirtualPlayerFactory.java | 65 ++++ 3 files changed, 494 insertions(+) create mode 100644 modules/v1_9_R2/pom.xml create mode 100644 modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayer.java create mode 100644 modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayerFactory.java diff --git a/modules/v1_9_R2/pom.xml b/modules/v1_9_R2/pom.xml new file mode 100644 index 0000000..7f35f06 --- /dev/null +++ b/modules/v1_9_R2/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_9_R2 + parent + jar + + virtualplayers-v1_9_R2 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.9.4-R0.1 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_9_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayer.java b/modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayer.java new file mode 100644 index 0000000..b9ec872 --- /dev/null +++ b/modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayer.java @@ -0,0 +1,365 @@ +package mc.alk.virtualplayers.nms.v1_9_R2; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_9_R2.EntityPlayer; +import net.minecraft.server.v1_9_R2.MinecraftServer; +import net.minecraft.server.v1_9_R2.PlayerInteractManager; +import net.minecraft.server.v1_9_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_9_R2.CraftServer; +import org.bukkit.craftbukkit.v1_9_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_9_R2.scoreboard.CraftScoreboard; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Egg; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_9_R2.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); + } + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); + } + + @Override + public void _INVALID_damage(int amount) { + damage(amount); + } + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); + } + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); + } + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); + } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); + } + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); + } + + @Override + public Egg throwEgg() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Snowball throwSnowball() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Arrow shootArrow() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayerFactory.java b/modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..1e7496f --- /dev/null +++ b/modules/v1_9_R2/src/main/java/mc/alk/virtualplayers/nms/v1_9_R2/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_9_R2; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_9_R2.MinecraftServer; +import net.minecraft.server.v1_9_R2.PlayerInteractManager; +import net.minecraft.server.v1_9_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_9_R2.CraftServer; +import org.bukkit.craftbukkit.v1_9_R2.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 1fda201b49f35d1eac7f4341dce2fa687f731782 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Wed, 11 May 2016 18:11:11 -0500 Subject: [PATCH 61/74] v1.7.0 adds support for Minecraft 1.9.4 --- modules/VirtualPlayers/pom.xml | 33 ++++++++++----------------------- pom.xml | 1 + 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index b2be060..dc0adb0 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.6.8 + 1.7.0 jar VirtualPlayers @@ -36,154 +36,138 @@ mc.alk vp-api parent - true mc.alk vp-vpre parent jar - true mc.alk vp-v1_2_5 parent jar - true mc.alk vp-v1_3_2 parent jar - true mc.alk vp-v1_4_2 parent jar - true mc.alk vp-v1_4_5 parent jar - true mc.alk vp-v1_4_6 parent jar - true mc.alk vp-v1_4_R1 parent jar - true mc.alk vp-v1_5_R1 parent jar - true mc.alk vp-v1_5_R2 parent jar - true mc.alk vp-v1_5_R3 parent jar - true mc.alk vp-v1_6_R1 parent jar - true mc.alk vp-v1_6_R2 parent jar - true mc.alk vp-v1_6_R3 parent jar - true mc.alk vp-v1_7_R1 parent jar - true mc.alk vp-v1_7_R2 parent jar - true mc.alk vp-v1_7_R3 parent jar - true mc.alk vp-v1_7_R4 parent jar - true mc.alk vp-v1_8_R1 parent jar - true mc.alk vp-v1_8_R2 parent jar - true mc.alk vp-v1_8_R3 parent jar - true mc.alk vp-v1_9_R1 parent jar - true + + + mc.alk + vp-v1_9_R2 + parent + jar junit @@ -281,6 +265,9 @@ + + + diff --git a/pom.xml b/pom.xml index 960f25b..70f8934 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ modules/v1_8_R2 modules/v1_8_R3 modules/v1_9_R1 + modules/v1_9_R2 modules/VirtualPlayers
From 6bd8fada7ca28987e45cbfea6b4f83bc3ee15850 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Mon, 13 Jun 2016 22:29:32 -0500 Subject: [PATCH 62/74] v1.7.1 -- Deleted modules/vpre --- modules/VirtualPlayers/pom.xml | 8 +- modules/vpre/pom.xml | 58 ---- .../nms/pre/CraftVirtualPlayer.java | 263 ------------------ .../nms/pre/CraftVirtualPlayerFactory.java | 60 ---- .../alk/virtualplayers/v1_7_R2/AppTest.java | 38 --- pom.xml | 1 - 6 files changed, 1 insertion(+), 427 deletions(-) delete mode 100644 modules/vpre/pom.xml delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java delete mode 100644 modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java delete mode 100644 modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index dc0adb0..dbbac2f 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.7.0 + 1.7.1 jar VirtualPlayers @@ -37,12 +37,6 @@ vp-api parent
- - mc.alk - vp-vpre - parent - jar - mc.alk vp-v1_2_5 diff --git a/modules/vpre/pom.xml b/modules/vpre/pom.xml deleted file mode 100644 index 852eb1f..0000000 --- a/modules/vpre/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - 4.0.0 - - mc.alk - vp-parent - parent - ../../ - - mc.alk - vp-vpre - parent - jar - - virtualplayers-vPre - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - - - - org.bukkit - craftbukkit - 1.3.2-R2.0 - provided - - - mc.alk - vp-api - parent - true - - - junit - junit - 3.8.1 - test - - - - VirtualPlayers-vPre - ./target - ./src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - - diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java deleted file mode 100644 index f74dd84..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayer.java +++ /dev/null @@ -1,263 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import java.util.Collection; - -import mc.alk.virtualplayers.api.VirtualPlayer; -import mc.alk.virtualplayers.util.Util; - -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.ItemInWorldManager; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldServer; - -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { - - Player keepInformed; // / who to send the messages to - boolean online = true; - int health = 20; - boolean isop = true; - boolean showMessages = true; - boolean showTeleports = true; - GameMode gamemode = GameMode.SURVIVAL; - Location loc; - - public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, - WorldServer world, String s, ItemInWorldManager iiw, Location loc) { - super(cserver, new EntityPlayer(mcserver, world, s, iiw)); - this.loc = loc; - } - - public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer world, - String s, ItemInWorldManager iiw) { - super(cserver, new EntityPlayer(mcserver, world, s, iiw)); - this.loc = this.getLocation(); - } - - public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { - super(cserver, ep); - this.loc = this.getLocation(); - } - - @Override - public InventoryView openInventory(Inventory inv) { - return null; - } - - @Override - public boolean addPotionEffect(PotionEffect effect) { - return false; - } - - @Override - public boolean addPotionEffect(PotionEffect effect, boolean force) { - return false; - } - - @Override - public boolean addPotionEffects(Collection effects) { - return false; - } - - @Override - public void removePotionEffect(PotionEffectType effect) { - /// do nothing - } - - @Override - public void closeInventory() { - /// do nothing - } - - @Override - public void updateInventory() { - /// Do nothing - } - - @Override - public void setGameMode(GameMode gamemode) { - try { - super.setGameMode(gamemode); - } catch (Exception e) { - /* say nothing*/ - } - this.gamemode = gamemode; - } - - @Override - public GameMode getGameMode() { - return gamemode; - } - - @Override - public int getHealth() { - return health; - } - - @Override - public void setHealth(int h) { - if (h < 0) { - h = 0; - } - this.health = h; - try { - super.setHealth(h); - } catch (Exception e) { - } - try { - this.getHandle().setHealth(h); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public boolean isDead() { - return super.isDead() || health <= 0; - } - - @Override - public void sendMessage(String s) { - if (showMessages) { - Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") - + getName() + " gettingMessage= " + s); - } - } - - @Override - public void moveTo(Location loc) { - entity.move(loc.getX(), loc.getY(), loc.getZ()); - } - - @Override - public boolean teleport(Location l, boolean respawn) { - if (isDead()) { - return false; - } - try { - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(l.getWorld().getName()); - final String teleporting = respawn ? "respawning" : "teleporting"; - if (showTeleports && showMessages) { - String fromWorld = ""; - String toWorld = ""; - if (changedWorlds) { - fromWorld = "&5" + loc.getWorld().getName() + "&4,"; - toWorld = "&5" + l.getWorld().getName() + "&4,"; - } - Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" - + fromWorld + Util.getLocString(loc) + " &e-> &4" + toWorld - + Util.getLocString(l)); - } - this.loc = l.clone(); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - l.getWorld()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - cserver.getPluginManager().callEvent(pcwe); - /// For some reason, world doesnt get changed, so lets explicitly set it - this.entity.world = ((CraftWorld) loc.getWorld()).getHandle(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - @Override - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - if (isDead()) { - return false; - } - super.teleport(location, cause); - teleport(location, false); - return true; - } - - @Override - public boolean teleport(Location l) { - return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); - } - - @Override - public void respawn(Location loc) { - this.health = 20; - boolean changedWorlds = !this.loc.getWorld().getName() - .equals(loc.getWorld().getName()); - CraftServer cserver = (CraftServer) Bukkit.getServer(); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, - false); - cserver.getPluginManager().callEvent(respawnEvent); - if (changedWorlds) { - PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, - loc.getWorld()); - cserver.getPluginManager().callEvent(pcwe); - } - } - - @Override - public Location getLocation() { - return loc; - } - - @Override - public boolean isOnline() { - return online; - } - - @Override - public void setOnline(boolean b) { - if (showMessages) { - Util.sendMessage(this, getName() + " is " - + (b ? "connecting" : "disconnecting")); - } - online = b; - } - - @Override - public boolean isOp() { - return isop; - } - - @Override - public void setOp(boolean b) { - isop = b; - } - - @Override - public String toString() { - String world = "&5" + this.loc.getWorld().getName() + ","; - return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() - + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" - + Util.getLocString(loc) + "&e gm=&8" + getGameMode(); - } - - public void setLocation(Location l) { - loc = l; - } - - @Override - public Player getInformed() { - return keepInformed; - } - - @Override - public void setShowMessages(boolean visibility) { - showMessages = visibility; - } - -} diff --git a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java b/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java deleted file mode 100644 index 69a7988..0000000 --- a/modules/vpre/src/main/java/mc/alk/virtualplayers/nms/pre/CraftVirtualPlayerFactory.java +++ /dev/null @@ -1,60 +0,0 @@ -package mc.alk.virtualplayers.nms.pre; - -import java.util.List; - -import mc.alk.virtualplayers.api.VirtualPlayer; -import mc.alk.virtualplayers.api.VirtualPlayerFactory; - -import net.minecraft.server.ItemInWorldManager; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldServer; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; - -/** - * Make, track, & delete VirtualPlayers. - */ -public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { - - @Override - public VirtualPlayer makeVirtualPlayer(String name) throws Exception { - CraftServer cserver = (CraftServer) Bukkit.getServer(); - List worlds = cserver.getWorlds(); - if (worlds == null || worlds.isEmpty()) { - throw new Exception("There must be at least one world"); - } - CraftWorld w = (CraftWorld) worlds.get(0); - Location location = new Location(w, 0, 0, 0); - MinecraftServer mcserver = cserver.getServer(); - WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); - WorldServer worldServer = mcserver.getWorldServer(0); - ItemInWorldManager iiw = new ItemInWorldManager(worldServer); - if (name == null) { - name = "p" + (vps.size() + 1); - } - CraftVirtualPlayer vp = new CraftVirtualPlayer(cserver, mcserver, world, name, iiw, location); - vps.put(vp.getUniqueId(), vp); - names.put(vp.getName(), vp); - return vp; - } - - @Override - public void deleteVirtualPlayer(String name) { - deleteVirtualPlayer(names.get(name)); - } - - @Override - public void deleteVirtualPlayer(VirtualPlayer vp) { - CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; - WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); - world.removeEntity(cvp.getHandle()); - cvp.remove(); - vps.remove(cvp.getUniqueId()); - names.remove(cvp.getName()); - } - -} diff --git a/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java b/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java deleted file mode 100644 index e85bf94..0000000 --- a/modules/vpre/src/test/java/mc/alk/virtualplayers/v1_7_R2/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package mc.alk.virtualplayers.v1_7_R2; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/pom.xml b/pom.xml index 70f8934..63d4287 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,6 @@ modules/api - modules/vpre modules/v1_2_5 modules/v1_3_2 modules/v1_4_2 From 269a97221b5bc36c2666052d62bf9511365aedb0 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Mon, 13 Jun 2016 22:39:31 -0500 Subject: [PATCH 63/74] Added modules/v1_10_R1 --- modules/v1_10_R1/pom.xml | 64 +++ .../nms/v1_10_R1/CraftVirtualPlayer.java | 365 ++++++++++++++++++ .../v1_10_R1/CraftVirtualPlayerFactory.java | 65 ++++ 3 files changed, 494 insertions(+) create mode 100644 modules/v1_10_R1/pom.xml create mode 100644 modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java create mode 100644 modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayerFactory.java diff --git a/modules/v1_10_R1/pom.xml b/modules/v1_10_R1/pom.xml new file mode 100644 index 0000000..4913663 --- /dev/null +++ b/modules/v1_10_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_10_R1 + parent + jar + + virtualplayers-v1_10_R1 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.10-R0.1 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_10_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java new file mode 100644 index 0000000..abd89a1 --- /dev/null +++ b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java @@ -0,0 +1,365 @@ +package mc.alk.virtualplayers.nms.v1_10_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_10_R1.EntityPlayer; +import net.minecraft.server.v1_10_R1.MinecraftServer; +import net.minecraft.server.v1_10_R1.PlayerInteractManager; +import net.minecraft.server.v1_10_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_10_R1.CraftServer; +import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_10_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Egg; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_10_R1.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); + } + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); + } + + @Override + public void _INVALID_damage(int amount) { + damage(amount); + } + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); + } + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); + } + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); + } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); + } + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); + } + + @Override + public Egg throwEgg() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Snowball throwSnowball() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Arrow shootArrow() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayerFactory.java b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..a95cab6 --- /dev/null +++ b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_10_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_10_R1.MinecraftServer; +import net.minecraft.server.v1_10_R1.PlayerInteractManager; +import net.minecraft.server.v1_10_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_10_R1.CraftServer; +import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 05dfd80b8160c5ae109decff23469afdbac9de92 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Mon, 13 Jun 2016 22:40:15 -0500 Subject: [PATCH 64/74] VirtualPlayers v1.7.2 - Added modules/v1_10_R1 implementation --- modules/VirtualPlayers/pom.xml | 8 +++++++- pom.xml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index dbbac2f..d1fc3f8 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.7.1 + 1.7.2 jar VirtualPlayers @@ -163,6 +163,12 @@ parent jar + + mc.alk + vp-v1_10_R1 + parent + jar + junit junit diff --git a/pom.xml b/pom.xml index 63d4287..8146388 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ modules/v1_8_R3 modules/v1_9_R1 modules/v1_9_R2 + modules/v1_10_R1 modules/VirtualPlayers From 1e27ed66e68655ebd937f01824831160ab83266f Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 04:56:56 -0600 Subject: [PATCH 65/74] Change old Bukkit repository --- modules/VirtualPlayers/pom.xml | 4 ++-- pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index d1fc3f8..988cc15 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -16,8 +16,8 @@ - bukkit-repo - http://repo.bukkit.org/content/groups/public/ + md_5-repo + https://repo.md-5.net/content/groups/public rainbowcraft-repo diff --git a/pom.xml b/pom.xml index 8146388..56c0f4c 100644 --- a/pom.xml +++ b/pom.xml @@ -43,8 +43,8 @@ http://rainbowcraft.sytes.net/maven/repository/ - bukkit-repo - http://repo.bukkit.org/content/groups/public + md_5-repo + https://repo.md-5.net/content/groups/public md_5-snapshots From fec22b21706de6409ea11e47f20aa5e49da283b7 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 05:16:05 -0600 Subject: [PATCH 66/74] Fixed vault-repo --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56c0f4c..ef8fc18 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ vault-repo - http://nexus.theyeticave.net/content/repositories/pub_releases + http://nexus.hc.to/content/repositories/pub_releases/ kitteh-repo From b0c120a1320c6ced7a04ed07e9f72a9ad981220e Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 05:58:13 -0600 Subject: [PATCH 67/74] Update BattleBukkitLib --- modules/api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/api/pom.xml b/modules/api/pom.xml index ea8a7e0..73b3bbb 100644 --- a/modules/api/pom.xml +++ b/modules/api/pom.xml @@ -29,7 +29,7 @@ mc.alk BattleBukkitLib - 2.3 + 2.4.1 compile From 1d1db9eea1eb6b8ac6fcf6fd63c7a2ade43025a4 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 06:29:51 -0600 Subject: [PATCH 68/74] Added modules/v1_11_R1 - not tested - CraftVirtualPlayer.java line 167 added net.minecraft.server.V1_11_R1.EnumMoveType --- modules/v1_11_R1/pom.xml | 64 +++ .../nms/v1_11_R1/CraftVirtualPlayer.java | 366 ++++++++++++++++++ .../v1_11_R1/CraftVirtualPlayerFactory.java | 65 ++++ 3 files changed, 495 insertions(+) create mode 100644 modules/v1_11_R1/pom.xml create mode 100644 modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java create mode 100644 modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayerFactory.java diff --git a/modules/v1_11_R1/pom.xml b/modules/v1_11_R1/pom.xml new file mode 100644 index 0000000..e367a3e --- /dev/null +++ b/modules/v1_11_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_11_R1 + parent + jar + + virtualplayers-v1_11_R1 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.11.2-R0.1 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_11_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java new file mode 100644 index 0000000..0f10f1a --- /dev/null +++ b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java @@ -0,0 +1,366 @@ +package mc.alk.virtualplayers.nms.v1_11_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_11_R1.EntityPlayer; +import net.minecraft.server.v1_11_R1.EnumMoveType; +import net.minecraft.server.v1_11_R1.MinecraftServer; +import net.minecraft.server.v1_11_R1.PlayerInteractManager; +import net.minecraft.server.v1_11_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_11_R1.CraftServer; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_11_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Egg; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_11_R1.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(EnumMoveType.SELF, loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); + } + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); + } + + @Override + public void _INVALID_damage(int amount) { + damage(amount); + } + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); + } + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); + } + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); + } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); + } + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); + } + + @Override + public Egg throwEgg() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Snowball throwSnowball() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Arrow shootArrow() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayerFactory.java b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..195f4ea --- /dev/null +++ b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_11_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_11_R1.MinecraftServer; +import net.minecraft.server.v1_11_R1.PlayerInteractManager; +import net.minecraft.server.v1_11_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_11_R1.CraftServer; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 902fbb32a35dc43516092dabf4a9139e1cab1344 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 06:33:26 -0600 Subject: [PATCH 69/74] Untested v1.7.3 adds support for Minecraft 1.11.2 - CraftVirtualPlayer.java line 167 added net.minecraft.server.v1_11_R1.EnumMoveType --- modules/VirtualPlayers/pom.xml | 8 +++++++- pom.xml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 988cc15..5def8b5 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.7.2 + 1.7.3 jar VirtualPlayers @@ -169,6 +169,12 @@ parent jar + + mc.alk + vp-v1_11_R1 + parent + jar + junit junit diff --git a/pom.xml b/pom.xml index ef8fc18..dec82f1 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ modules/v1_9_R1 modules/v1_9_R2 modules/v1_10_R1 + modules/v1_11_R1 modules/VirtualPlayers From 4d03ffcfcf4dc13062dc0f3ea63c48386dcf79bd Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 07:01:50 -0600 Subject: [PATCH 70/74] Added modules/v1_12_R1 - several methods in CraftVirtualPlayer are NOT implemented. - untested --- modules/v1_12_R1/pom.xml | 64 +++ .../nms/v1_12_R1/CraftVirtualPlayer.java | 388 ++++++++++++++++++ .../v1_12_R1/CraftVirtualPlayerFactory.java | 65 +++ 3 files changed, 517 insertions(+) create mode 100644 modules/v1_12_R1/pom.xml create mode 100644 modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java create mode 100644 modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayerFactory.java diff --git a/modules/v1_12_R1/pom.xml b/modules/v1_12_R1/pom.xml new file mode 100644 index 0000000..616b02e --- /dev/null +++ b/modules/v1_12_R1/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + mc.alk + vp-parent + parent + ../../ + + mc.alk + vp-v1_12_R1 + parent + jar + + virtualplayers-v1_12_R1 + http://dev.bukkit.org/bukkit-plugins/virtualplayers/ + + + UTF-8 + + + + + org.bukkit + bukkit + 1.7.9-R0.3-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.12.2-R0.1 + provided + + + mc.alk + vp-api + parent + true + + + junit + junit + 3.8.1 + test + + + + VirtualPlayers-v1_12_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + diff --git a/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java new file mode 100644 index 0000000..ee0354e --- /dev/null +++ b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java @@ -0,0 +1,388 @@ +package mc.alk.virtualplayers.nms.v1_12_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_12_R1.EntityPlayer; +import net.minecraft.server.v1_12_R1.EnumMoveType; +import net.minecraft.server.v1_12_R1.MinecraftServer; +import net.minecraft.server.v1_12_R1.PlayerInteractManager; +import net.minecraft.server.v1_12_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_12_R1.CraftServer; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_12_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Egg; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.util.NumberConversions; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_12_R1.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(EnumMoveType.SELF, loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + + @Override + public int _INVALID_getLastDamage() { + return NumberConversions.ceil(getLastDamage()); + } + + @Override + public void _INVALID_setLastDamage(int damage) { + setLastDamage(damage); + } + + @Override + public void _INVALID_damage(int amount) { + damage(amount); + } + + @Override + public void _INVALID_damage(int amount, Entity source) { + damage(amount, source); + } + + @Override + public int _INVALID_getHealth() { + return NumberConversions.ceil(getHealth()); + } + + @Override + public void _INVALID_setHealth(int hp) { + setHealth(hp); + } + + @Override + public int _INVALID_getMaxHealth() { + return NumberConversions.ceil(getMaxHealth()); + } + + @Override + public void _INVALID_setMaxHealth(int max) { + setMaxHealth(max); + } + + @Override + public Egg throwEgg() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Snowball throwSnowball() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Arrow shootArrow() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public List getLineOfSight(HashSet hs, int i) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Block getTargetBlock(HashSet hs, int i) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public List getLastTwoTargetBlocks(HashSet hs, int i) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void setBanned(boolean bln) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + +} diff --git a/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayerFactory.java b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..1838a82 --- /dev/null +++ b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_12_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_12_R1.MinecraftServer; +import net.minecraft.server.v1_12_R1.PlayerInteractManager; +import net.minecraft.server.v1_12_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_12_R1.CraftServer; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} From 3fbb006a532ac6a329d43dda6b52f81cb1b8e1fe Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 13 Jan 2018 07:03:03 -0600 Subject: [PATCH 71/74] VirtualPlayers v1.7.4 for Minecraft 1.12.2 - not tested - several methods in CraftVirtualPlayer are NOT implemented --- modules/VirtualPlayers/pom.xml | 8 +++++++- pom.xml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 5def8b5..8dfde20 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -4,7 +4,7 @@ mc.alk VirtualPlayers - 1.7.3 + 1.7.4 jar VirtualPlayers @@ -175,6 +175,12 @@ parent jar + + mc.alk + vp-v1_12_R1 + parent + jar + junit junit diff --git a/pom.xml b/pom.xml index dec82f1..7bb556a 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ modules/v1_9_R2 modules/v1_10_R1 modules/v1_11_R1 + modules/v1_12_R1 modules/VirtualPlayers From 6ddfb3ee89751e55ee7b650a2ae4d90197ec6da5 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Sat, 10 Feb 2018 21:22:43 -0600 Subject: [PATCH 72/74] Update README replaced outdated link to ci server with maven repo --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1297607..92b22b0 100644 --- a/README.md +++ b/README.md @@ -15,17 +15,17 @@ Downloads: You can find the official builds at dev.bukkit.org -[http://dev.bukkit.org/bukkit-plugins/virtualplayers2/] (http://dev.bukkit.org/bukkit-plugins/virtualplayers2/ "Official builds") +[http://dev.bukkit.org/bukkit-plugins/virtualplayers2/](http://dev.bukkit.org/bukkit-plugins/virtualplayers2/ "Official builds") **Development builds** ```python -"Development builds of this project can be acquired at the provided continuous integration server." +"Development builds of this project can be acquired at the provided maven repository." "These builds have not been approved by the BukkitDev staff. Use them at your own risk." ``` -[http://ci.battleplugins.com/job/VirtualPlayers/](http://ci.battleplugins.com/job/VirtualPlayers/ "dev builds") +[http://rainbowcraft.sytes.net/download/plugins/VirtualPlayers2/](http://rainbowcraft.sytes.net/download/plugins/VirtualPlayers2/ "Dev builds") The dev builds are primarily for testing purposes. From 88b1eae79f903867d031cd355e5d3391b7eeed27 Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 21 Mar 2019 18:57:26 -0500 Subject: [PATCH 73/74] Pushing local changes (massive)... - updated & stream-lined POMs. - New, fully separated VirtualPlayersAPI v1.0. - Added debugging utilities for chunk entities. - Removed SNAPSHOT designation for Bukkit & Craftbukkit. Next update: - modules/v1_13_R1 - modules/v1_13_R2 - Also, the next update will exactly match all Bukkit & Craftbukkit versions which will change the interfaces & hopefully fix the JVM chiral-diamond bug. --- modules/VirtualPlayers/pom.xml | 237 ++++++++++++------ .../mc/alk/virtualPlayer/VirtualPlayers.java | 143 ----------- .../mc/alk/virtualplayers/VirtualPlayers.java | 147 +++++------ .../executors/CustomCommandExecutor.java | 6 +- .../executors/PlayerExecutor.java | 179 +++++++++++-- .../executors/VPBaseExecutor.java | 9 +- .../virtualplayers/executors/VPExecutor.java | 14 +- .../listeners/VirtualPlayerListener.java | 8 +- modules/api/pom.xml | 106 ++++---- .../api/VirtualPlayerFactory.java | 2 +- .../virtualplayers/api/VirtualPlayersAPI.java | 137 ++++++++++ .../java/mc/alk/virtualplayers/api/Vps.java | 15 ++ .../virtualplayers/util/InventoryUtil.java | 15 +- .../java/mc/alk/virtualplayers/util/Util.java | 37 +++ modules/v1_10_R1/pom.xml | 28 +-- .../nms/v1_10_R1/CraftVirtualPlayer.java | 15 -- modules/v1_11_R1/pom.xml | 26 +- .../nms/v1_11_R1/CraftVirtualPlayer.java | 15 -- modules/v1_12_R1/pom.xml | 26 +- .../nms/v1_12_R1/CraftVirtualPlayer.java | 75 ------ modules/v1_2_5/pom.xml | 24 +- modules/v1_3_2/pom.xml | 24 +- modules/v1_4_2/pom.xml | 24 +- modules/v1_4_5/pom.xml | 24 +- modules/v1_4_6/pom.xml | 24 +- modules/v1_4_R1/pom.xml | 24 +- modules/v1_5_R1/pom.xml | 26 +- modules/v1_5_R2/pom.xml | 24 +- modules/v1_5_R3/pom.xml | 24 +- modules/v1_6_R1/pom.xml | 26 +- modules/v1_6_R2/pom.xml | 24 +- modules/v1_6_R3/pom.xml | 24 +- modules/v1_7_R1/pom.xml | 24 +- modules/v1_7_R2/pom.xml | 26 +- modules/v1_7_R3/pom.xml | 34 +-- modules/v1_7_R4/pom.xml | 26 +- modules/v1_8_R1/pom.xml | 26 +- .../nms/v1_8_R1/CraftVirtualPlayer.java | 12 + modules/v1_8_R2/pom.xml | 26 +- modules/v1_8_R3/pom.xml | 26 +- .../nms/v1_8_R3/CraftVirtualPlayer.java | 12 + modules/v1_9_R1/pom.xml | 26 +- modules/v1_9_R2/pom.xml | 26 +- pom.xml | 73 ++++-- 44 files changed, 903 insertions(+), 966 deletions(-) delete mode 100644 modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java create mode 100644 modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayersAPI.java create mode 100644 modules/api/src/main/java/mc/alk/virtualplayers/api/Vps.java diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 8dfde20..6d88fb3 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -1,185 +1,263 @@ 4.0.0 - mc.alk VirtualPlayers - 1.7.4 + 1.7.5 jar - VirtualPlayers - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - + http://dev.bukkit.org/bukkit-plugins/virtualplayers2/ + yyyy_MM_dd UTF-8 + none + 1.8 + 1.8 - - - md_5-repo - https://repo.md-5.net/content/groups/public - rainbowcraft-repo http://rainbowcraft.sytes.net/maven/repository/ + + spigot-public + https://hub.spigotmc.org/nexus/content/repositories/public/ + + + bukkit-public + https://repo.md-5.net/content/repositories/public/ + - org.bukkit bukkit - 1.7.10-R0.1-SNAPSHOT + 1.7.10-R0.1 provided + + mc.euro + Version + 4.0.1 + jar + compile + true + + + mc.euro + BukkitInterface + 4.0.1 + jar + compile + true + + + mc.alk + BattleBukkitLib + 4.1.0 + jar + compile + true + mc.alk - vp-api - parent + VirtualPlayersAPI + 1.0 + jar + compile + true mc.alk vp-v1_2_5 - parent + static_version jar + compile + true mc.alk vp-v1_3_2 - parent + static_version jar + compile + true mc.alk vp-v1_4_2 - parent + static_version jar + compile + true mc.alk vp-v1_4_5 - parent + static_version jar + compile + true mc.alk vp-v1_4_6 - parent + static_version jar + compile + true mc.alk vp-v1_4_R1 - parent + static_version jar + compile + true mc.alk vp-v1_5_R1 - parent + static_version jar + compile + true mc.alk vp-v1_5_R2 - parent + static_version jar + compile + true mc.alk vp-v1_5_R3 - parent + static_version jar + compile + true mc.alk vp-v1_6_R1 - parent + static_version jar + compile + true mc.alk vp-v1_6_R2 - parent + static_version jar + compile + true mc.alk vp-v1_6_R3 - parent + static_version jar + compile + true mc.alk vp-v1_7_R1 - parent + static_version jar + compile + true mc.alk vp-v1_7_R2 - parent + static_version jar + compile + true mc.alk vp-v1_7_R3 - parent + static_version jar + compile + true mc.alk vp-v1_7_R4 - parent + static_version jar + compile + true mc.alk vp-v1_8_R1 - parent + static_version jar + compile + true mc.alk vp-v1_8_R2 - parent + static_version jar + compile + true mc.alk vp-v1_8_R3 - parent + static_version jar + compile + true mc.alk vp-v1_9_R1 - parent + static_version jar + compile + true mc.alk vp-v1_9_R2 - parent + static_version jar + compile + true mc.alk vp-v1_10_R1 - parent + static_version jar + compile + true mc.alk vp-v1_11_R1 - parent + static_version jar + compile + true mc.alk vp-v1_12_R1 - parent + static_version jar + compile + true junit @@ -188,12 +266,6 @@ test - - - rainbowcraft-repo - scp://rainbowcraft.sytes.net/var/www/maven/repository - - VirtualPlayers2 ./target @@ -216,32 +288,24 @@ - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.2 - - false - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - org.apache.maven.plugins maven-compiler-plugin - 3.1 + 3.8.0 - 1.6 - 1.6 + ${maven.compiler.source} + ${maven.compiler.target} mc/alk/virtualplayers/nms/** mc/alk/virtualplayers/api/** + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + org.apache.maven.plugins maven-javadoc-plugin @@ -253,44 +317,61 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.1 package - shade - false + + mc.euro:Version + + + mc.alk:BattleBukkitLib + + + mc.alk:VirtualPlayersAPI + mc.alk:vp-* + + + mc.euro.version + mc.alk.virtualplayers.alib.version + + + mc.euro.bukkitinterface + mc.alk.arena.alib.bukkitinterface + + + mc.alk.battlebukkitlib + mc.alk.virtualplayers.alib.battlebukkitlib + + + - maven-antrun-plugin + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 - - - - - - + false - - - package - - run - - - + + + rainbowcraft-repo + scp://rainbowcraft.sytes.net/var/www/maven/repository + + diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java deleted file mode 100644 index 98e57cf..0000000 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualPlayer/VirtualPlayers.java +++ /dev/null @@ -1,143 +0,0 @@ -package mc.alk.virtualPlayer; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import mc.alk.virtualplayers.api.VirtualPlayer; - -import org.bukkit.entity.Player; - -/** - * This class maps the old package to the new package.

- *
- * old package: mc.alk.virtualPlayer;
- * new package: mc.alk.virtualplayers;
- * 
- * So that old plugins don't have to update to the new package structure.
- * 
- * The primary reason for the change is that several of these methods 
- * contained version dependent code. So they needed to be put into a 
- * versioned package structure.
- * 
- * @author Nikolai - * @deprecated scheduled for removal in v2.0 - */ -public class VirtualPlayers { - - /** - * Used by mc.alk.arena.util.ServerUtil. - * @param pname - * @return - * @deprecated - */ - @Deprecated - public static Player getPlayer(String pname) - { - return mc.alk.virtualplayers.VirtualPlayers.getPlayer(pname); - } - - @Deprecated - public static Player getPlayer(UUID id) - { - return mc.alk.virtualplayers.VirtualPlayers.getPlayer(id); - } - - @Deprecated - public static Player getPlayerExact(String pname) - { - return mc.alk.virtualplayers.VirtualPlayers.getPlayerExact(pname); - } - - @Deprecated - public static Player getOrMakePlayer(String pname) - { - return mc.alk.virtualplayers.VirtualPlayers.getOrMakePlayer(pname); - } - - @Deprecated - public static Player[] getOnlinePlayers() - { - return mc.alk.virtualplayers.VirtualPlayers.getOnlinePlayers(); - } - - @Deprecated - public static Player makeVirtualPlayer() throws Exception { - return makeVirtualPlayer(null); - } - - @Deprecated - public static synchronized Player makeVirtualPlayer(String name) throws Exception - { - return mc.alk.virtualplayers.VirtualPlayers.makeVirtualPlayer(name); - } - - /** - * Object parameter needs to be changed to a VirtualPlayer interface. - * @param vp Pass in an instance of VirtualPlayer. - * @return - */ - @Deprecated - public static void deleteVirtualPlayer(Object obj) - { - if (obj instanceof VirtualPlayer) { - VirtualPlayer vp = (VirtualPlayer) obj; - mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(vp); - } else if (obj instanceof String) { - String name = (String) obj; - mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(name); - } - } - - @Deprecated - public static void deleteVirtualPlayer(String name) - { - mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(name); - } - - @Deprecated - public static void deleteVirtualPlayer(VirtualPlayer vp) - { - mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayer(vp); - } - - @Deprecated - public static void deleteVirtualPlayers() - { - mc.alk.virtualplayers.VirtualPlayers.deleteVirtualPlayers(); - } - - /** - * Moved to mc.alk.virtualplayers.VirtualPlayers:getPlayerList(). - * @return
 {@literal List } 
- */ - @Deprecated - public static List getPlayerList() { - return (List) mc.alk.virtualplayers.VirtualPlayers.getPlayerList(); - } - - @Deprecated - public static Object getOrCreate(String name) { - return mc.alk.virtualplayers.VirtualPlayers.getOrCreate(name); - } - - /** - * Moved to mc.alk.virtualplayers.VirtualPlayers:getVps(). - * @return
 {@literal Map } 
- * @deprecated - */ - @Deprecated - public static Map getVps() { - return (Map) mc.alk.virtualplayers.VirtualPlayers.getVps(); - } - - /** - * Moved to mc.alk.virtualplayers.VirtualPlayers:getNames(). - * @return
 {@literal Map } 
- * @deprecated - */ - @Deprecated - public static Map getNames() { - return (Map) mc.alk.virtualplayers.VirtualPlayers.getNames(); - } -} diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java index 8b46e33..86c8fd4 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -9,19 +9,19 @@ import mc.alk.virtualplayers.api.VirtualPlayer; import mc.alk.virtualplayers.api.VirtualPlayerFactory; -import mc.alk.virtualplayers.battlelib.bukkit.BukkitInterface; -import mc.alk.virtualplayers.battlelib.version.VersionFactory; +import mc.alk.virtualplayers.api.VirtualPlayersAPI; import mc.alk.virtualplayers.executors.PlayerExecutor; import mc.alk.virtualplayers.executors.VPBaseExecutor; import mc.alk.virtualplayers.executors.VPExecutor; import mc.alk.virtualplayers.listeners.VirtualPlayerListener; +import mc.euro.bukkitinterface.BukkitInterface; +import mc.euro.version.VersionFactory; -import org.apache.commons.lang.ArrayUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -public class VirtualPlayers extends JavaPlugin { +public class VirtualPlayers extends JavaPlugin implements VirtualPlayersAPI { private static final String NMS = VersionFactory.getNmsPackage(); @@ -56,25 +56,62 @@ private boolean isServerCompatible() { } } + @Override + public Collection getOnlinePlayers() { + List players = new ArrayList<>(); + VirtualPlayerFactory.getVirtualPlayers().stream().filter((p) -> (p.isOnline())).forEachOrdered((p) -> { + players.add(p); + }); + players.addAll(BukkitInterface.getOnlinePlayers()); + return players; + } + + @Override + public Player[] getOnlinePlayersArray() { + return getOnlinePlayers().toArray(new Player[0]); + } + + @Override + public Collection getVirtualPlayers() { + return VirtualPlayerFactory.getVirtualPlayers(); + } + + @Override + public List getVirtualPlayersList() { + return VirtualPlayerFactory.getNewPlayerList(); + } + + @Override + public void setGlobalMessages(boolean visibility) { + VirtualPlayerFactory.getVirtualPlayers().forEach((vp) -> { + vp.setShowMessages(visibility); + }); + } + + @Override public void setPlayerMessages(boolean visibility) { - for (VirtualPlayer vp : getVirtualPlayers()) { + getVirtualPlayers().forEach((vp) -> { vp.setShowMessages(visibility); - } + }); } + @Override public void setEventMessages(boolean visibility) { VPBaseExecutor.setEventMessages(visibility); } - public static Map getVps() { + @Override + public Map getVps() { return VirtualPlayerFactory.getVps(); } - public static Map getNames() { + @Override + public Map getNames() { return VirtualPlayerFactory.getNames(); } - public static Player getPlayer(String pname) { + @Override + public Player getPlayer(String pname) { Player vp = Bukkit.getPlayer(pname); if (vp == null) { vp = getNames().get(pname); @@ -82,7 +119,8 @@ public static Player getPlayer(String pname) { return vp; } - public static Player getPlayer(UUID id) { + @Override + public Player getPlayer(UUID id) { Player vp = Bukkit.getPlayer(id); if (vp == null) { vp = getVps().get(id); @@ -90,7 +128,8 @@ public static Player getPlayer(UUID id) { return vp; } - public static Player getPlayerExact(String pname) { + @Override + public Player getPlayerExact(String pname) { Player vp = Bukkit.getPlayerExact(pname); if (vp == null) { vp = getNames().get(pname); @@ -98,54 +137,8 @@ public static Player getPlayerExact(String pname) { return vp; } - /** - * Calls getNewPlayerList() : i.e. Makes a copy. - * - * @return A new list, or copy. - */ - public static List getPlayerList() { - return getNewPlayerList(); - } - - /** - * @since v2.0 : This is getPlayerList() renamed to reflect that it's a - * copy. - * @return A new list, or copy. - */ - public static List getNewPlayerList() { - return VirtualPlayerFactory.getNewPlayerList(); - } - - public static Collection getVirtualPlayers() { - return VirtualPlayerFactory.getVirtualPlayers(); - } - - /** - * Returns all online players, including api.VirtualPlayers.

- *
-     * VirtualPlayers.getOnlinePlayers() :
-     * Using this method has an added bonus: It is backwards compatible.
-     * v1.7.9 - Bukkit.getOnlinePlayers - returns Player[]
-     * v1.7.10 - Bukkit.getOnlinePlayers - returns {@code Collection }
-     * It doesn't matter what the return type for Bukkit.getOnlinePlayers() is,
-     * this method will work.
-     * 
- * - * @return an Array of bukkit.entity.Player + api.VirtualPlayer. - */ - public static Player[] getOnlinePlayers() { - List players = new ArrayList(); - for (Player p : VirtualPlayerFactory.getVirtualPlayers()) { - if (p.isOnline()) { - players.add(p); - } - } - Player[] ps = players.toArray(new Player[players.size()]); - Player[] bps = BukkitInterface.getOnlinePlayers().toArray(new Player[0]); - return (Player[]) ArrayUtils.addAll(ps, bps); - } - - public static Player getOrMakePlayer(String pname) { + @Override + public Player getOrMakePlayer(String pname) { Player vp = Bukkit.getPlayer(pname); if (vp == null) { vp = getNames().get(pname); @@ -160,7 +153,8 @@ public static Player getOrMakePlayer(String pname) { return vp; } - public static VirtualPlayer getOrCreate(String name) { + @Override + public VirtualPlayer getOrCreate(String name) { Player vp = VirtualPlayerFactory.getNames().get(name); if (vp == null) { try { @@ -172,41 +166,32 @@ public static VirtualPlayer getOrCreate(String name) { return (VirtualPlayer) vp; } - public static Player makeVirtualPlayer() throws Exception { + @Override + public Player makeVirtualPlayer() throws Exception { return makeVirtualPlayer(null); } - public static synchronized Player makeVirtualPlayer(String name) throws Exception { + @Override + public synchronized Player makeVirtualPlayer(String name) throws Exception { return factory.makeVirtualPlayer(name); } - /** - * @since v2.0 - * @param name - */ - public static void deleteVirtualPlayer(String name) { + @Override + public void deleteVirtualPlayer(String name) { VirtualPlayer vp = getNames().get(name); deleteVirtualPlayer(vp); } - /** - * @since v2.0 : return value changed from Player to void. - * @param vp - */ - public static void deleteVirtualPlayer(VirtualPlayer vp) { + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { factory.deleteVirtualPlayer(vp); } - public static void deleteVirtualPlayers() { - for (VirtualPlayer vp : getNewPlayerList()) { + @Override + public void deleteVirtualPlayers() { + getVirtualPlayers().forEach((vp) -> { factory.deleteVirtualPlayer(vp); - } - } - - public static void setGlobalMessages(boolean visibility) { - for (VirtualPlayer vp : VirtualPlayerFactory.getVirtualPlayers()) { - vp.setShowMessages(visibility); - } + }); } } diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java index 7afb97f..f8154a0 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java @@ -19,7 +19,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -import mc.alk.virtualplayers.VirtualPlayers; +import mc.alk.virtualplayers.api.Vps; import mc.alk.virtualplayers.util.InventoryUtil; import org.apache.commons.lang.StringUtils; @@ -802,11 +802,11 @@ public static Player findPlayer(String name) { if (foundPlayer != null) { return foundPlayer; } - foundPlayer = VirtualPlayers.getPlayer(name); + foundPlayer = Vps.getApi().getPlayer(name); if (foundPlayer != null) { return foundPlayer; } - Player[] online = VirtualPlayers.getOnlinePlayers(); + Player[] online = Vps.getApi().getOnlinePlayersArray(); for (Player player : online) { String playerName = player.getName(); diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java index f5cd1d3..07f7577 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java @@ -2,16 +2,19 @@ import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import mc.alk.virtualplayers.VirtualPlayers; import mc.alk.virtualplayers.api.VirtualPlayer; -import mc.alk.virtualplayers.battlelib.DamageUtil; +import mc.alk.virtualplayers.api.Vps; +import mc.alk.battlebukkitlib.DamageUtil; import mc.alk.virtualplayers.util.InventoryUtil; import mc.alk.virtualplayers.util.Util; @@ -28,6 +31,9 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; @@ -42,6 +48,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -57,17 +64,17 @@ * @author alkarin */ public class PlayerExecutor extends VPBaseExecutor { - + public PlayerExecutor() { super(Bukkit.getPluginManager().getPlugin("VirtualPlayers"), 1); super.useAlias = 0; } - + public PlayerExecutor(Plugin p) { super(p, 1); super.useAlias = 0; } - + @MCCommand(op = true) public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args) { String command = StringUtils.join(args, " "); @@ -181,6 +188,23 @@ public boolean examine(CommandSender sender, VirtualPlayer vp, Location l) { } return true; } + + @MCCommand(cmds = {"movetome", "movehere"}, op = true) + public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { + if (!(sender instanceof Player)) { + sendMessage(sender, "You must be a player to use this!"); + return false; + } + Player player = (Player) sender; + sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); + vp.moveTo(player.getLocation()); + return true; + } + + @MCCommand(cmds = {"tphere"}, op = true) + public boolean teleportPlayer(Player sender, VirtualPlayer vp) { + return teleportPlayer(sender, vp, sender.getLocation()); + } @MCCommand(cmds = {"tp", "teleport"}, op = true) public boolean teleportPlayer(CommandSender sender, VirtualPlayer vp, Location l) { @@ -205,12 +229,11 @@ public boolean setGameMode(CommandSender sender, VirtualPlayer vp, GameMode gm) @MCCommand(cmds = {"chat"}, op = true) public boolean chatEvent(CommandSender sender, final VirtualPlayer vp, String... args) { final String msg = Util.colorChat(StringUtils.join(args, " ")); - final Set players = new HashSet( - Arrays.asList(VirtualPlayers.getOnlinePlayers())); + final Set players = new HashSet<>(Vps.getApi().getOnlinePlayers()); System.out.println("sender = " + sender.getName()); System.out.println("vp = " + vp.getName()); - System.out.println("args = " + args.toString()); + System.out.println("args = " + Arrays.toString(args)); System.out.println("players = " + players.toString()); Runnable r = new Runnable() { @Override @@ -232,6 +255,136 @@ public boolean playerRespawn(CommandSender sender, VirtualPlayer vp) { vp.respawn(w.getSpawnLocation()); return sendMessage(sender, "&6" + vp.getName() + "&2 respawned!"); } + + /** + * Used to test vp.getNearbyEntities() + */ + @MCCommand(cmds = {"getNearby", "getNearbyEntities"}, op = true) + public boolean getNearbyEntities(CommandSender sender, VirtualPlayer vp) { + return getNearbyEntities(sender, vp, 15); + } + + /** + * This is a preview of the PIE cmd (PlayerPickupItemEvent). + * + * vp.getNearbyEntities() does not give the same results as + * sender.getNearbyEntities() when they both have the same location. + * + * sender.getNearbyEntities() works. + * vp.getNearbyEntities() does NOT work. + * vp.getNearbyEntities() always returns an empty List. + */ + @MCCommand(cmds = {"getNearby", "getNearbyEntities"}, op = true) + public boolean getNearbyEntities(CommandSender sender, VirtualPlayer vp, Integer radius) { + List eList = vp.getNearbyEntities(radius, radius, radius); // broken + Collection entities = Util.getNearbyEntities(vp, radius); + sender.sendMessage("--------------------------"); + sender.sendMessage("Util.getNearbyEntities(vp)"); + sender.sendMessage("VirtualPlayer " + vp.getName() + " has found " + entities.size() + " nearby entities (Util)."); + for (Entity e : entities) { + sender.sendMessage(" - " + e.getType().name() ); + } + if (sender instanceof Player) { + Player player = (Player) sender; + entities = player.getNearbyEntities(radius, radius, radius); + sender.sendMessage("There are " + entities.size() + " entities near the CommandSender."); + for (Entity e : entities) { + sender.sendMessage(" - " + e.getType().name() ); + } + } + sender.sendMessage("--------------------------"); + sender.sendMessage("vp.getNearbyEntities()"); + sender.sendMessage("VirtualPlayer " + vp.getName() + " has found " + eList.size() + " nearby entities (vp)."); + for (Entity e : entities) { + sender.sendMessage(" - " + e.getType().name() ); + } + if (sender instanceof Player) { + Player player = (Player) sender; + entities = player.getNearbyEntities(radius, radius, radius); + sender.sendMessage("There are " + entities.size() + " entities near the CommandSender."); + for (Entity e : entities) { + sender.sendMessage(" - " + e.getType().name() ); + } + } + sender.sendMessage("--------------------------"); + return true; + } + + /** + * These methods do not return the same results:. + *
+     * - vp.getLocation().getChunk().getEntities()
+     * - vp.getNearbyEntities()
+     * 
+     * When conditions are the same, and when the same results are expected.
+     * 
+ * + * vp.getLocation().getChunk().getEntities() works. + * vp.getNearbyEntities() does NOT work. + * vp.getNearbyEntities() always returns an empty List. + */ + @MCCommand(cmds = {"getChunk", "getChunkEntities"}, op = true) + public boolean getChunkEntities(CommandSender sender, VirtualPlayer vp) { + Entity[] entities = vp.getLocation().getChunk().getEntities(); + sender.sendMessage("VirtualPlayer " + vp.getName() + " has found " + entities.length + " entities in the chunk."); + for (int x = 0; x < entities.length; x++) { + Entity e = entities[x]; + if (e instanceof Player) { + Player p = (Player) e; + sender.sendMessage(" - " + p.getName() ); + } else { + sender.sendMessage(" - " + entities[x].getType().name() ); + } + } + return true; + } + + @MCCommand(cmds = {"pie", "pickupItems", "PickupItemEvent"}, op = true) + public boolean pickupItemEvent(CommandSender sender, VirtualPlayer vp) { + return pickupItemEvent(sender, vp, 16); + } + + @MCCommand(cmds = {"pie", "pickupItems", "PickupItemEvent"}, op = true) + public boolean pickupItemEvent(CommandSender sender, VirtualPlayer vp, Integer radius) { + PlayerPickupItemEvent pie; + Location loc = vp.getLocation(); + Collection entities = Util.getNearbyEntities(vp, radius); + List items = new ArrayList(); + for (Entity entity : entities) { + if (entity.getType() == EntityType.DROPPED_ITEM) { + Item item = null; + try { + item = (Item) entity; + } catch (ClassCastException ex) { + continue; + } + items.add(item); + sender.sendMessage("new PlayerPickupItemEvent queued for " + item.getItemStack().getType().name()); + } + } + int total = 0; + for (int i = 0; i < items.size(); i = i + 1) { + int numItemsOnGround = items.size() - (i + 1); + pie = new PlayerPickupItemEvent(vp, items.get(i), numItemsOnGround); + Bukkit.getPluginManager().callEvent(pie); + if (pie.isCancelled()) { + sendMessage(sender, "&cPlayerPickupItemEvent cancelled for &a" + items.get(i).getItemStack().getType().name()); + } else { + Map excess = vp.getInventory().addItem(items.get(i).getItemStack()); + if (excess.isEmpty()) { + items.get(i).remove(); // remove the item from the ground + total = total + 1; + } + } + } + if (items.isEmpty()) { + String locationXYZ = "x=" + loc.getBlockX() + " y=" + loc.getBlockY() + " z=" + loc.getBlockZ(); + sendMessage(sender, "&cThere were no items to pickup at that location: &e" + locationXYZ); + return false; + } + sendMessage(sender, "&6" + vp.getName() + " &2picked up a total of " + total + " item stacks."); + return true; + } @MCCommand(cmds = {"bpe", "BlockPlaceEvent"}, op = true) public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material mat, Location loc) { @@ -434,16 +587,4 @@ public void run() { sendMessage(sender, vp, msg); return true; } - - @MCCommand(cmds = {"movetome"}, op = true) - public boolean moveVirtualPlayerToMe(CommandSender sender, VirtualPlayer vp) { - if (!(sender instanceof Player)) { - sendMessage(sender, "You must be a player to use this!"); - return false; - } - Player player = (Player) sender; - sendMessage(player, "&6" + vp.getName() + " is now trying to come to you!"); - vp.moveTo(player.getLocation()); - return true; - } } diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java index e707497..2a61256 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java @@ -8,6 +8,7 @@ import mc.alk.virtualplayers.VirtualPlayers; import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.Vps; import mc.alk.virtualplayers.util.Util; import org.bukkit.command.Command; @@ -48,12 +49,12 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command } private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { - Player p = VirtualPlayers.getPlayerExact(name); + Player p = Vps.getApi().getPlayerExact(name); if (p == null) { if (name.contains("-")) { /// return range return getVps(name); } - p = VirtualPlayers.getOrCreate(name); + p = Vps.getApi().getOrCreate(name); } if (!(p instanceof VirtualPlayer)) { throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); @@ -109,10 +110,10 @@ private List getVps(String names) { Integer start = Integer.valueOf(split[1]); Integer end = Integer.valueOf(split[2]); for (int i = start; i <= end; i++) { - players.add(VirtualPlayers.getOrCreate(name + i)); + players.add(Vps.getApi().getOrCreate(name + i)); } } else { - players.add(VirtualPlayers.getOrCreate(name)); + players.add(Vps.getApi().getOrCreate(name)); } return players; } diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java index d3e65aa..65d0653 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java @@ -1,11 +1,13 @@ package mc.alk.virtualplayers.executors; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import mc.alk.virtualplayers.VirtualPlayers; import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.Vps; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -29,7 +31,7 @@ public VPExecutor(Plugin plugin) { @MCCommand(cmds = {"ap", "addPlayers"}, op = true) public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Exception { for (int i = 0; i < numPlayers; i++) { - final VirtualPlayer p1 = (VirtualPlayer) VirtualPlayers.makeVirtualPlayer(); + final VirtualPlayer p1 = (VirtualPlayer) Vps.getApi().makeVirtualPlayer(); sendMessage(sender, "Added Player " + p1.getName()); } return true; @@ -37,13 +39,13 @@ public boolean addPlayer(CommandSender sender, Integer numPlayers) throws Except @MCCommand(cmds = {"removeAll"}, op = true) public boolean removeAll(CommandSender sender) { - VirtualPlayers.deleteVirtualPlayers(); + Vps.getApi().deleteVirtualPlayers(); return sendMessage(sender, "&2Removed all VirtualPlayers"); } @MCCommand(cmds = {"listPlayers"}, op = true) public void listVirtualPlayers(CommandSender sender) { - List players = VirtualPlayers.getPlayerList(); + List players = Vps.getApi().getVirtualPlayersList(); sender.sendMessage("VirtualPlayers count=" + players.size()); Collections.sort(players, new Comparator() { @@ -52,9 +54,9 @@ public int compare(VirtualPlayer o1, VirtualPlayer o2) { return o1.getName().compareTo(o2.getName()); } }); - for (VirtualPlayer vp : players) { + players.forEach((vp) -> { sendMessage(sender, vp.getName() + " : " + vp); - } + }); } @MCCommand(cmds = {"showMessages"}, op = true) @@ -69,7 +71,7 @@ public boolean hideMessages(CommandSender sender) { @MCCommand(cmds = {"setMessages"}, op = true) public static void setPlayerMessages(boolean visibility) { - VirtualPlayers.setGlobalMessages(visibility); + Vps.getApi().setGlobalMessages(visibility); } @MCCommand(cmds = {"setEventMessages"}, op = true) diff --git a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java index fe317db..2a4f9aa 100644 --- a/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/listeners/VirtualPlayerListener.java @@ -1,7 +1,7 @@ package mc.alk.virtualplayers.listeners; -import mc.alk.virtualplayers.VirtualPlayers; import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.Vps; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -21,7 +21,7 @@ public class VirtualPlayerListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerRespawnBegin(PlayerRespawnEvent event) { Player p = event.getPlayer(); - if (VirtualPlayers.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { + if (Vps.getApi().getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { p.setHealth(20); p.setLastDamageCause(null); ((VirtualPlayer) p).setOnline(true); @@ -31,7 +31,7 @@ public void onPlayerRespawnBegin(PlayerRespawnEvent event) { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerRespawnEnd(PlayerRespawnEvent event) { Player p = event.getPlayer(); - if (VirtualPlayers.getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { + if (Vps.getApi().getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { final Location l = event.getRespawnLocation(); ((VirtualPlayer) p).teleport(l, true); } @@ -39,7 +39,7 @@ public void onPlayerRespawnEnd(PlayerRespawnEvent event) { @EventHandler public void onAsyncChatEvent(AsyncPlayerChatEvent event) { - if (!VirtualPlayers.getVps().containsKey(event.getPlayer().getUniqueId())) { + if (!Vps.getApi().getVps().containsKey(event.getPlayer().getUniqueId())) { return; } // For some reason we do need to actually send the messages from diff --git a/modules/api/pom.xml b/modules/api/pom.xml index 73b3bbb..87591ea 100644 --- a/modules/api/pom.xml +++ b/modules/api/pom.xml @@ -1,36 +1,56 @@ 4.0.0 - - mc.alk - vp-parent - parent - ../../ - mc.alk - vp-api - parent + VirtualPlayersAPI + 1.0 jar - - virtualplayers-api - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - + VirtualPlayersAPI + https://github.com/BattlePlugins/VirtualPlayers/ + yyyy_MM_dd UTF-8 + none + 1.8 + 1.8 - + + + rainbowcraft-repo + http://rainbowcraft.sytes.net/maven/repository/ + + + spigot-public + https://hub.spigotmc.org/nexus/content/repositories/public/ + + + bukkit-public + https://repo.md-5.net/content/repositories/public/ + + org.bukkit bukkit - 1.7.10-R0.1-SNAPSHOT + 1.7.10-R0.1 + jar provided + + mc.euro + Version + 4.0.1 + jar + compile + false + mc.alk BattleBukkitLib - 2.4.1 + 4.1.0 + jar compile + false junit @@ -40,46 +60,46 @@ - VirtualPlayers-API + VirtualPlayersAPI ./target ./src/main/java org.apache.maven.plugins maven-compiler-plugin - 3.1 + 3.8.0 - 1.6 - 1.6 + 1.8 + 1.8 org.apache.maven.plugins - maven-shade-plugin - 2.3 - - - package - - shade - - - false - - - mc.alk:BattleBukkitLib - - - - - mc.alk.util - mc.alk.virtualplayers.battlelib - - - - - + maven-jar-plugin + 2.4 + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + *.metrics + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + false + + + + rainbowcraft-repo + scp://rainbowcraft.sytes.net/var/www/maven/repository + + diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java index ab64f67..a97f717 100644 --- a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java +++ b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayerFactory.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.UUID; -import mc.alk.util.version.VersionFactory; // BattleBukkitLib +import mc.euro.version.VersionFactory; import org.bukkit.entity.Player; diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayersAPI.java b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayersAPI.java new file mode 100644 index 0000000..e62345a --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/api/VirtualPlayersAPI.java @@ -0,0 +1,137 @@ +package mc.alk.virtualplayers.api; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import mc.euro.bukkitinterface.BukkitInterface; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +/** + * + * @author Nikolai + */ +public interface VirtualPlayersAPI { + + /** + * Returns all online players, including api.VirtualPlayers.

+ *
+     * VirtualPlayers.getOnlinePlayers() :
+     * Using this method has an added bonus: It is backwards compatible.
+     * v1.7.9 - Bukkit.getOnlinePlayers - returns Player[]
+     * v1.7.10 - Bukkit.getOnlinePlayers - returns {@code Collection }
+     * It doesn't matter what the return type for Bukkit.getOnlinePlayers() is,
+     * this method will work.
+     * 
+ * + * @return an Array of bukkit.entity.Player + api.VirtualPlayer. + */ + public default Collection getOnlinePlayers() { + List players = new ArrayList<>(); + VirtualPlayerFactory.getVirtualPlayers().stream().filter((p) -> (p.isOnline())).forEachOrdered((p) -> { + players.add(p); + }); + players.addAll(BukkitInterface.getOnlinePlayers()); + return players; + }; + + public Player makeVirtualPlayer(String name) throws Exception; + public void setEventMessages(boolean visibility); + public void deleteVirtualPlayer(VirtualPlayer vp); + public void deleteVirtualPlayers(); + + public default void setGlobalMessages(boolean visibility) { + VirtualPlayerFactory.getVirtualPlayers().forEach((vp) -> { + vp.setShowMessages(visibility); + }); + } + + public default Player[] getOnlinePlayersArray() { + return getOnlinePlayers().toArray(new Player[0]); + }; + + public default Collection getVirtualPlayers() { + return VirtualPlayerFactory.getVirtualPlayers(); + }; + + public default List getVirtualPlayersList() { + return VirtualPlayerFactory.getNewPlayerList(); + } + + public default void setPlayerMessages(boolean visibility) { + getVirtualPlayers().forEach((vp) -> { + vp.setShowMessages(visibility); + }); + } + + public default Map getVps() { + return VirtualPlayerFactory.getVps(); + } + + public default Map getNames() { + return VirtualPlayerFactory.getNames(); + } + + public default Player getPlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = getNames().get(pname); + } + return vp; + } + + public default Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) { + vp = getVps().get(id); + } + return vp; + } + + public default Player getPlayerExact(String pname) { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) { + vp = getNames().get(pname); + } + return vp; + } + + public default Player getOrMakePlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = getNames().get(pname); + } + if (vp == null) { + try { + return makeVirtualPlayer(pname); + } catch (Exception e) { + e.printStackTrace(); + } + } + return vp; + } + + public default VirtualPlayer getOrCreate(String name) { + Player vp = VirtualPlayerFactory.getNames().get(name); + if (vp == null) { + try { + vp = makeVirtualPlayer(name); + } catch (Exception e) { + e.printStackTrace(); + } + } + return (VirtualPlayer) vp; + } + + public default Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + public default void deleteVirtualPlayer(String name) { + VirtualPlayer vp = getNames().get(name); + deleteVirtualPlayer(vp); + } + +} diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/api/Vps.java b/modules/api/src/main/java/mc/alk/virtualplayers/api/Vps.java new file mode 100644 index 0000000..b10d567 --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/api/Vps.java @@ -0,0 +1,15 @@ +package mc.alk.virtualplayers.api; + +import org.bukkit.Bukkit; + +/** + * + * @author Nikolai + */ +public abstract class Vps { + + public static VirtualPlayersAPI getApi() { + return (VirtualPlayersAPI)Bukkit.getPluginManager().getPlugin("VirtualPlayers"); + } + +} diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java b/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java index 2709870..e83b371 100644 --- a/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java +++ b/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -6,8 +6,6 @@ import java.util.Map; import java.util.logging.Logger; -import mc.alk.virtualplayers.api.VirtualPlayer; - import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -60,7 +58,7 @@ public String toString() { return (e != null ? e.getName() : "null") + ":" + lvl; } } - + private static Map initArmor() { Map temp = new HashMap(); // or EnumMap temp.put(Material.WOOL, new Armor(ArmorType.HELM, ArmorLevel.WOOL)); @@ -177,7 +175,7 @@ public static Enchantment getEnchantmentByCommonName(String iname) { } return null; } - + public static int arrowCount(Player p) { return getItemAmount(p.getInventory().getContents(), new ItemStack( Material.ARROW, 1)); @@ -240,7 +238,6 @@ public static ArmorLevel hasArmorSet(List inv) { // default : return null; // } // } - public static int getItemAmount(ItemStack[] items, ItemStack is) { int count = 0; for (ItemStack item : items) { @@ -530,7 +527,7 @@ public static boolean isItem(String str) { // System.out.println("string = " + str); str = str.replaceAll("[}{]", ""); str = str.replaceAll("=", " "); - + debug("item=" + str); ItemStack is = null; @@ -555,9 +552,9 @@ public static boolean isItem(String str) { public static ItemStack parseItem(String str) throws Exception { str = str.replaceAll("[}{]", ""); str = str.replaceAll("=", " "); - + debug("item=" + str); - + ItemStack is = null; try { String split[] = str.split(" "); @@ -711,7 +708,7 @@ public static boolean sameMaterial(ArmorLevel lvl, ItemStack is) { public static ItemStack getWool(int color) { return new ItemStack(Material.WOOL, 1, (short) color); } - + private static void debug(String output) { if (DEBUG) { System.out.println(output); diff --git a/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java b/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java index 0c0e81a..e818cc8 100644 --- a/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java +++ b/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java @@ -1,12 +1,16 @@ package mc.alk.virtualplayers.util; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import mc.alk.virtualplayers.api.VirtualPlayer; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; /** @@ -67,4 +71,37 @@ public static boolean addListener(VPMessageListener listener) { public static boolean removeListener(VPMessageListener listener) { return listeners.remove(listener); } + + /** + * Uses the location, chunk, & distance calculations.

+ * + * @param vp + * @param radius + * @return + */ + public static Collection getNearbyEntities(VirtualPlayer vp, int radius) { + Map emap = new HashMap(); + int numChunks = (int) Math.floor(radius / 16) + 1; + int blocks = numChunks * 16; + int diameter = blocks * 2; + Location start = vp.getLocation().clone().subtract(blocks, 0, blocks); + // Location end = start.clone().add(diameter, 0, diameter); + + for (int dx = 0 ; dx <= diameter ; dx = dx + 16) { + for (int dz = 0 ; dz <= diameter ; dz = dz +16) { + Entity[] entities = start.clone().add(dx, 0, dz).getChunk().getEntities(); + for (Entity entity : entities) { + int entityID = entity.getEntityId(); + if (!emap.containsKey(entityID) ) { + double distance = vp.getLocation().distance(entity.getLocation()); + if (distance <= radius) { + emap.put(entityID, entity); + } + } + } + } + } + + return emap.values(); + } } diff --git a/modules/v1_10_R1/pom.xml b/modules/v1_10_R1/pom.xml index 4913663..f45b5ae 100644 --- a/modules/v1_10_R1/pom.xml +++ b/modules/v1_10_R1/pom.xml @@ -3,45 +3,38 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_10_R1 - parent + static_version jar - virtualplayers-v1_10_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.10.2-R0.1 provided org.bukkit craftbukkit - 1.10-R0.1 + 1.10.2-R0.1 provided mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java index abd89a1..335da52 100644 --- a/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java +++ b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java @@ -347,19 +347,4 @@ public void _INVALID_setMaxHealth(int max) { setMaxHealth(max); } - @Override - public Egg throwEgg() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Snowball throwSnowball() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Arrow shootArrow() { - throw new UnsupportedOperationException("Not supported yet."); - } - } diff --git a/modules/v1_11_R1/pom.xml b/modules/v1_11_R1/pom.xml index e367a3e..1fa6bcc 100644 --- a/modules/v1_11_R1/pom.xml +++ b/modules/v1_11_R1/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_11_R1 - parent + static_version jar - virtualplayers-v1_11_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.11.2-R0.1 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java index 0f10f1a..95e2a65 100644 --- a/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java +++ b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java @@ -348,19 +348,4 @@ public void _INVALID_setMaxHealth(int max) { setMaxHealth(max); } - @Override - public Egg throwEgg() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Snowball throwSnowball() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Arrow shootArrow() { - throw new UnsupportedOperationException("Not supported yet."); - } - } diff --git a/modules/v1_12_R1/pom.xml b/modules/v1_12_R1/pom.xml index 616b02e..72e8cbb 100644 --- a/modules/v1_12_R1/pom.xml +++ b/modules/v1_12_R1/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_12_R1 - parent + static_version jar - virtualplayers-v1_12_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.12.2-R0.1 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java index ee0354e..c5f7415 100644 --- a/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java +++ b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java @@ -310,79 +310,4 @@ public void setShowMessages(boolean visibility) { showMessages = visibility; } - @Override - public int _INVALID_getLastDamage() { - return NumberConversions.ceil(getLastDamage()); - } - - @Override - public void _INVALID_setLastDamage(int damage) { - setLastDamage(damage); - } - - @Override - public void _INVALID_damage(int amount) { - damage(amount); - } - - @Override - public void _INVALID_damage(int amount, Entity source) { - damage(amount, source); - } - - @Override - public int _INVALID_getHealth() { - return NumberConversions.ceil(getHealth()); - } - - @Override - public void _INVALID_setHealth(int hp) { - setHealth(hp); - } - - @Override - public int _INVALID_getMaxHealth() { - return NumberConversions.ceil(getMaxHealth()); - } - - @Override - public void _INVALID_setMaxHealth(int max) { - setMaxHealth(max); - } - - @Override - public Egg throwEgg() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Snowball throwSnowball() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Arrow shootArrow() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public List getLineOfSight(HashSet hs, int i) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Block getTargetBlock(HashSet hs, int i) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public List getLastTwoTargetBlocks(HashSet hs, int i) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void setBanned(boolean bln) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - } diff --git a/modules/v1_2_5/pom.xml b/modules/v1_2_5/pom.xml index 05df6cf..5d4277c 100644 --- a/modules/v1_2_5/pom.xml +++ b/modules/v1_2_5/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_2_5 - parent + static_version jar - virtualplayers-v1_2_5 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_3_2/pom.xml b/modules/v1_3_2/pom.xml index e2326fa..80de8ba 100644 --- a/modules/v1_3_2/pom.xml +++ b/modules/v1_3_2/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_3_2 - parent + static_version jar - virtualplayers-v1_3_2 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_4_2/pom.xml b/modules/v1_4_2/pom.xml index 17ae731..d1cbab0 100644 --- a/modules/v1_4_2/pom.xml +++ b/modules/v1_4_2/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_4_2 - parent + static_version jar - virtualplayers-v1_4_2 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml index 1108f1c..c5415c3 100644 --- a/modules/v1_4_5/pom.xml +++ b/modules/v1_4_5/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_4_5 - parent + static_version jar - virtualplayers-v1_4_5 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_4_6/pom.xml b/modules/v1_4_6/pom.xml index 4ee05ff..0feb380 100644 --- a/modules/v1_4_6/pom.xml +++ b/modules/v1_4_6/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_4_6 - parent + static_version jar - virtualplayers-v1_4_6 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_4_R1/pom.xml b/modules/v1_4_R1/pom.xml index 86dc8a1..62c3e14 100644 --- a/modules/v1_4_R1/pom.xml +++ b/modules/v1_4_R1/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_4_R1 - parent + static_version jar - virtualplayers-v1_4_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_5_R1/pom.xml b/modules/v1_5_R1/pom.xml index 731d8bb..a707777 100644 --- a/modules/v1_5_R1/pom.xml +++ b/modules/v1_5_R1/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_5_R1 - parent + static_version jar - virtualplayers-v1_5_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.5-R0.1-SNAPSHOT + 1.5.0-R0.1 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_5_R2/pom.xml b/modules/v1_5_R2/pom.xml index 6ec72d5..3b11992 100644 --- a/modules/v1_5_R2/pom.xml +++ b/modules/v1_5_R2/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_5_R2 - parent + static_version jar - virtualplayers-v1_5_R2 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_5_R3/pom.xml b/modules/v1_5_R3/pom.xml index 7a2e527..078b30e 100644 --- a/modules/v1_5_R3/pom.xml +++ b/modules/v1_5_R3/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_5_R3 - parent + static_version jar - virtualplayers-v1_5_R3 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_6_R1/pom.xml b/modules/v1_6_R1/pom.xml index 0bfdf26..4e1001e 100644 --- a/modules/v1_6_R1/pom.xml +++ b/modules/v1_6_R1/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_6_R1 - parent + static_version jar - virtualplayers-v1_6_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.6.1-R0.1-SNAPSHOT + 1.6.1-R0.1 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_6_R2/pom.xml b/modules/v1_6_R2/pom.xml index f8e5ee8..0494619 100644 --- a/modules/v1_6_R2/pom.xml +++ b/modules/v1_6_R2/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_6_R2 - parent + static_version jar - virtualplayers-v1_6_R2 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_6_R3/pom.xml b/modules/v1_6_R3/pom.xml index 0b30770..0bb208c 100644 --- a/modules/v1_6_R3/pom.xml +++ b/modules/v1_6_R3/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_6_R3 - parent + static_version jar - virtualplayers-v1_6_R3 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_7_R1/pom.xml b/modules/v1_7_R1/pom.xml index 2f75518..9718c85 100644 --- a/modules/v1_7_R1/pom.xml +++ b/modules/v1_7_R1/pom.xml @@ -3,22 +3,15 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_7_R1 - parent + static_version jar - virtualplayers-v1_7_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_7_R2/pom.xml b/modules/v1_7_R2/pom.xml index 74c454b..415f42a 100644 --- a/modules/v1_7_R2/pom.xml +++ b/modules/v1_7_R2/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_7_R2 - parent + static_version jar - virtualplayers-v1_7_R2 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.5-R0.1-SNAPSHOT + 1.7.5-R0.1 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_7_R3/pom.xml b/modules/v1_7_R3/pom.xml index a0d5b95..54bdca9 100644 --- a/modules/v1_7_R3/pom.xml +++ b/modules/v1_7_R3/pom.xml @@ -3,33 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_7_R3 - parent + static_version jar - virtualplayers-v1_7_R3 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - - - mc.alk - vp-api - parent - true - org.bukkit bukkit - 1.7.5-R0.1-SNAPSHOT + 1.7.5-R0.1 provided @@ -38,10 +25,16 @@ 1.7.9-R0.1 provided + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_7_R4/pom.xml b/modules/v1_7_R4/pom.xml index 045645c..02db99b 100644 --- a/modules/v1_7_R4/pom.xml +++ b/modules/v1_7_R4/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_7_R4 - parent + static_version jar - virtualplayers-v1_7_R4 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.7.9-R0.3 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_8_R1/pom.xml b/modules/v1_8_R1/pom.xml index 45b434a..902d51d 100644 --- a/modules/v1_8_R1/pom.xml +++ b/modules/v1_8_R1/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_8_R1 - parent + static_version jar - virtualplayers-v1_8_R1 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.7.9-R0.3 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java index 0d25cbf..27c0a35 100644 --- a/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java @@ -2,7 +2,9 @@ import com.mojang.authlib.GameProfile; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import mc.alk.virtualplayers.api.VirtualPlayer; import mc.alk.virtualplayers.util.Util; @@ -61,6 +63,16 @@ public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { this.location = this.getLocation(); } + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_8_R1.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + @Override public InventoryView openInventory(Inventory inv) { return null; diff --git a/modules/v1_8_R2/pom.xml b/modules/v1_8_R2/pom.xml index e3f958f..638a53b 100644 --- a/modules/v1_8_R2/pom.xml +++ b/modules/v1_8_R2/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_8_R2 - parent + static_version jar - virtualplayers-v1_8_R2 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.7.9-R0.3 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - diff --git a/modules/v1_8_R3/pom.xml b/modules/v1_8_R3/pom.xml index d8e3ab2..0784aea 100644 --- a/modules/v1_8_R3/pom.xml +++ b/modules/v1_8_R3/pom.xml @@ -3,27 +3,20 @@ 4.0.0 mc.alk - vp-parent - parent + vp-parent-pom + static_version ../../ mc.alk vp-v1_8_R3 - parent + static_version jar - virtualplayers-v1_8_R3 - http://dev.bukkit.org/bukkit-plugins/virtualplayers/ - - - UTF-8 - - org.bukkit bukkit - 1.7.9-R0.3-SNAPSHOT + 1.7.9-R0.3 provided @@ -34,14 +27,14 @@ mc.alk - vp-api - parent + VirtualPlayersAPI + jar + ${virtualplayers.api.version} true junit junit - 3.8.1 test @@ -53,11 +46,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - modules/api @@ -45,12 +49,12 @@ http://rainbowcraft.sytes.net/maven/repository/
- md_5-repo - https://repo.md-5.net/content/groups/public + spigot-public + https://hub.spigotmc.org/nexus/content/repositories/public/ - md_5-snapshots - http://repo.md-5.net/content/repositories/snapshots/ + bukkit-public + https://repo.md-5.net/content/repositories/public/ sk89q-repo @@ -60,29 +64,58 @@ vault-repo http://nexus.hc.to/content/repositories/pub_releases/ + + dmulloy2-repo + http://repo.dmulloy2.net/nexus/repository/public/ + kitteh-repo http://repo.kitteh.org/content/repositories/public/
- - - junit - junit - 3.8.1 - test - - + + + + junit + junit + 3.8.1 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + true + + + + org.apache.maven.plugins maven-deploy-plugin - 2.7 - - true - + + + rainbowcraft-repo + scp://rainbowcraft.sytes.net/var/www/maven/repository + + From 38b741fcd2520d8af33479e72f5d12ac76325b7d Mon Sep 17 00:00:00 2001 From: Europia79 Date: Thu, 21 Mar 2019 21:14:10 -0500 Subject: [PATCH 74/74] VirtualPlayers 1.13.2 Added: - modules/v1_13_R1 - modules/v1_13_R2 --- modules/VirtualPlayers/pom.xml | 47 ++- modules/api/pom.xml | 7 + modules/v1_13_R1/pom.xml | 51 +++ .../nms/v1_13_R1/CraftVirtualPlayer.java | 306 ++++++++++++++++ .../v1_13_R1/CraftVirtualPlayerFactory.java | 65 ++++ modules/v1_13_R2/pom.xml | 51 +++ .../nms/v1_13_R2/CraftVirtualPlayer.java | 336 ++++++++++++++++++ .../v1_13_R2/CraftVirtualPlayerFactory.java | 72 ++++ pom.xml | 2 + 9 files changed, 925 insertions(+), 12 deletions(-) create mode 100644 modules/v1_13_R1/pom.xml create mode 100644 modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayer.java create mode 100644 modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayerFactory.java create mode 100644 modules/v1_13_R2/pom.xml create mode 100644 modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayer.java create mode 100644 modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayerFactory.java diff --git a/modules/VirtualPlayers/pom.xml b/modules/VirtualPlayers/pom.xml index 6d88fb3..62d497b 100644 --- a/modules/VirtualPlayers/pom.xml +++ b/modules/VirtualPlayers/pom.xml @@ -3,7 +3,7 @@ 4.0.0 mc.alk VirtualPlayers - 1.7.5 + 1.13.2 jar VirtualPlayers http://dev.bukkit.org/bukkit-plugins/virtualplayers2/ @@ -51,6 +51,13 @@ compile true
+ + mc.euro + BukkitAdapter + 1.0-SNAPSHOT + compile + true + mc.alk BattleBukkitLib @@ -259,6 +266,22 @@ compile true + + mc.alk + vp-v1_13_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_13_R2 + static_version + jar + compile + true + junit junit @@ -317,7 +340,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.1 + 2.3 package @@ -328,32 +351,32 @@ mc.euro:Version - - + mc.euro:BukkitInterface + mc.euro:BukkitAdapter mc.alk:BattleBukkitLib - - mc.alk:VirtualPlayersAPI - - mc.alk:vp-* mc.euro.version - mc.alk.virtualplayers.alib.version + mc.alk.virtualplayers.zlib.version mc.euro.bukkitinterface - mc.alk.arena.alib.bukkitinterface + mc.alk.virtualplayers.zlib.bukkitinterface + + + mc.euro.bukkitadapter + mc.alk.virtualplayers.zlib.bukkitadapter mc.alk.battlebukkitlib - mc.alk.virtualplayers.alib.battlebukkitlib + mc.alk.virtualplayers.zlib.battlebukkitlib - + false diff --git a/modules/api/pom.xml b/modules/api/pom.xml index 87591ea..9f5c0c0 100644 --- a/modules/api/pom.xml +++ b/modules/api/pom.xml @@ -63,6 +63,13 @@ VirtualPlayersAPI ./target ./src/main/java + + + org.apache.maven.wagon + wagon-ssh + 2.10 + + org.apache.maven.plugins diff --git a/modules/v1_13_R1/pom.xml b/modules/v1_13_R1/pom.xml new file mode 100644 index 0000000..3ef976f --- /dev/null +++ b/modules/v1_13_R1/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_13_R1 + static_version + jar + virtualplayers-v1_13_R1 + + + org.bukkit + bukkit + 1.13.0-R0.1 + provided + + + org.bukkit + craftbukkit + 1.13.0-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + diff --git a/modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayer.java b/modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayer.java new file mode 100644 index 0000000..313722f --- /dev/null +++ b/modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayer.java @@ -0,0 +1,306 @@ +package mc.alk.virtualplayers.nms.v1_13_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_13_R1.EntityPlayer; +import net.minecraft.server.v1_13_R1.EnumMoveType; +import net.minecraft.server.v1_13_R1.MinecraftServer; +import net.minecraft.server.v1_13_R1.PlayerInteractManager; +import net.minecraft.server.v1_13_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_13_R1.CraftServer; +import org.bukkit.craftbukkit.v1_13_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_13_R1.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_13_R1.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(EnumMoveType.SELF, loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + +} diff --git a/modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayerFactory.java b/modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..db0174d --- /dev/null +++ b/modules/v1_13_R1/src/main/java/mc/alk/virtualplayers/nms/v1_13_R1/CraftVirtualPlayerFactory.java @@ -0,0 +1,65 @@ +package mc.alk.virtualplayers.nms.v1_13_R1; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_13_R1.MinecraftServer; +import net.minecraft.server.v1_13_R1.PlayerInteractManager; +import net.minecraft.server.v1_13_R1.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_13_R1.CraftServer; +import org.bukkit.craftbukkit.v1_13_R1.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + WorldServer worldServer = mcserver.getWorldServer(0); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/modules/v1_13_R2/pom.xml b/modules/v1_13_R2/pom.xml new file mode 100644 index 0000000..cd5aa9e --- /dev/null +++ b/modules/v1_13_R2/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_13_R2 + static_version + jar + virtualplayers-v1_13_R2 + + + org.bukkit + bukkit + 1.13.2-R0.1 + provided + + + org.bukkit + craftbukkit + 1.13.2-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + diff --git a/modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayer.java b/modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayer.java new file mode 100644 index 0000000..5157a3c --- /dev/null +++ b/modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayer.java @@ -0,0 +1,336 @@ +package mc.alk.virtualplayers.nms.v1_13_R2; + +import com.mojang.authlib.GameProfile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_13_R2.BlockPosition; +import net.minecraft.server.v1_13_R2.EntityPlayer; +import net.minecraft.server.v1_13_R2.EnumMoveType; +import net.minecraft.server.v1_13_R2.MinecraftServer; +import net.minecraft.server.v1_13_R2.PacketPlayOutBlockChange; +import net.minecraft.server.v1_13_R2.PlayerInteractManager; +import net.minecraft.server.v1_13_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_13_R2.CraftServer; +import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_13_R2.scoreboard.CraftScoreboard; +import org.bukkit.craftbukkit.v1_13_R2.util.CraftMagicNumbers; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Scoreboard; + +public class CraftVirtualPlayer extends CraftPlayer implements VirtualPlayer { + + Player keepInformed; // / who to send the messages to + boolean online = true; + double health = 20; + boolean isop = true; + boolean showMessages = true; + boolean showTeleports = true; + GameMode gamemode = GameMode.SURVIVAL; + Location location; + CraftScoreboard scoreboard; + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim, Location loc) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = loc; + } + + public CraftVirtualPlayer(CraftServer cserver, MinecraftServer mcserver, WorldServer worldServer, + GameProfile gameProfile, PlayerInteractManager pim) { + super(cserver, new EntityPlayer(mcserver, worldServer, gameProfile, pim)); + this.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = this.getLocation(); + } + + @Override + public List getNearbyEntities(double x, double y, double z) { + List notchEntityList = this.entity.world.getEntities(this.entity, this.entity.getBoundingBox().grow(x, y, z)); + List bukkitEntityList = new ArrayList(notchEntityList.size()); + for (net.minecraft.server.v1_13_R2.Entity e : notchEntityList) { + bukkitEntityList.add(e.getBukkitEntity()); + } + return bukkitEntityList; + } + + @Override + public InventoryView openInventory(Inventory inv) { + return null; + } + + @Override + public boolean addPotionEffect(PotionEffect effect) { + return false; + } + + @Override + public boolean addPotionEffect(PotionEffect effect, boolean force) { + return false; + } + + @Override + public boolean addPotionEffects(Collection effects) { + return false; + } + + @Override + public void removePotionEffect(PotionEffectType effect) { + /// do nothing + } + + @Override + public void closeInventory() { + /// do nothing + } + + @Override + public void updateInventory() { + /// Do nothing + } + + @Override + public void setGameMode(GameMode gamemode) { + try { + super.setGameMode(gamemode); + } catch (Exception e) { + /* say nothing*/ + } + this.gamemode = gamemode; + } + + @Override + public GameMode getGameMode() { + return gamemode; + } + + @Override + public double getHealth() { + return health; + } + + @Override + public void setHealth(double h) { + if (h < 0) { + h = 0; + } + this.health = h; + try { + super.setHealth(h); + } catch (Exception e) { + } + try { + this.getHandle().setHealth((float) h); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean isDead() { + return super.isDead() || health <= 0; + } + + @Override + public void sendMessage(String s) { + if (showMessages) { + Util.sendMessage(this, (!isOnline() ? "&4(Offline)&b" : "") + + getName() + " gettingMessage= " + s); + } + } + + @Override + public void moveTo(Location loc) { + entity.move(EnumMoveType.SELF, loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public boolean teleport(Location l, boolean respawn) { + if (isDead()) { + return false; + } + try { + boolean changedWorlds = !this.location.getWorld().getName() + .equals(l.getWorld().getName()); + final String teleporting = respawn ? "respawning" : "teleporting"; + if (showTeleports && showMessages) { + String fromWorld = ""; + String toWorld = ""; + if (changedWorlds) { + fromWorld = "&5" + location.getWorld().getName() + "&4,"; + toWorld = "&5" + l.getWorld().getName() + "&4,"; + } + Util.sendMessage(this, getName() + "&e " + teleporting + " from &4" + + fromWorld + Util.getLocString(location) + " &e-> &4" + toWorld + + Util.getLocString(l)); + } + this.location = l.clone(); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + l.getWorld()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + cserver.getPluginManager().callEvent(pcwe); + /// For some reason, world doesnt get changed, so lets explicitly set it + this.entity.world = ((CraftWorld) location.getWorld()).getHandle(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + @Override + public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { + if (isDead()) { + return false; + } + super.teleport(location, cause); + teleport(location, false); + return true; + } + + @Override + public boolean teleport(Location l) { + return teleport(l, PlayerTeleportEvent.TeleportCause.UNKNOWN); + } + + @Override + public void respawn(Location loc) { + this.health = 20; + boolean changedWorlds = !this.location.getWorld().getName() + .equals(loc.getWorld().getName()); + CraftServer cserver = (CraftServer) Bukkit.getServer(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, loc, + false); + cserver.getPluginManager().callEvent(respawnEvent); + if (changedWorlds) { + PlayerChangedWorldEvent pcwe = new PlayerChangedWorldEvent(this, + loc.getWorld()); + cserver.getPluginManager().callEvent(pcwe); + } + } + + @Override + public Location getLocation() { + return location; + } + + @Override + public boolean isOnline() { + return online; + } + + @Override + public void setOnline(boolean b) { + if (showMessages) { + Util.sendMessage(this, getName() + " is " + + (b ? "connecting" : "disconnecting")); + } + online = b; + } + + @Override + public boolean isOp() { + return isop; + } + + @Override + public void setOp(boolean b) { + isop = b; + } + + @Override + public String toString() { + String world = "&5" + this.location.getWorld().getName() + ","; + return getName() + "&e h=&2" + getHealth() + "&e o=&5" + isOnline() + + "&e d=&7" + isDead() + "&e loc=&4" + world + "&4" + + Util.getLocString(location) + "&e gm=&8" + getGameMode(); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) { + Object s = null; + this.scoreboard = (CraftScoreboard) scoreboard; + if (scoreboard != null) { + if (Bukkit.getScoreboardManager().getMainScoreboard() != null + && scoreboard.equals(Bukkit.getScoreboardManager().getMainScoreboard())) { + s = "BukkitMainScoreboard"; + } else if (scoreboard.getObjective(DisplaySlot.SIDEBAR) != null) { + s = scoreboard.getObjective(DisplaySlot.SIDEBAR).getName(); + } else if (scoreboard.getObjective(DisplaySlot.PLAYER_LIST) != null) { + s = scoreboard.getObjective(DisplaySlot.PLAYER_LIST).getName(); + } + } + if (showMessages) { + Util.sendMessage(this, getName() + " setting scoreboard " + s); + } + } + + @Override + public CraftScoreboard getScoreboard() { + return this.scoreboard; + } + + public void setLocation(Location l) { + location = l; + } + + @Override + public Player getInformed() { + return keepInformed; + } + + @Override + public void setShowMessages(boolean visibility) { + showMessages = visibility; + } + + // @Override + public void sendBlockChange(Location loc, String block, byte data) { + if (this.getHandle().playerConnection == null) { + return; + } + PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld)loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + Material material = Material.getMaterial(block); + packet.block = CraftMagicNumbers.getBlock(material, data); + this.getHandle().playerConnection.sendPacket(packet); + } + + @Override + public boolean sleep(Location loc, boolean b) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void wakeup(boolean b) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Location getBedLocation() { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayerFactory.java b/modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayerFactory.java new file mode 100644 index 0000000..6fbad00 --- /dev/null +++ b/modules/v1_13_R2/src/main/java/mc/alk/virtualplayers/nms/v1_13_R2/CraftVirtualPlayerFactory.java @@ -0,0 +1,72 @@ +package mc.alk.virtualplayers.nms.v1_13_R2; + +import com.mojang.authlib.GameProfile; + +import java.util.List; +import java.util.UUID; + +import mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +import mc.alk.virtualplayers.util.Util; + +import net.minecraft.server.v1_13_R2.DimensionManager; +import net.minecraft.server.v1_13_R2.MinecraftServer; +import net.minecraft.server.v1_13_R2.PlayerInteractManager; +import net.minecraft.server.v1_13_R2.WorldServer; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_13_R2.CraftServer; +import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; + +/** + * Make, track, & delete VirtualPlayers. + */ +public class CraftVirtualPlayerFactory extends VirtualPlayerFactory { + + @Override + public VirtualPlayer makeVirtualPlayer(String name) throws Exception { + CraftVirtualPlayer cvp = newCraftVirtualPlayer(name); + VirtualPlayer vp = (VirtualPlayer) cvp; + vps.put(vp.getUniqueId(), vp); + names.put(vp.getName(), vp); + return vp; + } + + private CraftVirtualPlayer newCraftVirtualPlayer(String name) throws Exception { + CraftServer cserver = (CraftServer) Bukkit.getServer(); + List worlds = cserver.getWorlds(); + if (worlds == null || worlds.isEmpty()) { + throw new Exception("There must be at least one world"); + } + CraftWorld w = (CraftWorld) worlds.get(0); + Location location = new Location(w, 0, 0, 0); + MinecraftServer mcserver = cserver.getServer(); + DimensionManager dm = DimensionManager.OVERWORLD; + WorldServer worldServer = mcserver.getWorldServer(dm); + PlayerInteractManager pim = new PlayerInteractManager(worldServer); + if (name == null) { + name = "p" + (vps.size() + 1); + } + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.colorChat(name)); + CraftVirtualPlayer cvp = new CraftVirtualPlayer(cserver, mcserver, worldServer, gameProfile, pim, location); + return cvp; + } + + @Override + public void deleteVirtualPlayer(String name) { + deleteVirtualPlayer(names.get(name)); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + CraftVirtualPlayer cvp = (CraftVirtualPlayer) vp; + WorldServer world = ((CraftWorld) cvp.getLocation().getWorld()).getHandle(); + world.removeEntity(cvp.getHandle()); + cvp.remove(); + vps.remove(cvp.getUniqueId()); + names.remove(cvp.getName()); + } + +} diff --git a/pom.xml b/pom.xml index 4b91a24..770b483 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,8 @@ modules/v1_10_R1 modules/v1_11_R1 modules/v1_12_R1 + modules/v1_13_R1 + modules/v1_13_R2 modules/VirtualPlayers