diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea2ab13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +#Maven +/**/target/ + +#Eclipse +.project +.classpath +.settings diff --git a/README.md b/README.md new file mode 100644 index 0000000..92b22b0 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +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. + + +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 maven repository." +"These builds have not been approved by the BukkitDev staff. Use them at your own risk." +``` + +[http://rainbowcraft.sytes.net/download/plugins/VirtualPlayers2/](http://rainbowcraft.sytes.net/download/plugins/VirtualPlayers2/ "Dev builds") + +The dev builds are primarily for testing purposes. + + +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 | +|`/dc pie | Trigger a PlayerPickupItemEvent | + + +Other Commands +--- + +|command|description| +|:------|:----------| +|`/virtualplayers hideMessages` | hide messages from players | +|`/virtualplayers showMessages` | show messages from players | + + +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 +- **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 + * Breaks the BlockPlaceEvent cmd: `/dc bpe ` +- **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 ` + + +Contact: +====== + + +* [Europia79](http://dev.bukkit.org/profiles/Europia79 "Europia79 on dev.bukkit.org") + +* Skype: Nicodemis79 + +* Email: Europia79@hotmail.com + 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/pom.xml b/VirtualPlayers/pom.xml deleted file mode 100644 index 1911897..0000000 --- a/VirtualPlayers/pom.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - 4.0.0 - mc.alk - VirtualPlayers - jar - 1.5.8 - 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.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/* - - - - - - - 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/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 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 deleted file mode 100644 index fbebdfd..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_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)); - } - - @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(), 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/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 new file mode 100644 index 0000000..62d497b --- /dev/null +++ b/modules/VirtualPlayers/pom.xml @@ -0,0 +1,400 @@ + + 4.0.0 + mc.alk + VirtualPlayers + 1.13.2 + jar + VirtualPlayers + http://dev.bukkit.org/bukkit-plugins/virtualplayers2/ + + 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 + provided + + + mc.euro + Version + 4.0.1 + jar + compile + true + + + mc.euro + BukkitInterface + 4.0.1 + jar + compile + true + + + mc.euro + BukkitAdapter + 1.0-SNAPSHOT + compile + true + + + mc.alk + BattleBukkitLib + 4.1.0 + jar + compile + true + + + mc.alk + VirtualPlayersAPI + 1.0 + jar + compile + true + + + mc.alk + vp-v1_2_5 + static_version + jar + compile + true + + + mc.alk + vp-v1_3_2 + static_version + jar + compile + true + + + mc.alk + vp-v1_4_2 + static_version + jar + compile + true + + + mc.alk + vp-v1_4_5 + static_version + jar + compile + true + + + mc.alk + vp-v1_4_6 + static_version + jar + compile + true + + + mc.alk + vp-v1_4_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_5_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_5_R2 + static_version + jar + compile + true + + + mc.alk + vp-v1_5_R3 + static_version + jar + compile + true + + + mc.alk + vp-v1_6_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_6_R2 + static_version + jar + compile + true + + + mc.alk + vp-v1_6_R3 + static_version + jar + compile + true + + + mc.alk + vp-v1_7_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_7_R2 + static_version + jar + compile + true + + + mc.alk + vp-v1_7_R3 + static_version + jar + compile + true + + + mc.alk + vp-v1_7_R4 + static_version + jar + compile + true + + + mc.alk + vp-v1_8_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_8_R2 + static_version + jar + compile + true + + + mc.alk + vp-v1_8_R3 + static_version + jar + compile + true + + + mc.alk + vp-v1_9_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_9_R2 + static_version + jar + compile + true + + + mc.alk + vp-v1_10_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_11_R1 + static_version + jar + compile + true + + + mc.alk + vp-v1_12_R1 + static_version + jar + 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 + 3.8.1 + test + + + + VirtualPlayers2 + ./target + ./src/main/java + + + org.apache.maven.wagon + wagon-ssh + 2.10 + + + + + . + true + ./src/main/java + + *.yml + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${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 + 2.8.1 + + *.metrics + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + + + mc.euro:Version + mc.euro:BukkitInterface + mc.euro:BukkitAdapter + mc.alk:BattleBukkitLib + mc.alk:VirtualPlayersAPI + mc.alk:vp-* + + + + + mc.euro.version + mc.alk.virtualplayers.zlib.version + + + mc.euro.bukkitinterface + mc.alk.virtualplayers.zlib.bukkitinterface + + + mc.euro.bukkitadapter + mc.alk.virtualplayers.zlib.bukkitadapter + + + mc.alk.battlebukkitlib + mc.alk.virtualplayers.zlib.battlebukkitlib + + + false + + + + + + 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/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..86c8fd4 --- /dev/null +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/VirtualPlayers.java @@ -0,0 +1,197 @@ +package mc.alk.virtualplayers; + +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 mc.alk.virtualplayers.api.VirtualPlayer; +import mc.alk.virtualplayers.api.VirtualPlayerFactory; +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.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +public class VirtualPlayers extends JavaPlugin implements VirtualPlayersAPI { + + private static final String NMS = VersionFactory.getNmsPackage(); + + static final VirtualPlayerFactory factory = VirtualPlayerFactory.newInstance(); + + @Override + public void onEnable() { + if (!isServerCompatible()) { + Bukkit.getServer().getPluginManager().disablePlugin(this); + return; + } + Bukkit.getPluginManager().registerEvents(new VirtualPlayerListener(), this); + getCommand("vdc").setExecutor(new PlayerExecutor(this)); + getCommand("virtualplayers").setExecutor(new VPExecutor(this)); + } + + @Override + 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; + } + } + + @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) { + getVirtualPlayers().forEach((vp) -> { + vp.setShowMessages(visibility); + }); + } + + @Override + public void setEventMessages(boolean visibility) { + VPBaseExecutor.setEventMessages(visibility); + } + + @Override + public Map getVps() { + return VirtualPlayerFactory.getVps(); + } + + @Override + public Map getNames() { + return VirtualPlayerFactory.getNames(); + } + + @Override + public Player getPlayer(String pname) { + Player vp = Bukkit.getPlayer(pname); + if (vp == null) { + vp = getNames().get(pname); + } + return vp; + } + + @Override + public Player getPlayer(UUID id) { + Player vp = Bukkit.getPlayer(id); + if (vp == null) { + vp = getVps().get(id); + } + return vp; + } + + @Override + public Player getPlayerExact(String pname) { + Player vp = Bukkit.getPlayerExact(pname); + if (vp == null) { + vp = getNames().get(pname); + } + return vp; + } + + @Override + public 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; + } + + @Override + public 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; + } + + @Override + public Player makeVirtualPlayer() throws Exception { + return makeVirtualPlayer(null); + } + + @Override + public synchronized Player makeVirtualPlayer(String name) throws Exception { + return factory.makeVirtualPlayer(name); + } + + @Override + public void deleteVirtualPlayer(String name) { + VirtualPlayer vp = getNames().get(name); + deleteVirtualPlayer(vp); + } + + @Override + public void deleteVirtualPlayer(VirtualPlayer vp) { + factory.deleteVirtualPlayer(vp); + } + + @Override + public void deleteVirtualPlayers() { + getVirtualPlayers().forEach((vp) -> { + factory.deleteVirtualPlayer(vp); + }); + } + +} diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java similarity index 59% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java rename to modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java index 5b62f26..f8154a0 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/CustomCommandExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/CustomCommandExecutor.java @@ -1,21 +1,4 @@ -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; +package mc.alk.virtualplayers.executors; import java.io.File; import java.lang.annotation.Retention; @@ -36,14 +19,36 @@ import java.util.logging.Level; import java.util.logging.Logger; +import mc.alk.virtualplayers.api.Vps; +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 {}; @@ -53,38 +58,48 @@ public class CustomCommandExecutor implements CommandExecutor { /// 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>>(); + 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(){ + 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; + if (c != 0) { + return c; + } c = new Integer(cmd1.order()).compareTo(cmd2.order()); return c != 0 ? c : new Integer(cmd1.hashCode()).compareTo(cmd2.hashCode()); } @@ -94,25 +109,30 @@ public int compare(MethodWrapper mw1, MethodWrapper mw2) { /** * Custom arguments class so that we can return a modified arguments */ - protected class Arguments{ + protected class Arguments { + public Object[] args; } - class MethodWrapper{ - public MethodWrapper(Object obj, Method method){ - this.obj = obj; this.method = method; + 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(){ + + public MCCommand getCommand() { return this.method.getAnnotation(MCCommand.class); } - public float getHelpOrder(){ - return helpOrder != null ? - helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); + + public float getHelpOrder() { + return helpOrder != null + ? helpOrder : this.method.getAnnotation(MCCommand.class).helpOrder(); } } @@ -120,47 +140,48 @@ protected CustomCommandExecutor(Plugin plugin) { this(plugin, 0); } - protected CustomCommandExecutor(Plugin plugin, int commandIndex){ + 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 + * 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) { + showHelp(sender, command, null); } - protected void showHelp(CommandSender sender, Command command, String[] args){ - help(sender,command,args); + protected void showHelp(CommandSender sender, Command command, String[] args) { + help(sender, command, args); } - protected boolean validCommandSenderClass(Class clazz){ + protected boolean validCommandSenderClass(Class clazz) { return clazz != CommandSender.class || clazz != Player.class; } - public void addMethods(Object obj, Method[] methodArray){ + public void addMethods(Object obj, Method[] methodArray) { - for (Method method : methodArray){ + for (Method method : methodArray) { MCCommand mc = method.getAnnotation(MCCommand.class); - if (mc == null) + if (mc == null) { continue; + } Class types[] = method.getParameterTypes(); - if (types.length == 0 || !validCommandSenderClass(types[0])){ + 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 + 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()){ + for (String cmd : mc.cmds()) { addMethod(obj, method, mc, cmd.toLowerCase()); } } @@ -169,32 +190,32 @@ public void addMethods(Object obj, Method[] methodArray){ 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(); + 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); + 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>(); + 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(); + 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); + 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){ + if (mc.helpOrder() == Integer.MAX_VALUE) { mw.helpOrder = (float) (Integer.MAX_VALUE - usage.size()); } mthds.put(order, mw); @@ -202,9 +223,10 @@ private void addMethod(Object obj, Method method, MCCommand mc, String cmd) { } } } + private void addUsage(MethodWrapper method, MCCommand mc) { /// save the usages, for showing help messages - if (!mc.usage().isEmpty()){ + if (!mc.usage().isEmpty()) { method.usage = mc.usage(); } else { /// Generate an automatic usage string method.usage = createUsage(method.method); @@ -216,21 +238,21 @@ 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; + String thesubcmd = cmd.subCmds().length > 0 ? cmd.subCmds()[0] : null; Class types[] = method.getParameterTypes(); - if (commandIndex==0){ + if (commandIndex == 0) { str.add(thecmd); - if (thesubcmd!=null) { + if (thesubcmd != null) { str.add(thesubcmd); } } - for (int i=1;i theclass = types[i]; str.add(getUsageString(theclass)); - if (i==commandIndex) { + if (i == commandIndex) { str.add(thecmd); - if (thesubcmd!=null) { + if (thesubcmd != null) { str.add(thesubcmd); } } @@ -239,27 +261,27 @@ private String createUsage(Method method) { } protected String getUsageString(Class clazz) { - if (Player.class ==clazz){ + if (Player.class == clazz) { return ""; - } else if (OfflinePlayer.class ==clazz){ + } else if (OfflinePlayer.class == clazz) { return ""; - } else if (Location.class ==clazz){ + } else if (Location.class == clazz) { return ""; - } else if (String.class == clazz){ + } else if (String.class == clazz) { return ""; - } else if (Integer.class == clazz || int.class == clazz){ + } else if (Integer.class == clazz || int.class == clazz) { return ""; - } else if (Float.class == clazz || float.class == clazz){ + } else if (Float.class == clazz || float.class == clazz) { return ""; - } else if (Double.class == clazz || double.class == clazz){ + } else if (Double.class == clazz || double.class == clazz) { return ""; - } else if (Short.class == clazz || short.class == clazz){ + } else if (Short.class == clazz || short.class == clazz) { return ""; - } else if (Boolean.class == clazz || boolean.class == clazz){ + } else if (Boolean.class == clazz || boolean.class == clazz) { return ""; - } else if (String[].class == clazz || Object[].class == clazz){ + } else if (String[].class == clazz || Object[].class == clazz) { return "[string ...]"; - } else if (GameMode.class == clazz){ + } else if (GameMode.class == clazz) { return ""; } else if (ItemStack.class == clazz) { return ""; @@ -268,106 +290,117 @@ protected String getUsageString(Class clazz) { return " "; } - public class CommandException{ + public class CommandException { + final IllegalArgumentException err; final MethodWrapper mw; - public CommandException(IllegalArgumentException err, MethodWrapper mw){ - this.err = err; this.mw = 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; + 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); + || (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; + 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)){ + if (subcmd != null && subCmdMethods.containsKey(cmd) && subCmdMethods.get(cmd).containsKey(subcmd)) { methodmap = subCmdMethods.get(cmd).get(subcmd); - hasSubCmd=true; + hasSubCmd = true; } - if (methodmap == null && cmd != null){ /// Find our method, and verify all the annotations + 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) { + hasCmd = true; + } } - if (methodmap == null){ /// our last attempt + 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");} + 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; + List errs = null; boolean success = false; - for (MethodWrapper mwrapper : methodmap.values()){ + 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); + 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){ + 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);} + 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) + } 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)); + } + errs.add(new CommandException(e, mwrapper)); } catch (Exception e) { /// Just all around bad - logInvocationError(e, mwrapper,newArgs); + logInvocationError(e, mwrapper, newArgs); } } /// and handle all errors - if (!success && errs != null && !errs.isEmpty()){ + 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 (CommandException e : errs) { + usages.add(ChatColor.GOLD + e.mw.usage + " &c:" + e.err.getMessage()); + } + for (String msg : usages) { + sendMessage(sender, msg); } - 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); + 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("[" + 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){ + if (e.getCause() != null) { e.getCause().printStackTrace(); log.log(Level.SEVERE, null, e.getCause()); } @@ -375,53 +408,56 @@ private void logInvocationError(Exception e, MethodWrapper mwrapper, Arguments n log.log(Level.SEVERE, null, e); } + public static final String ONLY_INGAME = ChatColor.RED + "You need to be in game to use this command"; - - - 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);} + 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))) + 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"); + 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"); + 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"); + 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) + if (cmd.op() && !isOp) { throw new IllegalArgumentException("You need to be op to use this command"); + } - if (cmd.admin() && !isOp && (isPlayer && !hasAdminPerms(sender))) + 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){ + if (types[0] == Player.class && !isPlayer) { throw new IllegalArgumentException(ONLY_INGAME); } int strIndex = 0; @@ -433,45 +469,51 @@ protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSen 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){ + 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 if (Object[].class == clazz) { + objs[objIndex] = args; } else { objs[objIndex] = verifyArg(sender, clazz, command, args, strIndex, numUsedStrings); - if (objs[objIndex] == null){ + 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){ + 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) + if (i == commandIndex) { + if (hasCmd) { strIndex++; - if (hasSubCmd) + } + if (hasSubCmd) { strIndex++; + } } } /// Verify alphanumeric - if (cmd.alphanum().length > 0){ - for (int index: cmd.alphanum()){ - if (index >= args.length) + 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"); + throw new IllegalArgumentException("argument '" + args[index] + "' can only be alphanumeric with underscores"); } } } @@ -479,21 +521,23 @@ protected Arguments verifyArgs(MethodWrapper mwrapper, MCCommand cmd, CommandSen } protected Object verifySender(CommandSender sender, Class clazz) { - if (!clazz.isAssignableFrom(sender.getClass())){ - throw new IllegalArgumentException("sender must be a " + clazz.getSimpleName());} + 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) { + String[] args, int curIndex, AtomicInteger numUsedStrings) { numUsedStrings.set(0); if (Command.class == clazz) { return command; } String string = args[curIndex]; - if (string == null) + if (string == null) { throw new ArrayIndexOutOfBoundsException(); + } numUsedStrings.set(1); if (Player.class == clazz) { return verifyPlayer(string); @@ -516,15 +560,27 @@ protected Object verifyArg(CommandSender sender, Class clazz, Command command } else if (GameMode.class == clazz) { return verifyGameMode(string); } else if (ItemStack.class == clazz) { - return verifyItemStack(args,curIndex, numUsedStrings); + 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]);} + if (is == null) { + throw new IllegalArgumentException("Error parsing item " + args[curIndex]); + } numUsedStrings.set(1); return is; } @@ -536,24 +592,36 @@ private Location verifyLocation(String string) { 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]);} + 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); + 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{ + 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){ + } catch (Exception e) {/* do nothing */ + + } + if (gm == null) { throw new IllegalArgumentException("&cGamemode " + string + " not found"); } } @@ -562,59 +630,59 @@ private GameMode verifyGameMode(String string) { private OfflinePlayer verifyOfflinePlayer(String name) throws IllegalArgumentException { OfflinePlayer p = findOfflinePlayer(name); - if (p == null) - throw new IllegalArgumentException("Player " + name+" can not be found"); + 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 "); + 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."); + } 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."); + } 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."); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ChatColor.RED + (String) object + " is not a valid double."); } } - protected boolean hasAdminPerms(CommandSender sender){ + 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){ + public void help(CommandSender sender, Command command, String[] args) { Integer page = 1; - if (args != null && args.length > 1){ - try{ + 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."); + } catch (Exception e) { + sendMessage(sender, ChatColor.RED + " " + args[1] + " is not a number, showing help for page 1."); } } @@ -623,85 +691,98 @@ public void help(CommandSender sender, Command command, String[] args){ List onlyop = new ArrayList(); Set dups = new HashSet(); String theCommand = command.getName(); - if (useAlias != -1 && useAlias < command.getAliases().size()){ + if (useAlias != -1 && useAlias < command.getAliases().size()) { theCommand = command.getAliases().get(useAlias); } - for (MethodWrapper mw : usage){ - if (!dups.add(mw.method)) + 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()) + final String use = "&6/" + theCommand + " " + mw.usage; + if (cmd.op() && !sender.isOp()) { onlyop.add(use); - else if (cmd.admin() && !hasAdminPerms(sender)) + } else if (cmd.admin() && !hasAdminPerms(sender)) { continue; - else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) + } else if (!cmd.perm().isEmpty() && !sender.hasPermission(cmd.perm())) { unavailable.add(use); - else + } else { available.add(use); + } } - int npages = available.size()+unavailable.size(); - if (sender.isOp()) + 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){ + } + 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); + 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); + 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 "); + sendMessage(sender, "&eShowing page &6" + page + "/" + npages + "&6 : /cmd help "); } - int i=0; - for (String use : available){ + int i = 0; + for (String use : available) { i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page*LINES_PER_PAGE) + if (i < (page - 1) * LINES_PER_PAGE || i >= page * LINES_PER_PAGE) { continue; + } sendMessage(sender, use); } - for (String use : unavailable){ + for (String use : unavailable) { i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + if (i < (page - 1) * LINES_PER_PAGE || i >= page * LINES_PER_PAGE) { continue; - sendMessage(sender, ChatColor.RED+"[Insufficient Perms] " + use); + } + sendMessage(sender, ChatColor.RED + "[Insufficient Perms] " + use); } - if (sender.isOp()){ - for (String use : onlyop){ + if (sender.isOp()) { + for (String use : onlyop) { i++; - if (i < (page-1) *LINES_PER_PAGE || i >= page *LINES_PER_PAGE) + if (i < (page - 1) * LINES_PER_PAGE || i >= page * LINES_PER_PAGE) { continue; - sendMessage(sender, ChatColor.AQUA+"[OP only] &6"+use); + } + 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()) + 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; + 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()) + for (String msg : msgs) { + if (p instanceof Player) { + if (((Player) p).isOnline()) { p.sendMessage(colorChat(msg)); + } } else { p.sendMessage(colorChat(msg)); } @@ -709,18 +790,23 @@ public boolean sendMultilineMessage(CommandSender p, String message){ return true; } - public static String colorChat(String msg) {return msg.replace('&', (char) 167);} + public static String colorChat(String msg) { + return msg.replace('&', (char) 167); + } public static Player findPlayer(String name) { - if (name == null) + if (name == null) { return null; + } Player foundPlayer = Bukkit.getPlayer(name); if (foundPlayer != null) { - return foundPlayer;} - foundPlayer = VirtualPlayers.getPlayer(name); + return foundPlayer; + } + foundPlayer = Vps.getApi().getPlayer(name); if (foundPlayer != null) { - return foundPlayer;} - Player[] online = VirtualPlayers.getOnlinePlayers(); + return foundPlayer; + } + Player[] online = Vps.getApi().getOnlinePlayersArray(); for (Player player : online) { String playerName = player.getName(); @@ -729,9 +815,10 @@ public static Player findPlayer(String name) { foundPlayer = player; break; } - if (playerName.toLowerCase().indexOf(name.toLowerCase(),0) != -1) { + if (playerName.toLowerCase().indexOf(name.toLowerCase(), 0) != -1) { if (foundPlayer != null) { - return null;} + return null; + } foundPlayer = player; } @@ -742,19 +829,20 @@ public static Player findPlayer(String name) { public static OfflinePlayer findOfflinePlayer(String name) { OfflinePlayer p = findPlayer(name); - if (p != null){ + if (p != null) { return p; - } else{ + } 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()){ + 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/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java similarity index 62% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java rename to modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java index c8d3fd2..07f7577 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/PlayerExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/PlayerExecutor.java @@ -1,13 +1,26 @@ -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_R3.DamageSource; -import net.minecraft.server.v1_7_R3.EntityPlayer; +package mc.alk.virtualplayers.executors; + +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.api.Vps; +import mc.alk.battlebukkitlib.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; @@ -18,13 +31,16 @@ 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.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; 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; @@ -32,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; @@ -43,23 +60,20 @@ 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); + + 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) { @@ -77,8 +91,9 @@ public boolean runCommand(CommandSender sender, VirtualPlayer vp, String... args @MCCommand(cmds = {"showScoreboard"}, op = true) public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { Scoreboard sc = vp.getScoreboard(); - if (sc == null) + 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(); @@ -89,13 +104,13 @@ public boolean showScoreboard(CommandSender sender, VirtualPlayer vp) { sendMessage(sender, "&2 -- Objective &e" + o.getName() + " - " + o.getDisplayName()); for (OfflinePlayer op : ops) { Score score = o.getScore(op); - if (score == null) + if (score == null) { continue; + } sendMessage(sender, op.getName() + " : " + score.getScore()); } } return true; - } @MCCommand(cmds = {"status"}, op = true) @@ -152,14 +167,13 @@ public boolean interactEvent(CommandSender sender, VirtualPlayer vp, String lr, @MCCommand(cmds = {"sneak"}, op = true) public boolean sneak(CommandSender sender, VirtualPlayer vp, boolean sneak) { vp.setSneaking(sneak); - if (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); @@ -174,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) { @@ -198,8 +229,12 @@ 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 HashSet 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 = " + Arrays.toString(args)); + System.out.println("players = " + players.toString()); Runnable r = new Runnable() { @Override public void run() { @@ -209,7 +244,8 @@ public void run() { }; new Thread(r).start(); - sendMessage(sender, "&6" + vp.getName() + "&2 said " + msg); + String message = "" + ChatColor.GOLD + "" + vp.getName() + "" + ChatColor.GREEN + " said " + msg; + sendMessage(sender, message); return true; } @@ -219,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) { @@ -237,7 +403,7 @@ public boolean blockPlaceEvent(CommandSender sender, VirtualPlayer vp, Material } else { return sendMessage(sender, "&6" + vp.getName() + "&e placed " + mat + " on " - + old + " at &4" + Util.getLocString(loc) + + old + " at &4" + Util.getLocString(loc) ); } } @@ -282,8 +448,9 @@ public boolean printInv(CommandSender sender, VirtualPlayer vp) { ItemStack[] contents = inv.getContents(); for (int i = 0; i < contents.length; i++) { ItemStack is = contents[i]; - if (is != null && is.getType() != Material.AIR) + if (is != null && is.getType() != Material.AIR) { sendMessage(sender, "&2" + i + ":&e" + InventoryUtil.getItemString(is)); + } } } return true; @@ -292,13 +459,20 @@ public boolean printInv(CommandSender sender, VirtualPlayer vp) { @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()); + 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 { @@ -311,18 +485,22 @@ public boolean damageEvent(CommandSender sender, Player damager, Player damagee, 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); - + 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()); + DamageUtil.damageEntity(damagee, ede.getDamage()); } return sendMessage(sender, "&6" + damager.getName() + "&2 hit &6" + damagee.getName() + "&2 for &6" + damage + "&2, life=&4" @@ -349,82 +527,64 @@ public boolean playerConnect(CommandSender sender, final VirtualPlayer vp) { return playerConnection(sender, vp, true); } - @MCCommand(cmds = {"dc","disconnect"}, op = 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) - { + 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. + 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() - { + Runnable r = new Runnable() { @Override - public void run() - { - try{ + 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 + } 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(){ + plugin, new Runnable() { @Override - public void run() - { + public void run() { // Then the Login Event. Server cserver = Bukkit.getServer(); - try - { + try { PlayerLoginEvent playerLoginEvent = new PlayerLoginEvent( vp, "localhost", InetAddress .getLocalHost()); cserver.getPluginManager().callEvent( playerLoginEvent); - } catch (UnknownHostException ex){/* do nothing */} + } 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); + cserver.getPluginManager().callEvent(playerJoinEvent); } }); } }; new Thread(r).start(); - } - else - { /// Disconnecting + } 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"); + 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/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java similarity index 64% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java rename to modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java index 0fbd169..2a61256 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPBaseExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPBaseExecutor.java @@ -1,12 +1,4 @@ -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; +package mc.alk.virtualplayers.executors; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; @@ -14,13 +6,24 @@ 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.api.Vps; +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{ +public class VPBaseExecutor extends CustomCommandExecutor { + static boolean showTransitionsToPlayer = true; static boolean showEventMessages = true; - + protected VPBaseExecutor(Plugin plugin) { super(plugin); } @@ -31,28 +34,29 @@ public VPBaseExecutor(Plugin plugin, int i) { @Override protected String getUsageString(Class clazz) { - if (VirtualPlayer.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){ + 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); + Player p = Vps.getApi().getPlayerExact(name); if (p == null) { if (name.contains("-")) { /// return range - return getVps(name);} - p = VirtualPlayers.getOrCreate(name); + return getVps(name); + } + p = Vps.getApi().getOrCreate(name); } - if (!(p instanceof VirtualPlayer)){ + if (!(p instanceof VirtualPlayer)) { throw new IllegalArgumentException("Player " + name + " is not a VirtualPlayer"); } numUsedStrings.set(1); @@ -61,14 +65,14 @@ private Object verifyVirtualPlayer(String name, AtomicInteger numUsedStrings) { @SuppressWarnings("unchecked") @Override - protected Object invoke(MethodWrapper mwrapper, Arguments args) + protected Object invoke(CustomCommandExecutor.MethodWrapper mwrapper, CustomCommandExecutor.Arguments args) throws InvocationTargetException, IllegalAccessException { - if (args.args.length > 1 && args.args[1] instanceof List ) { + 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); + 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){ + for (Object vp : list) { args.args[1] = vp; ret = mwrapper.method.invoke(mwrapper.obj, args.args); } @@ -80,39 +84,41 @@ protected Object invoke(MethodWrapper mwrapper, Arguments args) @SuppressWarnings("SimplifiableIfStatement") @Override - public boolean sendMessage(CommandSender sender, String string) - { - if (string == null || !showEventMessages) return true; + 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) + 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); + } + return super.sendMessage(sender, string); } - private List getVps(String names) { String name = names; List players = new ArrayList(); - if (names.contains("-")){ + 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)); + for (int i = start; i <= end; i++) { + players.add(Vps.getApi().getOrCreate(name + i)); } } else { - players.add(VirtualPlayers.getOrCreate(name)); + players.add(Vps.getApi().getOrCreate(name)); } return players; } - public static void setShowEventMessages(boolean show) { - showEventMessages = show; + public static void setEventMessages(boolean visibility) { + showEventMessages = visibility; } } diff --git a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java similarity index 60% rename from VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java rename to modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java index 0bfdacf..65d0653 100644 --- a/VirtualPlayers/src/java/mc/alk/virtualPlayer/Executors/VPExecutor.java +++ b/modules/VirtualPlayers/src/main/java/mc/alk/virtualplayers/executors/VPExecutor.java @@ -1,28 +1,37 @@ -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; +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; +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(); + @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) Vps.getApi().makeVirtualPlayer(); sendMessage(sender, "Added Player " + p1.getName()); } return true; @@ -30,14 +39,14 @@ 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.getSelf().getPlayerList(); - sender.sendMessage("VirtualPlayers count="+players.size()); + List players = Vps.getApi().getVirtualPlayersList(); + sender.sendMessage("VirtualPlayers count=" + players.size()); Collections.sort(players, new Comparator() { @Override @@ -45,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) @@ -55,22 +64,19 @@ 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); + public static void setPlayerMessages(boolean visibility) { + Vps.getApi().setGlobalMessages(visibility); } @MCCommand(cmds = {"setEventMessages"}, op = true) - public static void setEventMessages(boolean show) { - showEventMessages = show; + 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..2a4f9aa --- /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.api.VirtualPlayer; +import mc.alk.virtualplayers.api.Vps; + +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 (Vps.getApi().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 (Vps.getApi().getVps().containsKey(p.getUniqueId()) && (p instanceof VirtualPlayer)) { + final Location l = event.getRespawnLocation(); + ((VirtualPlayer) p).teleport(l, true); + } + } + + @EventHandler + public void onAsyncChatEvent(AsyncPlayerChatEvent event) { + if (!Vps.getApi().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); + } + } + +} diff --git a/VirtualPlayers/plugin.yml b/modules/VirtualPlayers/src/main/java/plugin.yml similarity index 50% rename from VirtualPlayers/plugin.yml rename to modules/VirtualPlayers/src/main/java/plugin.yml index 651b051..c818c9b 100644 --- a/VirtualPlayers/plugin.yml +++ b/modules/VirtualPlayers/src/main/java/plugin.yml @@ -1,19 +1,16 @@ -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] - - - +name: ${project.name} +version: ${project.version} +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,vps,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/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); + } +} 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/api/pom.xml b/modules/api/pom.xml new file mode 100644 index 0000000..9f5c0c0 --- /dev/null +++ b/modules/api/pom.xml @@ -0,0 +1,112 @@ + + 4.0.0 + mc.alk + VirtualPlayersAPI + 1.0 + jar + 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 + jar + provided + + + mc.euro + Version + 4.0.1 + jar + compile + false + + + mc.alk + BattleBukkitLib + 4.1.0 + jar + compile + false + + + junit + junit + 3.8.1 + test + + + + VirtualPlayersAPI + ./target + ./src/main/java + + + org.apache.maven.wagon + wagon-ssh + 2.10 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + 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/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/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 new file mode 100644 index 0000000..e83b371 --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/util/InventoryUtil.java @@ -0,0 +1,718 @@ +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/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..e818cc8 --- /dev/null +++ b/modules/api/src/main/java/mc/alk/virtualplayers/util/Util.java @@ -0,0 +1,107 @@ +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; + +/** + * + * @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); + } + + /** + * 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 new file mode 100644 index 0000000..f45b5ae --- /dev/null +++ b/modules/v1_10_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_10_R1 + static_version + jar + virtualplayers-v1_10_R1 + + + org.bukkit + bukkit + 1.10.2-R0.1 + provided + + + org.bukkit + craftbukkit + 1.10.2-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_10_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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..335da52 --- /dev/null +++ b/modules/v1_10_R1/src/main/java/mc/alk/virtualplayers/nms/v1_10_R1/CraftVirtualPlayer.java @@ -0,0 +1,350 @@ +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); + } + +} 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()); + } + +} diff --git a/modules/v1_11_R1/pom.xml b/modules/v1_11_R1/pom.xml new file mode 100644 index 0000000..1fa6bcc --- /dev/null +++ b/modules/v1_11_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_11_R1 + static_version + jar + virtualplayers-v1_11_R1 + + + org.bukkit + bukkit + 1.11.2-R0.1 + provided + + + org.bukkit + craftbukkit + 1.11.2-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_11_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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..95e2a65 --- /dev/null +++ b/modules/v1_11_R1/src/main/java/mc/alk/virtualplayers/nms/v1_11_R1/CraftVirtualPlayer.java @@ -0,0 +1,351 @@ +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); + } + +} 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()); + } + +} diff --git a/modules/v1_12_R1/pom.xml b/modules/v1_12_R1/pom.xml new file mode 100644 index 0000000..72e8cbb --- /dev/null +++ b/modules/v1_12_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_12_R1 + static_version + jar + virtualplayers-v1_12_R1 + + + org.bukkit + bukkit + 1.12.2-R0.1 + provided + + + org.bukkit + craftbukkit + 1.12.2-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_12_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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..c5f7415 --- /dev/null +++ b/modules/v1_12_R1/src/main/java/mc/alk/virtualplayers/nms/v1_12_R1/CraftVirtualPlayer.java @@ -0,0 +1,313 @@ +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; + } + +} 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()); + } + +} 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/modules/v1_2_5/pom.xml b/modules/v1_2_5/pom.xml new file mode 100644 index 0000000..5d4277c --- /dev/null +++ b/modules/v1_2_5/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_2_5 + static_version + jar + virtualplayers-v1_2_5 + + + org.bukkit + bukkit + 1.2.5-R5.0 + provided + + + org.bukkit + craftbukkit + 1.2.5-R5.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_2_5 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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()); + } + +} diff --git a/modules/v1_3_2/pom.xml b/modules/v1_3_2/pom.xml new file mode 100644 index 0000000..80de8ba --- /dev/null +++ b/modules/v1_3_2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_3_2 + static_version + jar + virtualplayers-v1_3_2 + + + org.bukkit + bukkit + 1.3.2-R3.0 + provided + + + org.bukkit + craftbukkit + 1.3.2-R3.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_3_2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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()); + } + +} diff --git a/modules/v1_4_2/pom.xml b/modules/v1_4_2/pom.xml new file mode 100644 index 0000000..d1cbab0 --- /dev/null +++ b/modules/v1_4_2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_4_2 + static_version + jar + virtualplayers-v1_4_2 + + + org.bukkit + bukkit + 1.4.2-R0.2 + provided + + + org.bukkit + craftbukkit + 1.4.2-R0.2 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_4_2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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()); + } + +} diff --git a/modules/v1_4_5/pom.xml b/modules/v1_4_5/pom.xml new file mode 100644 index 0000000..c5415c3 --- /dev/null +++ b/modules/v1_4_5/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_4_5 + static_version + jar + virtualplayers-v1_4_5 + + + org.bukkit + bukkit + 1.4.5-R1.0 + provided + + + org.bukkit + craftbukkit + 1.4.5-R1.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_4_5 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..977cd83 --- /dev/null +++ b/modules/v1_4_5/src/main/java/mc/alk/virtualplayers/nms/v1_4_5/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_4_5; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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.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_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_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..0feb380 --- /dev/null +++ b/modules/v1_4_6/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_4_6 + static_version + jar + virtualplayers-v1_4_6 + + + org.bukkit + bukkit + 1.4.6-R0.3 + provided + + + org.bukkit + craftbukkit + 1.4.6-R0.3 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_4_6 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..60cc9b0 --- /dev/null +++ b/modules/v1_4_6/src/main/java/mc/alk/virtualplayers/nms/v1_4_6/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_4_6; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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.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 location; + + 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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.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(); + } + + 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_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_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..62c3e14 --- /dev/null +++ b/modules/v1_4_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_4_R1 + static_version + jar + virtualplayers-v1_4_R1 + + + org.bukkit + bukkit + 1.4.7-R1.0 + provided + + + org.bukkit + craftbukkit + 1.4.7-R1.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_4_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..c15853e --- /dev/null +++ b/modules/v1_4_R1/src/main/java/mc/alk/virtualplayers/nms/v1_4_R1/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_4_R1; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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.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 location; + + 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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.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(); + } + + 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_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_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..a707777 --- /dev/null +++ b/modules/v1_5_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_5_R1 + static_version + jar + virtualplayers-v1_5_R1 + + + org.bukkit + bukkit + 1.5.0-R0.1 + provided + + + org.bukkit + craftbukkit + 1.5.0-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_5_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..2b18124 --- /dev/null +++ b/modules/v1_5_R1/src/main/java/mc/alk/virtualplayers/nms/v1_5_R1/CraftVirtualPlayer.java @@ -0,0 +1,263 @@ +package mc.alk.virtualplayers.nms.v1_5_R1; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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.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 location; + + 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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.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(); + } + + 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_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_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..3b11992 --- /dev/null +++ b/modules/v1_5_R2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_5_R2 + static_version + jar + virtualplayers-v1_5_R2 + + + org.bukkit + bukkit + 1.5.1-R0.2 + provided + + + org.bukkit + craftbukkit + 1.5.1-R0.2 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_5_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..bcb1150 --- /dev/null +++ b/modules/v1_5_R2/src/main/java/mc/alk/virtualplayers/nms/v1_5_R2/CraftVirtualPlayer.java @@ -0,0 +1,291 @@ +package mc.alk.virtualplayers.nms.v1_5_R2; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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.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; + int 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 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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.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_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_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..078b30e --- /dev/null +++ b/modules/v1_5_R3/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_5_R3 + static_version + jar + virtualplayers-v1_5_R3 + + + org.bukkit + bukkit + 1.5.2-R1.0 + provided + + + org.bukkit + craftbukkit + 1.5.2-R1.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_5_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..93578ab --- /dev/null +++ b/modules/v1_5_R3/src/main/java/mc/alk/virtualplayers/nms/v1_5_R3/CraftVirtualPlayer.java @@ -0,0 +1,291 @@ +package mc.alk.virtualplayers.nms.v1_5_R3; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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.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; + int 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 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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.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_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_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..4e1001e --- /dev/null +++ b/modules/v1_6_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_6_R1 + static_version + jar + virtualplayers-v1_6_R1 + + + org.bukkit + bukkit + 1.6.1-R0.1 + provided + + + org.bukkit + craftbukkit + 1.6.1-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_6_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..7d83b0b --- /dev/null +++ b/modules/v1_6_R1/src/main/java/mc/alk/virtualplayers/nms/v1_6_R1/CraftVirtualPlayer.java @@ -0,0 +1,333 @@ +package mc.alk.virtualplayers.nms.v1_6_R1; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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) { + 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(); + } + + public void setLocation(Location l) { + location = l; + } + + @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; + } + + @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); + } + +} 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_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..0494619 --- /dev/null +++ b/modules/v1_6_R2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_6_R2 + static_version + jar + virtualplayers-v1_6_R2 + + + org.bukkit + bukkit + 1.6.2-R1.0 + provided + + + org.bukkit + craftbukkit + 1.6.2-R1.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_6_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..e66d3f6 --- /dev/null +++ b/modules/v1_6_R2/src/main/java/mc/alk/virtualplayers/nms/v1_6_R2/CraftVirtualPlayer.java @@ -0,0 +1,333 @@ +package mc.alk.virtualplayers.nms.v1_6_R2; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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) { + 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); + } + +} 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_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..0bb208c --- /dev/null +++ b/modules/v1_6_R3/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_6_R3 + static_version + jar + virtualplayers-v1_6_R3 + + + org.bukkit + bukkit + 1.6.4-R2.0 + provided + + + org.bukkit + craftbukkit + 1.6.4-R2.0 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_6_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..28c25cf --- /dev/null +++ b/modules/v1_6_R3/src/main/java/mc/alk/virtualplayers/nms/v1_6_R3/CraftVirtualPlayer.java @@ -0,0 +1,333 @@ +package mc.alk.virtualplayers.nms.v1_6_R3; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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 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.location = this.getLocation(); + } + + public CraftVirtualPlayer(CraftServer cserver, EntityPlayer ep) { + super(cserver, ep); + this.location = 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) { + 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); + } + +} 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_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..9718c85 --- /dev/null +++ b/modules/v1_7_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_7_R1 + static_version + jar + virtualplayers-v1_7_R1 + + + org.bukkit + bukkit + 1.7.2-R0.3 + provided + + + org.bukkit + craftbukkit + 1.7.2-R0.3 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_7_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..7ff885b --- /dev/null +++ b/modules/v1_7_R1/src/main/java/mc/alk/virtualplayers/nms/v1_7_R1/CraftVirtualPlayer.java @@ -0,0 +1,334 @@ +package mc.alk.virtualplayers.nms.v1_7_R1; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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 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); + } + +} 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_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..415f42a --- /dev/null +++ b/modules/v1_7_R2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_7_R2 + static_version + jar + virtualplayers-v1_7_R2 + + + org.bukkit + bukkit + 1.7.5-R0.1 + provided + + + org.bukkit + craftbukkit + 1.7.5-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_7_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..31e5f64 --- /dev/null +++ b/modules/v1_7_R2/src/main/java/mc/alk/virtualplayers/nms/v1_7_R2/CraftVirtualPlayer.java @@ -0,0 +1,334 @@ +package mc.alk.virtualplayers.nms.v1_7_R2; + +import java.util.Collection; + +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.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.Entity; +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; +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 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); + } + +} 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_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..54bdca9 --- /dev/null +++ b/modules/v1_7_R3/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_7_R3 + static_version + jar + virtualplayers-v1_7_R3 + + + org.bukkit + bukkit + 1.7.5-R0.1 + provided + + + org.bukkit + craftbukkit + 1.7.9-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_7_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..5ca1976 --- /dev/null +++ b/modules/v1_7_R3/src/main/java/mc/alk/virtualplayers/nms/v1_7_R3/CraftVirtualPlayer.java @@ -0,0 +1,334 @@ +package mc.alk.virtualplayers.nms.v1_7_R3; + +import java.util.Collection; + +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.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.Entity; +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; +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 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); + } + +} 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_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/v1_7_R4/pom.xml b/modules/v1_7_R4/pom.xml new file mode 100644 index 0000000..02db99b --- /dev/null +++ b/modules/v1_7_R4/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_7_R4 + static_version + jar + virtualplayers-v1_7_R4 + + + org.bukkit + bukkit + 1.7.9-R0.3 + provided + + + org.bukkit + craftbukkit + 1.7.10-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_7_R4 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..943772a --- /dev/null +++ b/modules/v1_7_R4/src/main/java/mc/alk/virtualplayers/nms/v1_7_R4/CraftVirtualPlayer.java @@ -0,0 +1,334 @@ +package mc.alk.virtualplayers.nms.v1_7_R4; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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 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); + } + +} 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_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/v1_8_R1/pom.xml b/modules/v1_8_R1/pom.xml new file mode 100644 index 0000000..902d51d --- /dev/null +++ b/modules/v1_8_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_8_R1 + static_version + jar + virtualplayers-v1_8_R1 + + + org.bukkit + bukkit + 1.7.9-R0.3 + provided + + + org.bukkit + craftbukkit + 1.8.0-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_8_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..27c0a35 --- /dev/null +++ b/modules/v1_8_R1/src/main/java/mc/alk/virtualplayers/nms/v1_8_R1/CraftVirtualPlayer.java @@ -0,0 +1,347 @@ +package mc.alk.virtualplayers.nms.v1_8_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_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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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_8_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); + } + +} 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/pom.xml b/modules/v1_8_R2/pom.xml new file mode 100644 index 0000000..638a53b --- /dev/null +++ b/modules/v1_8_R2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_8_R2 + static_version + jar + virtualplayers-v1_8_R2 + + + org.bukkit + bukkit + 1.7.9-R0.3 + provided + + + org.bukkit + craftbukkit + 1.8.3-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_8_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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 new file mode 100644 index 0000000..9280216 --- /dev/null +++ b/modules/v1_8_R2/src/main/java/mc/alk/virtualplayers/nms/v1_8_R2/CraftVirtualPlayer.java @@ -0,0 +1,335 @@ +package mc.alk.virtualplayers.nms.v1_8_R2; + +import com.mojang.authlib.GameProfile; + +import java.util.Collection; + +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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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 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); + } + +} 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/pom.xml b/modules/v1_8_R3/pom.xml new file mode 100644 index 0000000..0784aea --- /dev/null +++ b/modules/v1_8_R3/pom.xml @@ -0,0 +1,71 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_8_R3 + static_version + jar + virtualplayers-v1_8_R3 + + + org.bukkit + bukkit + 1.7.9-R0.3 + provided + + + org.bukkit + craftbukkit + 1.8.7-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_8_R3 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + 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 new file mode 100644 index 0000000..955d0c8 --- /dev/null +++ b/modules/v1_8_R3/src/main/java/mc/alk/virtualplayers/nms/v1_8_R3/CraftVirtualPlayer.java @@ -0,0 +1,347 @@ +package mc.alk.virtualplayers.nms.v1_8_R3; + +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_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.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +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; +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_8_R3.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); + } + +} 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/v1_9_R1/pom.xml b/modules/v1_9_R1/pom.xml new file mode 100644 index 0000000..f8f2972 --- /dev/null +++ b/modules/v1_9_R1/pom.xml @@ -0,0 +1,71 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_9_R1 + static_version + jar + virtualplayers-v1_9_R1 + + + org.bukkit + bukkit + 1.7.9-R0.3 + provided + + + org.bukkit + craftbukkit + 1.9-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_9_R1 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + 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/modules/v1_9_R2/pom.xml b/modules/v1_9_R2/pom.xml new file mode 100644 index 0000000..39d6ac8 --- /dev/null +++ b/modules/v1_9_R2/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + + mc.alk + vp-parent-pom + static_version + ../../ + + mc.alk + vp-v1_9_R2 + static_version + jar + virtualplayers-v1_9_R2 + + + org.bukkit + bukkit + 1.7.9-R0.3 + provided + + + org.bukkit + craftbukkit + 1.9.4-R0.1 + provided + + + mc.alk + VirtualPlayersAPI + jar + ${virtualplayers.api.version} + true + + + junit + junit + test + + + + VirtualPlayers-v1_9_R2 + ./target + ./src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 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()); + } + +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..770b483 --- /dev/null +++ b/pom.xml @@ -0,0 +1,123 @@ + + 4.0.0 + mc.alk + vp-parent-pom + static_version + pom + VirtualPlayers Parent POM + https://github.com/BattlePlugins/VirtualPlayers + + yyyy_MM_dd + UTF-8 + none + 1.8 + 1.8 + 1.0 + + + modules/api + modules/v1_2_5 + modules/v1_3_2 + modules/v1_4_2 + 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/v1_7_R4 + modules/v1_8_R1 + modules/v1_8_R2 + modules/v1_8_R3 + modules/v1_9_R1 + modules/v1_9_R2 + modules/v1_10_R1 + modules/v1_11_R1 + modules/v1_12_R1 + modules/v1_13_R1 + modules/v1_13_R2 + modules/VirtualPlayers + + + + 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/ + + + sk89q-repo + http://maven.sk89q.com/repo/ + + + 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 + + + + + + + + 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 + + + + + + rainbowcraft-repo + scp://rainbowcraft.sytes.net/var/www/maven/repository + + +