From 239fa82a8c344c370aaf0b91f8e2292bb7898eb2 Mon Sep 17 00:00:00 2001 From: filoghost Date: Mon, 14 Jul 2014 10:22:18 +0200 Subject: [PATCH] Update to v1.7.10 and fix /hd near command. --- HolographicDisplays/plugin.yml | 2 +- .../holograms/HolographicDisplays.java | 17 +- .../holograms/bungee/BungeeChannel.java | 3 +- .../main/HologramsCommandHandler.java | 12 +- .../commands/main/subs/MovehereCommand.java | 5 - .../commands/main/subs/NearCommand.java | 4 +- .../holograms/event/HologramMoveEvent.java | 33 ---- .../nms/v1_6_R3/EntityCustomItem.java | 14 +- .../nms/v1_7_R1/EntityCustomItem.java | 15 +- .../nms/v1_7_R2/EntityCustomItem.java | 15 +- .../nms/v1_7_R3/EntityCustomItem.java | 16 +- .../nms/v1_7_R4/CraftCustomItem.java | 40 +++++ .../nms/v1_7_R4/CraftHologramHorse.java | 64 ++++++++ .../nms/v1_7_R4/CraftHologramWitherSkull.java | 45 ++++++ .../nms/v1_7_R4/CraftTouchSlime.java | 48 ++++++ .../nms/v1_7_R4/EntityCustomItem.java | 131 +++++++++++++++ .../nms/v1_7_R4/EntityHologramHorse.java | 150 +++++++++++++++++ .../v1_7_R4/EntityHologramWitherSkull.java | 141 ++++++++++++++++ .../nms/v1_7_R4/EntityTouchSlime.java | 139 ++++++++++++++++ .../nms/v1_7_R4/FancyMessageImpl.java | 152 ++++++++++++++++++ .../holograms/nms/v1_7_R4/NmsManagerImpl.java | 128 +++++++++++++++ 21 files changed, 1108 insertions(+), 66 deletions(-) delete mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/event/HologramMoveEvent.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftCustomItem.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramHorse.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramWitherSkull.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftTouchSlime.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramHorse.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramWitherSkull.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityTouchSlime.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/FancyMessageImpl.java create mode 100644 HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/NmsManagerImpl.java diff --git a/HolographicDisplays/plugin.yml b/HolographicDisplays/plugin.yml index 9d95ef4e..b79219d9 100644 --- a/HolographicDisplays/plugin.yml +++ b/HolographicDisplays/plugin.yml @@ -1,6 +1,6 @@ name: HolographicDisplays main: com.gmail.filoghost.holograms.HolographicDisplays -version: 1.8.3 +version: 1.8.4 softdepend: [Multiverse-Core, MultiWorld, My Worlds, My_Worlds, ProtocolLib] diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java index ea0aee0b..76e39db3 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java @@ -122,7 +122,6 @@ public class HolographicDisplays extends JavaPlugin { version = null; } } - // It's simple, we don't need reflection. if ("v1_6_R3".equals(version)) { @@ -133,6 +132,8 @@ public class HolographicDisplays extends JavaPlugin { nmsManager = new com.gmail.filoghost.holograms.nms.v1_7_R2.NmsManagerImpl(); } else if ("v1_7_R3".equals(version)) { nmsManager = new com.gmail.filoghost.holograms.nms.v1_7_R3.NmsManagerImpl(); + } else if ("v1_7_R4".equals(version)) { + nmsManager = new com.gmail.filoghost.holograms.nms.v1_7_R4.NmsManagerImpl(); } else { printWarnAndDisable( "******************************************************", @@ -146,18 +147,14 @@ public class HolographicDisplays extends JavaPlugin { } try { - if (VersionUtils.isMCPC()) { - getLogger().info("Trying to enable MCPC+ support..."); - } else if (VersionUtils.isCauldron()) { - getLogger().info("Trying to enable Cauldron support..."); + if (VersionUtils.isMCPC() || VersionUtils.isCauldron()) { + getLogger().info("Trying to enable Cauldron/MCPC+ support..."); } nmsManager.registerCustomEntities(); - if (VersionUtils.isMCPC()) { - getLogger().info("Successfully added support for MCPC+!"); - } else if (VersionUtils.isCauldron()) { - getLogger().info("Successfully added support for Cauldron!"); + if (VersionUtils.isMCPC() || VersionUtils.isCauldron()) { + getLogger().info("Successfully added support for Cauldron/MCPC+!"); } } catch (Exception e) { @@ -284,7 +281,7 @@ public class HolographicDisplays extends JavaPlugin { } - String tempColor = ConfigNode.TRANSPARENCY_COLOR.getString(getConfig()).replace("&", "§"); + String tempColor = ConfigNode.TRANSPARENCY_COLOR.getString(getConfig()).replace("&", "§"); boolean foundColor = false; for (ChatColor chatColor : ChatColor.values()) { if (chatColor.toString().equals(tempColor)) { diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/bungee/BungeeChannel.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/bungee/BungeeChannel.java index 9462d9b9..faf36844 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/bungee/BungeeChannel.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/bungee/BungeeChannel.java @@ -57,8 +57,7 @@ public class BungeeChannel implements PluginMessageListener { } } catch (EOFException e) { - //TODO - System.out.println("Not online!"); + // Do nothing. } catch (IOException e) { // This should never happen. e.printStackTrace(); diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/HologramsCommandHandler.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/HologramsCommandHandler.java index 7b8bc3e7..622bac6a 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/HologramsCommandHandler.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/HologramsCommandHandler.java @@ -57,9 +57,9 @@ public class HologramsCommandHandler implements CommandExecutor { if (args.length == 0) { sender.sendMessage(""); sender.sendMessage(Format.formatTitle("Holographic Displays")); - sender.sendMessage(Format.HIGHLIGHT + "Version: §7" + HolographicDisplays.getInstance().getDescription().getVersion()); - sender.sendMessage(Format.HIGHLIGHT + "Developer: §7filoghost"); - sender.sendMessage(Format.HIGHLIGHT + "Commands: §7/hd help"); + sender.sendMessage(Format.HIGHLIGHT + "Version: §7" + HolographicDisplays.getInstance().getDescription().getVersion()); + sender.sendMessage(Format.HIGHLIGHT + "Developer: §7filoghost"); + sender.sendMessage(Format.HIGHLIGHT + "Commands: §7/hd help"); return true; } @@ -67,7 +67,7 @@ public class HologramsCommandHandler implements CommandExecutor { if (subCommand.isValidTrigger(args[0])) { if (!subCommand.hasPermission(sender)) { - sender.sendMessage("§cYou don't have permission."); + sender.sendMessage(RED + "You don't have permission."); return true; } @@ -78,14 +78,14 @@ public class HologramsCommandHandler implements CommandExecutor { sender.sendMessage(RED + e.getMessage()); } } else { - sender.sendMessage("§cUsage: /" + label + " " + subCommand.getName() + " " + subCommand.getPossibleArguments()); + sender.sendMessage(RED + "Usage: /" + label + " " + subCommand.getName() + " " + subCommand.getPossibleArguments()); } return true; } } - sender.sendMessage("§cUnknown sub-command. Type \"/hd help\" for a list of commands."); + sender.sendMessage(RED + "Unknown sub-command. Type \"/hd help\" for a list of commands."); return true; } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/MovehereCommand.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/MovehereCommand.java index b5ecc9b9..09e2274b 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/MovehereCommand.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/MovehereCommand.java @@ -3,7 +3,6 @@ package com.gmail.filoghost.holograms.commands.main.subs; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -13,7 +12,6 @@ import com.gmail.filoghost.holograms.commands.CommandValidator; import com.gmail.filoghost.holograms.commands.Messages; import com.gmail.filoghost.holograms.commands.main.HologramSubCommand; import com.gmail.filoghost.holograms.database.HologramDatabase; -import com.gmail.filoghost.holograms.event.HologramMoveEvent; import com.gmail.filoghost.holograms.exception.CommandException; import com.gmail.filoghost.holograms.object.CraftHologram; import com.gmail.filoghost.holograms.object.HologramManager; @@ -55,9 +53,6 @@ public class MovehereCommand extends HologramSubCommand { to.setPitch(90); player.teleport(to, TeleportCause.PLUGIN); player.sendMessage(Format.HIGHLIGHT + "You moved the hologram '" + hologram.getName() + "' near to you."); - - // Call the event. - Bukkit.getPluginManager().callEvent(new HologramMoveEvent(hologram)); } @Override diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/NearCommand.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/NearCommand.java index 443d9079..4a2d0702 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/NearCommand.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/NearCommand.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -38,11 +39,12 @@ public class NearCommand extends HologramSubCommand { int radius = CommandValidator.getInteger(args[0]); CommandValidator.isTrue(radius > 0, "Radius must be at least 1."); + World world = player.getWorld(); int radiusSquared = radius * radius; List nearHolograms = new ArrayList(); for (CraftHologram hologram : HologramManager.getHolograms()) { - if (hologram.getLocation().distanceSquared(player.getLocation()) <= radiusSquared) { + if (hologram.getLocation().getWorld().equals(world) && hologram.getLocation().distanceSquared(player.getLocation()) <= radiusSquared) { nearHolograms.add(hologram); } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/event/HologramMoveEvent.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/event/HologramMoveEvent.java deleted file mode 100644 index ec528446..00000000 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/event/HologramMoveEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gmail.filoghost.holograms.event; - -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - -import com.gmail.filoghost.holograms.api.Hologram; - -/** - * Called after that a hologram is moved with /hd movehere - */ -public class HologramMoveEvent extends Event { - - private static final HandlerList handlers = new HandlerList(); - private Hologram hologram; - - public HologramMoveEvent(Hologram hologram) { - this.hologram = hologram; - } - - public Hologram getHologram() { - return hologram; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } - -} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java index 8aeaa1db..92a265a6 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java @@ -6,12 +6,17 @@ import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftItemStack; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.CraftHologram; + +import net.minecraft.server.v1_6_R3.Block; import net.minecraft.server.v1_6_R3.EntityItem; import net.minecraft.server.v1_6_R3.NBTTagCompound; import net.minecraft.server.v1_6_R3.World; +import net.minecraft.server.v1_6_R3.ItemStack; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { + private static final ItemStack STONE = new ItemStack(Block.STONE, 0); + private boolean lockTick; private CraftHologram parent; @@ -66,6 +71,11 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt */ return true; } + + @Override + public ItemStack getItemStack() { + return STONE; + } @Override public void setLockTick(boolean lock) { @@ -103,7 +113,9 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { - setItemStack( CraftItemStack.asNMSCopy(stack) ); + ItemStack newItem = CraftItemStack.asNMSCopy(stack); + newItem.count = 0; + setItemStack(newItem); } @Override diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java index 3011de87..e0a061fb 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java @@ -1,18 +1,22 @@ package com.gmail.filoghost.holograms.nms.v1_7_R1; import org.bukkit.craftbukkit.v1_7_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_7_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftItemStack; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.CraftHologram; + import net.minecraft.server.v1_7_R1.EntityItem; import net.minecraft.server.v1_7_R1.ItemStack; import net.minecraft.server.v1_7_R1.NBTTagCompound; import net.minecraft.server.v1_7_R1.World; +import net.minecraft.server.v1_7_R1.Blocks; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { + private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); + private boolean lockTick; private CraftHologram parent; @@ -67,6 +71,11 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt */ return true; } + + @Override + public ItemStack getItemStack() { + return STONE; + } @Override public void setLockTick(boolean lock) { @@ -104,7 +113,9 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { - setItemStack( new ItemStack(CraftMagicNumbers.getItem(stack.getType()), 1, stack.getDurability()) ); + ItemStack newItem = CraftItemStack.asNMSCopy(stack); + newItem.count = 0; + setItemStack(newItem); } @Override diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java index d9699ac0..79ce6a12 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java @@ -1,18 +1,22 @@ package com.gmail.filoghost.holograms.nms.v1_7_R2; import org.bukkit.craftbukkit.v1_7_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_7_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftItemStack; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.CraftHologram; + import net.minecraft.server.v1_7_R2.EntityItem; import net.minecraft.server.v1_7_R2.ItemStack; import net.minecraft.server.v1_7_R2.NBTTagCompound; import net.minecraft.server.v1_7_R2.World; +import net.minecraft.server.v1_7_R2.Blocks; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { + private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); + private boolean lockTick; private CraftHologram parent; @@ -67,6 +71,11 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt */ return true; } + + @Override + public ItemStack getItemStack() { + return STONE; + } @Override public void setLockTick(boolean lock) { @@ -104,7 +113,9 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { - setItemStack( new ItemStack(CraftMagicNumbers.getItem(stack.getType()), 1, stack.getDurability()) ); + ItemStack newItem = CraftItemStack.asNMSCopy(stack); + newItem.count = 0; + setItemStack(newItem); } @Override diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java index 5ee49041..e4012fea 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java @@ -1,11 +1,13 @@ package com.gmail.filoghost.holograms.nms.v1_7_R3; +import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_7_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_7_R3.util.CraftMagicNumbers; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.CraftHologram; + +import net.minecraft.server.v1_7_R3.Blocks; import net.minecraft.server.v1_7_R3.EntityItem; import net.minecraft.server.v1_7_R3.ItemStack; import net.minecraft.server.v1_7_R3.NBTTagCompound; @@ -13,6 +15,8 @@ import net.minecraft.server.v1_7_R3.World; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { + private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); + private boolean lockTick; private CraftHologram parent; @@ -73,6 +77,11 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt lockTick = lock; } + @Override + public ItemStack getItemStack() { + return STONE; + } + @Override public void die() { setLockTick(false); @@ -104,9 +113,10 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { - setItemStack( new ItemStack(CraftMagicNumbers.getItem(stack.getType()), 1, stack.getDurability()) ); + ItemStack newItem = CraftItemStack.asNMSCopy(stack); + newItem.count = 0; + setItemStack(newItem); } - @Override public CraftHologram getParentHologram() { diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftCustomItem.java new file mode 100644 index 00000000..05d6c43d --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftCustomItem.java @@ -0,0 +1,40 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.EntityEffect; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftItem; +import org.bukkit.entity.Entity; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +public class CraftCustomItem extends CraftItem { + + public CraftCustomItem(CraftServer server, EntityCustomItem entity) { + super(server, entity); + } + + // Disallow all the bukkit methods. + + @Override + public void remove() { + // Cannot be removed, this is the most important to override. + } + + // Methods from Entity + @Override public void setVelocity(Vector vel) { } + @Override public boolean teleport(Location loc) { return false; } + @Override public boolean teleport(Entity entity) { return false; } + @Override public boolean teleport(Location loc, TeleportCause cause) { return false; } + @Override public boolean teleport(Entity entity, TeleportCause cause) { return false; } + @Override public void setFireTicks(int ticks) { } + @Override public boolean setPassenger(Entity entity) { return false; } + @Override public boolean eject() { return false; } + @Override public boolean leaveVehicle() { return false; } + @Override public void playEffect(EntityEffect effect) { } + + // Methods from Item + @Override public void setItemStack(ItemStack stack) { } + @Override public void setPickupDelay(int delay) { } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramHorse.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramHorse.java new file mode 100644 index 00000000..d12319a5 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramHorse.java @@ -0,0 +1,64 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import java.util.Collection; + +import org.bukkit.EntityEffect; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftHorse; +import org.bukkit.entity.AnimalTamer; +import org.bukkit.entity.Entity; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.potion.PotionEffect; +import org.bukkit.util.Vector; + +public class CraftHologramHorse extends CraftHorse { + + public CraftHologramHorse(CraftServer server, EntityHologramHorse entity) { + super(server, entity); + } + + // Disallow all the bukkit methods. + + @Override + public void remove() { + // Cannot be removed, this is the most important to override. + } + + // Methods from Horse class + @Override public void setVariant(Variant variant) { } + @Override public void setColor(Color color) { } + @Override public void setStyle(Style style) { } + @Override public void setCarryingChest(boolean chest) { } + @Override public void setDomestication(int domestication) { } + @Override public void setJumpStrength(double jump) { } + + // Methods form Ageable class + @Override public void setAge(int age) { } + @Override public void setAgeLock(boolean lock) { } + @Override public void setBreed(boolean breed) { } + @Override public void setAdult() { } + @Override public void setBaby() { } + + // Methods from LivingEntity class + @Override public boolean addPotionEffect(PotionEffect effect) { return false; } + @Override public boolean addPotionEffect(PotionEffect effect, boolean param) { return false; } + @Override public boolean addPotionEffects(Collection effects) { return false; } + @Override public void setRemoveWhenFarAway(boolean remove) { } + + // Methods from Entity + @Override public void setVelocity(Vector vel) { } + @Override public boolean teleport(Location loc) { return false; } + @Override public boolean teleport(Entity entity) { return false; } + @Override public boolean teleport(Location loc, TeleportCause cause) { return false; } + @Override public boolean teleport(Entity entity, TeleportCause cause) { return false; } + @Override public void setFireTicks(int ticks) { } + @Override public boolean setPassenger(Entity entity) { return false; } + @Override public boolean eject() { return false; } + @Override public boolean leaveVehicle() { return false; } + @Override public void playEffect(EntityEffect effect) { } + + // Methods from Tameable + @Override public void setTamed(boolean tame) { } + @Override public void setOwner(AnimalTamer owner) { } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramWitherSkull.java new file mode 100644 index 00000000..c696cc4b --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftHologramWitherSkull.java @@ -0,0 +1,45 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.EntityEffect; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftWitherSkull; +import org.bukkit.entity.Entity; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.util.Vector; + +public class CraftHologramWitherSkull extends CraftWitherSkull { + + public CraftHologramWitherSkull(CraftServer server, EntityHologramWitherSkull entity) { + super(server, entity); + } + + // Disallow all the bukkit methods. + + @Override + public void remove() { + // Cannot be removed, this is the most important to override. + } + + // Method from Fireball + @Override public void setDirection(Vector dir) { } + + // Method from Projectile + @Override public void setBounce(boolean bounce) { } + + // Methods from Explosive + @Override public void setYield(float yield) { } + @Override public void setIsIncendiary(boolean fire) { } + + // Methods from Entity + @Override public void setVelocity(Vector vel) { } + @Override public boolean teleport(Location loc) { return false; } + @Override public boolean teleport(Entity entity) { return false; } + @Override public boolean teleport(Location loc, TeleportCause cause) { return false; } + @Override public boolean teleport(Entity entity, TeleportCause cause) { return false; } + @Override public void setFireTicks(int ticks) { } + @Override public boolean setPassenger(Entity entity) { return false; } + @Override public boolean eject() { return false; } + @Override public boolean leaveVehicle() { return false; } + @Override public void playEffect(EntityEffect effect) { } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftTouchSlime.java new file mode 100644 index 00000000..c86fc67f --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/CraftTouchSlime.java @@ -0,0 +1,48 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import java.util.Collection; + +import org.bukkit.EntityEffect; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftSlime; +import org.bukkit.entity.Entity; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.potion.PotionEffect; +import org.bukkit.util.Vector; + +public class CraftTouchSlime extends CraftSlime { + + public CraftTouchSlime(CraftServer server, EntityTouchSlime entity) { + super(server, entity); + } + + // Disallow all the bukkit methods. + + @Override + public void remove() { + // Cannot be removed, this is the most important to override. + } + + // Methods from LivingEntity class + @Override public boolean addPotionEffect(PotionEffect effect) { return false; } + @Override public boolean addPotionEffect(PotionEffect effect, boolean param) { return false; } + @Override public boolean addPotionEffects(Collection effects) { return false; } + @Override public void setRemoveWhenFarAway(boolean remove) { } + + // Methods from Entity + @Override public void setVelocity(Vector vel) { } + @Override public boolean teleport(Location loc) { return false; } + @Override public boolean teleport(Entity entity) { return false; } + @Override public boolean teleport(Location loc, TeleportCause cause) { return false; } + @Override public boolean teleport(Entity entity, TeleportCause cause) { return false; } + @Override public void setFireTicks(int ticks) { } + @Override public boolean setPassenger(Entity entity) { return false; } + @Override public boolean eject() { return false; } + @Override public boolean leaveVehicle() { return false; } + @Override public void playEffect(EntityEffect effect) { } + + + // Methods from Slime + @Override public void setSize(int size) { } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java new file mode 100644 index 00000000..450c63fd --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java @@ -0,0 +1,131 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; + +import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; +import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; +import com.gmail.filoghost.holograms.object.CraftHologram; + +import net.minecraft.server.v1_7_R4.Blocks; +import net.minecraft.server.v1_7_R4.EntityItem; +import net.minecraft.server.v1_7_R4.ItemStack; +import net.minecraft.server.v1_7_R4.NBTTagCompound; +import net.minecraft.server.v1_7_R4.World; + +public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { + + private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); + + private boolean lockTick; + private CraftHologram parent; + + public EntityCustomItem(World world) { + super(world); + super.pickupDelay = Integer.MAX_VALUE; + } + + @Override + public void h() { + // Checks every 20 ticks. + if (ticksLived % 20 == 0) { + // The item dies without a vehicle. + if (this.vehicle == null) { + die(); + } + } + + if (!lockTick) { + super.h(); + } + } + + @Override + public void b(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean c(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public boolean d(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public void e(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean isInvulnerable() { + /* + * The field Entity.invulnerable is private. + * It's only used while saving NBTTags, but since the entity would be killed + * on chunk unload, we prefer to override isInvulnerable(). + */ + return true; + } + + @Override + public void setLockTick(boolean lock) { + lockTick = lock; + } + + @Override + public ItemStack getItemStack() { + return STONE; + } + + @Override + public void die() { + setLockTick(false); + super.die(); + } + + @Override + public CraftEntity getBukkitEntity() { + if (super.bukkitEntity == null) { + this.bukkitEntity = new CraftCustomItem(this.world.getServer(), this); + } + return this.bukkitEntity; + } + + @Override + public boolean isDeadNMS() { + return this.dead; + } + + @Override + public void killEntityNMS() { + die(); + } + + @Override + public void setLocationNMS(double x, double y, double z) { + super.setPosition(x, y, z); + } + + @Override + public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { + ItemStack newItem = CraftItemStack.asNMSCopy(stack); + newItem.count = 0; + setItemStack(newItem); + } + + @Override + public CraftHologram getParentHologram() { + return parent; + } + + @Override + public void setParentHologram(CraftHologram hologram) { + this.parent = hologram; + } + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramHorse.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramHorse.java new file mode 100644 index 00000000..8d3ee3ec --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramHorse.java @@ -0,0 +1,150 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; + +import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; +import com.gmail.filoghost.holograms.object.CraftHologram; +import net.minecraft.server.v1_7_R4.EntityHorse; +import net.minecraft.server.v1_7_R4.NBTTagCompound; +import net.minecraft.server.v1_7_R4.World; + +public class EntityHologramHorse extends EntityHorse implements HologramHorse { + + private boolean lockTick; + private CraftHologram parent; + + public EntityHologramHorse(World world) { + super(world); + super.ageLocked = true; + super.persistent = true; + super.boundingBox.a = 0.0; + super.boundingBox.b = 0.0; + super.boundingBox.c = 0.0; + super.boundingBox.d = 0.0; + super.boundingBox.e = 0.0; + super.boundingBox.f = 0.0; + a(0.0F, 0.0F); + setAge(-1700000); // This is a magic value. No one will see the real horse. + } + + @Override + public void h() { + // Checks every 20 ticks. + if (ticksLived % 20 == 0) { + // The horse dies without a vehicle. + if (this.vehicle == null) { + die(); + } + } + + if (!lockTick) { + super.h(); + } + } + + @Override + public void b(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean c(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public boolean d(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public void e(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean isInvulnerable() { + /* + * The field Entity.invulnerable is private. + * It's only used while saving NBTTags, but since the entity would be killed + * on chunk unload, we prefer to override isInvulnerable(). + */ + return true; + } + + @Override + public void setCustomName(String customName) { + // Locks the custom name. + } + + @Override + public void setCustomNameVisible(boolean visible) { + // Locks the custom name. + } + + @Override + public void makeSound(String sound, float volume, float pitch) { + // Remove sounds. + } + + @Override + public void setLockTick(boolean lock) { + lockTick = lock; + } + + @Override + public void die() { + setLockTick(false); + super.die(); + } + + @Override + public void forceSetCustomName(String name) { + if (name != null && name.length() > 300) { + name = name.substring(0, 300); + } + super.setCustomName(name); + super.setCustomNameVisible(name != null); + } + + @Override + public CraftEntity getBukkitEntity() { + if (super.bukkitEntity == null) { + this.bukkitEntity = new CraftHologramHorse(this.world.getServer(), this); + } + return this.bukkitEntity; + } + + @Override + public boolean isDeadNMS() { + return this.dead; + } + + @Override + public String getCustomNameNMS() { + return super.getCustomName(); + } + + @Override + public void killEntityNMS() { + die(); + } + + @Override + public void setLocationNMS(double x, double y, double z) { + super.setPosition(x, y, z); + } + + @Override + public CraftHologram getParentHologram() { + return parent; + } + + @Override + public void setParentHologram(CraftHologram hologram) { + this.parent = hologram; + } + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramWitherSkull.java new file mode 100644 index 00000000..862c53c3 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityHologramWitherSkull.java @@ -0,0 +1,141 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; + +import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; +import com.gmail.filoghost.holograms.nms.interfaces.HologramWitherSkull; +import com.gmail.filoghost.holograms.object.CraftHologram; +import net.minecraft.server.v1_7_R4.Entity; +import net.minecraft.server.v1_7_R4.EntityWitherSkull; +import net.minecraft.server.v1_7_R4.NBTTagCompound; +import net.minecraft.server.v1_7_R4.World; + +public class EntityHologramWitherSkull extends EntityWitherSkull implements HologramWitherSkull { + + private boolean lockTick; + private CraftHologram parent; + + public EntityHologramWitherSkull(World world) { + super(world); + super.motX = 0.0; + super.motY = 0.0; + super.motZ = 0.0; + super.dirX = 0.0; + super.dirY = 0.0; + super.dirZ = 0.0; + super.boundingBox.a = 0.0; + super.boundingBox.b = 0.0; + super.boundingBox.c = 0.0; + super.boundingBox.d = 0.0; + super.boundingBox.e = 0.0; + super.boundingBox.f = 0.0; + a(0.0F, 0.0F); + } + + + @Override + public void b(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean c(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public boolean d(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public void e(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + + @Override + public boolean isInvulnerable() { + /* + * The field Entity.invulnerable is private. + * It's only used while saving NBTTags, but since the entity would be killed + * on chunk unload, we prefer to override isInvulnerable(). + */ + return true; + } + + @Override + public void h() { + if (!lockTick) { + super.h(); + } + } + + @Override + public void makeSound(String sound, float f1, float f2) { + // Remove sounds. + } + + public void callSuperTick() { + super.h(); + } + + @Override + public void setLockTick(boolean lock) { + lockTick = lock; + } + + @Override + public void die() { + setLockTick(false); + super.die(); + } + + @Override + public CraftEntity getBukkitEntity() { + if (super.bukkitEntity == null) { + this.bukkitEntity = new CraftHologramWitherSkull(this.world.getServer(), this); + } + return this.bukkitEntity; + } + + @Override + public void killEntityNMS() { + die(); + } + + @Override + public void setLocationNMS(double x, double y, double z) { + super.setPosition(x, y, z); + } + + @Override + public boolean isDeadNMS() { + return this.dead; + } + + @Override + public void setPassengerNMS(BasicEntityNMS passenger) { + if (passenger instanceof Entity) { + ((Entity) passenger).setPassengerOf(this); + } + } + + @Override + public void setPassengerNMS(org.bukkit.entity.Entity bukkitEntity) { + ((CraftEntity) bukkitEntity).getHandle().setPassengerOf(this); + } + + @Override + public CraftHologram getParentHologram() { + return parent; + } + + @Override + public void setParentHologram(CraftHologram hologram) { + this.parent = hologram; + } + +} \ No newline at end of file diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityTouchSlime.java new file mode 100644 index 00000000..3389b8b6 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityTouchSlime.java @@ -0,0 +1,139 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; + +import com.gmail.filoghost.holograms.nms.interfaces.TouchSlime; +import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; + +import net.minecraft.server.v1_7_R4.EntitySlime; +import net.minecraft.server.v1_7_R4.NBTTagCompound; +import net.minecraft.server.v1_7_R4.World; + +public class EntityTouchSlime extends EntitySlime implements TouchSlime { + + private boolean lockTick; + private CraftHologram parent; + + public EntityTouchSlime(World world) { + super(world); + super.persistent = true; + super.boundingBox.a = 0.0; + super.boundingBox.b = 0.0; + super.boundingBox.c = 0.0; + super.boundingBox.d = 0.0; + super.boundingBox.e = 0.0; + super.boundingBox.f = 0.0; + a(0.0F, 0.0F); + setSize(1); + setInvisible(true); + } + + @Override + public void h() { + // Checks every 20 ticks. + if (ticksLived % 20 == 0) { + // The slime dies without a vehicle. + if (this.vehicle == null) { + die(); + } + } + + if (!lockTick) { + super.h(); + } + } + + @Override + public void b(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean c(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public boolean d(NBTTagCompound nbttagcompound) { + // Do not save NBT. + return false; + } + + @Override + public void e(NBTTagCompound nbttagcompound) { + // Do not save NBT. + } + + @Override + public boolean isInvulnerable() { + /* + * The field Entity.invulnerable is private. + * It's only used while saving NBTTags, but since the entity would be killed + * on chunk unload, we prefer to override isInvulnerable(). + */ + return true; + } + + @Override + public void setCustomName(String customName) { + // Locks the custom name. + } + + @Override + public void setCustomNameVisible(boolean visible) { + // Locks the custom name. + } + + @Override + public void makeSound(String sound, float volume, float pitch) { + // Remove sounds. + } + + public void setLockTick(boolean lock) { + lockTick = lock; + } + + public void die() { + setLockTick(false); + super.die(); + } + + public HologramBase getParent() { + return parent; + } + + public CraftEntity getBukkitEntity() { + if (super.bukkitEntity == null) { + this.bukkitEntity = new CraftTouchSlime(this.world.getServer(), this); + } + return this.bukkitEntity; + } + + @Override + public boolean isDeadNMS() { + return super.dead; + } + + @Override + public void killEntityNMS() { + die(); + } + + @Override + public void setLocationNMS(double x, double y, double z) { + super.setPosition(x, y, z); + } + + @Override + public CraftHologram getParentHologram() { + return parent; + } + + @Override + public void setParentHologram(CraftHologram hologram) { + this.parent = hologram; + } + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/FancyMessageImpl.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/FancyMessageImpl.java new file mode 100644 index 00000000..272c2a50 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/FancyMessageImpl.java @@ -0,0 +1,152 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.server.v1_7_R4.ChatSerializer; +import net.minecraft.server.v1_7_R4.NBTTagCompound; +import net.minecraft.server.v1_7_R4.PacketPlayOutChat; + +import org.bukkit.ChatColor; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.json.JSONException; +import org.json.JSONStringer; + +import com.gmail.filoghost.holograms.nms.interfaces.FancyMessage; + +public class FancyMessageImpl implements FancyMessage { + + private final List messageParts; + + public FancyMessageImpl(final String firstPartText) { + messageParts = new ArrayList(); + messageParts.add(new MessagePart(firstPartText)); + } + + public FancyMessageImpl color(final ChatColor color) { + if (!color.isColor()) { + throw new IllegalArgumentException(color.name() + " is not a color"); + } + latest().color = color; + return this; + } + + public FancyMessageImpl style(final ChatColor... styles) { + for (final ChatColor style : styles) { + if (!style.isFormat()) { + throw new IllegalArgumentException(style.name() + " is not a style"); + } + } + latest().styles = styles; + return this; + } + + public FancyMessageImpl file(final String path) { + onClick("open_file", path); + return this; + } + + public FancyMessageImpl link(final String url) { + onClick("open_url", url); + return this; + } + + public FancyMessageImpl suggest(final String command) { + onClick("suggest_command", command); + return this; + } + + public FancyMessageImpl command(final String command) { + onClick("run_command", command); + return this; + } + + public FancyMessageImpl achievementTooltip(final String name) { + onHover("show_achievement", "achievement." + name); + return this; + } + + public FancyMessageImpl itemTooltip(final String itemJSON) { + onHover("show_item", itemJSON); + return this; + } + + public FancyMessageImpl itemTooltip(final ItemStack itemStack) { + return itemTooltip(CraftItemStack.asNMSCopy(itemStack).save(new NBTTagCompound()).toString()); + } + + public FancyMessageImpl tooltip(final String text) { + final String[] lines = text.split("\\n"); + if (lines.length <= 1) { + onHover("show_text", text); + } else { + itemTooltip(makeMultilineTooltip(lines)); + } + return this; + } + + public FancyMessageImpl then(final Object obj) { + messageParts.add(new MessagePart(obj.toString())); + return this; + } + + public String toJSONString() { + final JSONStringer json = new JSONStringer(); + try { + if (messageParts.size() == 1) { + latest().writeJson(json); + } else { + json.object().key("text").value("").key("extra").array(); + for (final MessagePart part : messageParts) { + part.writeJson(json); + } + json.endArray().endObject(); + } + } catch (final JSONException e) { + throw new RuntimeException("invalid message"); + } + return json.toString(); + } + + public void send(Player player){ + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(toJSONString()))); + } + + private MessagePart latest() { + return messageParts.get(messageParts.size() - 1); + } + + private String makeMultilineTooltip(final String[] lines) { + final JSONStringer json = new JSONStringer(); + try { + json.object().key("id").value(1); + json.key("tag").object().key("display").object(); + json.key("Name").value("\\u00A7f" + lines[0].replace("\"", "\\\"")); + json.key("Lore").array(); + for (int i = 1; i < lines.length; i++) { + final String line = lines[i]; + json.value(line.isEmpty() ? " " : line.replace("\"", "\\\"")); + } + json.endArray().endObject().endObject().endObject(); + } catch (final JSONException e) { + throw new RuntimeException("invalid tooltip"); + } + return json.toString(); + } + + private void onClick(final String name, final String data) { + final MessagePart latest = latest(); + latest.clickActionName = name; + latest.clickActionData = data; + } + + private void onHover(final String name, final String data) { + final MessagePart latest = latest(); + latest.hoverActionName = name; + latest.hoverActionData = data; + } + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/NmsManagerImpl.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/NmsManagerImpl.java new file mode 100644 index 00000000..c8def7d5 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/NmsManagerImpl.java @@ -0,0 +1,128 @@ +package com.gmail.filoghost.holograms.nms.v1_7_R4; + +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.inventory.ItemStack; + +import com.gmail.filoghost.holograms.exception.SpawnFailedException; +import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; +import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; +import com.gmail.filoghost.holograms.nms.interfaces.FancyMessage; +import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; +import com.gmail.filoghost.holograms.nms.interfaces.HologramWitherSkull; +import com.gmail.filoghost.holograms.nms.interfaces.HologramComponent; +import com.gmail.filoghost.holograms.nms.interfaces.NmsManager; +import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.utils.ReflectionUtils; +import com.gmail.filoghost.holograms.utils.VersionUtils; + +import net.minecraft.server.v1_7_R4.Entity; +import net.minecraft.server.v1_7_R4.EntityTypes; +import net.minecraft.server.v1_7_R4.WorldServer; + +public class NmsManagerImpl implements NmsManager { + + @Override + public void registerCustomEntities() throws Exception { + registerCustomEntity(EntityHologramHorse.class, "EntityHorse", 100); + registerCustomEntity(EntityHologramWitherSkull.class, "WitherSkull", 19); + registerCustomEntity(EntityCustomItem.class, "Item", 1); + registerCustomEntity(EntityTouchSlime.class, "Slime", 55); + } + + @SuppressWarnings("rawtypes") + public void registerCustomEntity(Class entityClass, String name, int id) throws Exception { + if (VersionUtils.isMCPC() || VersionUtils.isCauldron()) { + // MCPC+ / Cauldron entity registration. + Class entityTypesClass = Class.forName("net.minecraft.server.v1_7_R4.EntityTypes"); + ReflectionUtils.putInPrivateStaticMap(entityTypesClass, "field_75626_c", entityClass, name); + ReflectionUtils.putInPrivateStaticMap(entityTypesClass, "field_75624_e", entityClass, Integer.valueOf(id)); + } else { + // Normal entity registration. + ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name); + ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id)); + } + } + + @Override + public HologramHorse spawnHologramHorse(org.bukkit.World world, double x, double y, double z) throws SpawnFailedException { + WorldServer nmsWorld = ((CraftWorld) world).getHandle(); + EntityHologramHorse invisibleHorse = new EntityHologramHorse(nmsWorld); + invisibleHorse.setLocationNMS(x, y, z); + if (!nmsWorld.addEntity(invisibleHorse, SpawnReason.CUSTOM)) { + throw new SpawnFailedException(); + } + return invisibleHorse; + } + + @Override + public HologramWitherSkull spawnHologramWitherSkull(org.bukkit.World bukkitWorld, double x, double y, double z) throws SpawnFailedException { + WorldServer nmsWorld = ((CraftWorld) bukkitWorld).getHandle(); + EntityHologramWitherSkull staticWitherSkull = new EntityHologramWitherSkull(nmsWorld); + staticWitherSkull.setLocationNMS(x, y, z); + if (!nmsWorld.addEntity(staticWitherSkull, SpawnReason.CUSTOM)) { + throw new SpawnFailedException(); + } + return staticWitherSkull; + } + + + @Override + public CustomItem spawnCustomItem(org.bukkit.World bukkitWorld, double x, double y, double z, ItemStack stack) throws SpawnFailedException { + WorldServer nmsWorld = ((CraftWorld) bukkitWorld).getHandle(); + EntityCustomItem customItem = new EntityCustomItem(nmsWorld); + customItem.setLocationNMS(x, y, z); + customItem.setItemStackNMS(stack); + if (!nmsWorld.addEntity(customItem, SpawnReason.CUSTOM)) { + throw new SpawnFailedException(); + } + return customItem; + } + + + @Override + public EntityTouchSlime spawnTouchSlime(org.bukkit.World bukkitWorld, double x, double y, double z) throws SpawnFailedException { + WorldServer nmsWorld = ((CraftWorld) bukkitWorld).getHandle(); + EntityTouchSlime touchSlime = new EntityTouchSlime(nmsWorld); + touchSlime.setLocationNMS(x, y, z); + if (!nmsWorld.addEntity(touchSlime, SpawnReason.CUSTOM)) { + throw new SpawnFailedException(); + } + return touchSlime; + } + + + + @Override + public boolean isHologramComponent(org.bukkit.entity.Entity bukkitEntity) { + return ((CraftEntity) bukkitEntity).getHandle() instanceof HologramComponent; + } + + @Override + public boolean isBasicEntityNMS(org.bukkit.entity.Entity bukkitEntity) { + return ((CraftEntity) bukkitEntity).getHandle() instanceof BasicEntityNMS; + } + + @Override + public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity) { + + Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); + if (nmsEntity instanceof HologramComponent) { + return ((HologramComponent) nmsEntity).getParentHologram(); + } + + return null; + } + + @Override + public FancyMessage newFancyMessage(String text) { + return new FancyMessageImpl(text); + } + + @Override + public boolean hasChatHoverFeature() { + return true; + } + +}