diff --git a/HolographicDisplays/plugin.yml b/HolographicDisplays/plugin.yml index b79219d9..92193392 100644 --- a/HolographicDisplays/plugin.yml +++ b/HolographicDisplays/plugin.yml @@ -1,6 +1,6 @@ name: HolographicDisplays main: com.gmail.filoghost.holograms.HolographicDisplays -version: 1.8.4 +version: 1.8.5 softdepend: [Multiverse-Core, MultiWorld, My Worlds, My_Worlds, ProtocolLib] @@ -8,8 +8,4 @@ commands: holograms: description: Main command for HolographicDisplays. usage: / (Startup error) - aliases: [hd, holo, hologram] - icon: - description: Command to create unpickable floating items. - usage: / (Startup error) - aliases: [icons, floatingitem, floatingitems] \ No newline at end of file + aliases: [hd, holo, hologram] \ No newline at end of file diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java index 76e39db3..4ee89909 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java @@ -169,7 +169,7 @@ public class HolographicDisplays extends JavaPlugin { return; } - // ProtocolLib check + // ProtocolLib check. try { if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { ProtocolLibHook.initialize(); @@ -179,7 +179,7 @@ public class HolographicDisplays extends JavaPlugin { logger.warning("Failed to load ProtocolLib support. Is it updated?"); } - // Load animation files + // Load animation files. try { AnimationManager.loadAnimations(); } catch (Exception ex) { @@ -187,7 +187,7 @@ public class HolographicDisplays extends JavaPlugin { logger.warning("Failed to load animation files!"); } - // Instantiate a PlaceholderManager + // Instantiate a PlaceholderManager. placeholderManager = new PlaceholderManager(); // Initalize other static classes. diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/FloatingItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/FloatingItem.java new file mode 100644 index 00000000..2d7e2238 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/FloatingItem.java @@ -0,0 +1,114 @@ +package com.gmail.filoghost.holograms.api; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.inventory.ItemStack; + +public interface FloatingItem { + + /** + * Updates the floating item. With floating items this method is not really needed. + * @return false if the spawn was blocked. + */ + public boolean update(); + + /** + * Hides the floating item. To show the floating item call update(). + */ + public void hide(); + + /** + * Change the current itemStack of this floating item. + */ + public void setItemStack(ItemStack itemstack); + + /** + * @return the current itemStack of this floating item. + */ + public ItemStack getItemStack(); + + /** + * @return the location of the floating item. + */ + public Location getLocation(); + + /** + * @return the X coordinate of the floating item. + */ + public double getX(); + + /** + * @return the Y coordinate of the floating item. + */ + public double getY(); + + /** + * @return the Z coordinate of the floating item. + */ + public double getZ(); + + /** + * @return the world of the floating item. + */ + public World getWorld(); + + /** + * Teleports the floating item to a new location, without creating new entities. + * You don't need to call update() after this. + * @param location - the new location of the floating item. + */ + public void teleport(Location location); + + /** + * Sets the touch handler of the floating item: whenever a player right clicks it, the onTouch(...) + * method of the TouchHandler is called. If null, the previous touch handler will be removed. + * @param handler - the new TouchHandler. + */ + public void setTouchHandler(ItemTouchHandler handler); + + /** + * @return the current touch handler, null if hasTouchHandler() is false. + */ + public ItemTouchHandler getTouchHandler(); + + /** + * @return true if the floating item has a touch handler. + */ + public boolean hasTouchHandler(); + + /** + * Sets the pickup handler of the floating item: if not null, when a player picks up the item + * the onPickup(...) method is called. If null, the previous pickup handler will be removed. + * This is very useful for powerups. + * NOTE: the floating item is NOT removed automatically and the player WON'T actually pickup the item, + * in fact the method is just called when the player is near to the floating item. + * @param handler - the new PickupHandler. + */ + public void setPickupHandler(PickupHandler handler); + + /** + * @return the current touch handler, null if hasPickupHandler() is false. + */ + public PickupHandler getPickupHandler(); + + /** + * @return true if the floating item has a pickup handler. + */ + public boolean hasPickupHandler(); + + + /** + * @return the timestamp of when the floating item was created, in milliseconds. + */ + public long getCreationTimestamp(); + + /** + * Deletes this floating item, removing it from the lists. + */ + public void delete(); + + /** + * @return true if this floating item was deleted. Calling update() on a deleted floating item will throw an exception. + */ + public boolean isDeleted(); +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/Hologram.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/Hologram.java index 566a6c28..299ac1ef 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/Hologram.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/Hologram.java @@ -12,7 +12,7 @@ public interface Hologram { public boolean update(); /** - * Hides the hologram. + * Hides the hologram. To show the hologram call update(). */ public void hide(); @@ -86,9 +86,17 @@ public interface Hologram { * Change the location of the hologram. You have to call update() after this method. * Please note that this method will create new entities every time, so use it wisely. * @param location - the new location of the hologram. + * @deprecated use teleport(Location location) - it's better and doesn't create new entities */ + @Deprecated public void setLocation(Location location); + /** + * Teleports the hologram to a new location, without calling update() and with a smooth movement. + * @param location - the new location of the hologram. + */ + public void teleport(Location location); + /** * Sets the touch handler of the hologram: whenever a player right clicks it, the onTouch() * method of the TouchHandler is called. If null, the previous touch handler will be removed. diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/HolographicDisplaysAPI.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/HolographicDisplaysAPI.java index c1462a13..a40ac0ee 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/HolographicDisplaysAPI.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/HolographicDisplaysAPI.java @@ -1,19 +1,24 @@ package com.gmail.filoghost.holograms.api; +import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; + import java.util.List; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import com.gmail.filoghost.holograms.nms.interfaces.NmsManager; +import com.gmail.filoghost.holograms.object.APICraftHologram; +import com.gmail.filoghost.holograms.object.APIFloatingItemManager; import com.gmail.filoghost.holograms.object.APIHologramManager; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.CraftFloatingItem; import com.gmail.filoghost.holograms.utils.GenericUtils; import com.gmail.filoghost.holograms.utils.Validator; import com.gmail.filoghost.holograms.utils.VisibilityManager; -import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; public class HolographicDisplaysAPI { @@ -30,7 +35,7 @@ public class HolographicDisplaysAPI { Validator.notNull(source, "source cannot be null"); Validator.notNull(source.getWorld(), "source's world cannot be null"); - CraftHologram hologram = new CraftHologram("{API-Hologram}", source); + APICraftHologram hologram = new APICraftHologram(source); APIHologramManager.addHologram(plugin, hologram); if (lines != null && lines.length > 0) { @@ -43,6 +48,28 @@ public class HolographicDisplaysAPI { return hologram; } + /** + * Creates a floating item at given location. + * @param plugin - the plugin that creates it. + * @param source - the location where it will appear. + * @param itemstack - the floating item that will appear. + * @return the new floating item created. + */ + public static FloatingItem createFloatingItem(Plugin plugin, Location source, ItemStack itemstack) { + + Validator.notNull(plugin, "plugin cannot be null"); + Validator.notNull(source, "source cannot be null"); + Validator.notNull(source.getWorld(), "source's world cannot be null"); + Validator.notNull(itemstack, "itemstack cannot be null"); + Validator.checkArgument(itemstack.getType() != Material.AIR, "itemstack cannot be AIR"); + + CraftFloatingItem floatingItem = new CraftFloatingItem(source, itemstack); + APIFloatingItemManager.addFloatingItem(plugin, floatingItem); + + floatingItem.update(); + return floatingItem; + } + /** * Creates a hologram at given location that only a player can see. If the provided player is null, no one will be able to see it. * IMPORTANT NOTE: Requires ProtocolLib. @@ -71,7 +98,7 @@ public class HolographicDisplaysAPI { Validator.notNull(source, "source cannot be null"); Validator.notNull(source.getWorld(), "source's world cannot be null"); - CraftHologram hologram = new CraftHologram("{API-Hologram}", source); + APICraftHologram hologram = new APICraftHologram(source); VisibilityManager visibilityManager = new VisibilityManager(); hologram.setVisibilityManager(visibilityManager); @@ -94,6 +121,8 @@ public class HolographicDisplaysAPI { return hologram; } + //TODO individual floating item + /** * @return a copy of all the holograms created with the API by a plugin. */ @@ -102,6 +131,14 @@ public class HolographicDisplaysAPI { return APIHologramManager.getHolograms(plugin); } + /** + * @return a copy of all the holograms created with the API by a plugin. + */ + public static FloatingItem[] getFloatingItems(Plugin plugin) { + Validator.notNull(plugin, "plugin cannot be null"); + return APIFloatingItemManager.getFloatingItems(plugin); + } + /** * @return if the entity is part of a hologram. */ diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/ItemTouchHandler.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/ItemTouchHandler.java new file mode 100644 index 00000000..0227114e --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/ItemTouchHandler.java @@ -0,0 +1,18 @@ +package com.gmail.filoghost.holograms.api; + +import org.bukkit.entity.Player; + +/** + * Interface to handle touch floating items. + * NOTE: this doesn't handle item pickup, just right click. + */ +public interface ItemTouchHandler { + + /** + * Called when a player interacts with a floating item. + * @param floatingItem - the involved floating item + * @param player - the player who interacts + */ + public void onTouch(FloatingItem floatingItem, Player player); + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/api/PickupHandler.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/PickupHandler.java new file mode 100644 index 00000000..57d93d60 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/api/PickupHandler.java @@ -0,0 +1,17 @@ +package com.gmail.filoghost.holograms.api; + +import org.bukkit.entity.Player; + +/** + * Interface to handle floating items being picked up by players. + */ +public interface PickupHandler { + + /** + * Called when a player picks up the floating item. + * @param floatingItem - the involved floating item + * @param player - the player who interacts + */ + public void onPickup(FloatingItem floatingItem, Player player); + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/FixCommand.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/FixCommand.java index b30f5155..74b56725 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/FixCommand.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/commands/main/subs/FixCommand.java @@ -6,7 +6,6 @@ import java.util.List; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; - import com.gmail.filoghost.holograms.commands.CommandValidator; import com.gmail.filoghost.holograms.commands.Messages; import com.gmail.filoghost.holograms.commands.main.HologramSubCommand; @@ -37,7 +36,7 @@ public class FixCommand extends HologramSubCommand { public void execute(CommandSender sender, String[] args) throws CommandException { CraftHologram hologram = HologramManager.getHologram(args[0].toLowerCase()); CommandValidator.notNull(hologram, Messages.NO_SUCH_HOLOGRAM); - + if (args.length <= 1) { sender.sendMessage(Format.HIGHLIGHT + "This command will put a glowstone 16 blocks above the hologram to fix the lightning."); sender.sendMessage(Format.HIGHLIGHT + "If you're sure, type §f/hd fix " + args[0].toLowerCase() + " confirm"); diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java index 7b190a4d..77b16d64 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java @@ -15,10 +15,12 @@ import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; import com.gmail.filoghost.holograms.Configuration; +import com.gmail.filoghost.holograms.api.FloatingItem; +import com.gmail.filoghost.holograms.api.Hologram; import com.gmail.filoghost.holograms.commands.Messages; import com.gmail.filoghost.holograms.nms.interfaces.NmsManager; +import com.gmail.filoghost.holograms.object.APIFloatingItemManager; import com.gmail.filoghost.holograms.object.APIHologramManager; -import com.gmail.filoghost.holograms.object.CraftHologram; import com.gmail.filoghost.holograms.object.HologramBase; import com.gmail.filoghost.holograms.object.HologramManager; @@ -48,6 +50,7 @@ public class MainListener implements Listener { Chunk chunk = event.getChunk(); HologramManager.onChunkLoad(chunk); APIHologramManager.onChunkLoad(chunk); + APIFloatingItemManager.onChunkLoad(chunk); } @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = false) @@ -80,9 +83,19 @@ public class MainListener implements Listener { @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) public void onSlimeInteract(PlayerInteractEntityEvent event) { if (event.getRightClicked().getType() == EntityType.SLIME) { - CraftHologram hologram = nmsManager.getParentHologram(event.getRightClicked()); - if (hologram != null && hologram.hasTouchHandler()) { - hologram.getTouchHandler().onTouch(hologram, event.getPlayer()); + HologramBase base = nmsManager.getParentHologram(event.getRightClicked()); + if (base == null) return; + + if (base instanceof Hologram) { + Hologram textHologram = (Hologram) base; + if (textHologram.hasTouchHandler()) { + textHologram.getTouchHandler().onTouch(textHologram, event.getPlayer()); + } + } else if (base instanceof FloatingItem) { + FloatingItem floatingItem = (FloatingItem) base; + if (floatingItem.hasTouchHandler()) { + floatingItem.getTouchHandler().onTouch(floatingItem, event.getPlayer()); + } } } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/CustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/CustomItem.java index 1128ef81..e1598470 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/CustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/CustomItem.java @@ -6,4 +6,6 @@ public interface CustomItem extends HologramComponent { public void setItemStackNMS(ItemStack stack); + public void allowPickup(boolean pickup); + } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramComponent.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramComponent.java index ae22d3a4..e3bfdc91 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramComponent.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramComponent.java @@ -1,14 +1,14 @@ package com.gmail.filoghost.holograms.nms.interfaces; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; // Represents an entity that is part of a hologram. public interface HologramComponent extends BasicEntityNMS { - // Returns the linked BaseMultiEntity. Can be null. - public CraftHologram getParentHologram(); + // Returns the linked HologramBase. Can be null. + public HologramBase getParentHologram(); - // Sets the linked BaseMultiEntity. - public void setParentHologram(CraftHologram hologram); + // Sets the linked HologramBase. + public void setParentHologram(HologramBase base); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramWitherSkull.java index 39e28b07..06df8f28 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramWitherSkull.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/HologramWitherSkull.java @@ -9,5 +9,7 @@ public interface HologramWitherSkull extends HologramComponent { // Sets the passenger of this entity through NMS. public void setPassengerNMS(Entity bukkitEntity); + + public void sendUpdatePacketNear(); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/NmsManager.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/NmsManager.java index 16936e17..e2884499 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/NmsManager.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/interfaces/NmsManager.java @@ -3,7 +3,7 @@ package com.gmail.filoghost.holograms.nms.interfaces; import org.bukkit.inventory.ItemStack; import com.gmail.filoghost.holograms.exception.SpawnFailedException; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; public interface NmsManager { @@ -21,8 +21,8 @@ public interface NmsManager { public boolean isBasicEntityNMS(org.bukkit.entity.Entity bukkitEntity); - // Return null if not a hologram's part. - public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity); + // Return null if not a hologram's (or floating item's) part. + public HologramBase getParentHologram(org.bukkit.entity.Entity bukkitEntity); public FancyMessage newFancyMessage(String text); 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 92a265a6..3119b334 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 @@ -1,24 +1,28 @@ package com.gmail.filoghost.holograms.nms.v1_6_R3; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; -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.ItemStack; import net.minecraft.server.v1_6_R3.NBTTagCompound; import net.minecraft.server.v1_6_R3.World; -import net.minecraft.server.v1_6_R3.ItemStack; +import net.minecraft.server.v1_6_R3.EntityHuman; +import net.minecraft.server.v1_6_R3.EntityPlayer; + +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftItemStack; +import org.bukkit.entity.Player; + +import com.gmail.filoghost.holograms.api.FloatingItem; +import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; +import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; +import com.gmail.filoghost.holograms.object.HologramBase; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { private static final ItemStack STONE = new ItemStack(Block.STONE, 0); private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityCustomItem(World world) { super(world); @@ -40,6 +44,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } } + // Method called when a player is near. + @Override + public void b_(EntityHuman human) { + + if (parent instanceof FloatingItem && human instanceof EntityPlayer) { + + FloatingItem floatingItemParent = (FloatingItem) parent; + if (floatingItemParent.hasPickupHandler()) { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } + + // It is never added to the inventory. + } + } + @Override public void b(NBTTagCompound nbttagcompound) { // Do not save NBT. @@ -119,13 +138,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; + } + + @Override + public void allowPickup(boolean pickup) { + if (pickup) { + super.pickupDelay = 0; + } else { + super.pickupDelay = Integer.MAX_VALUE; + } } - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramHorse.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramHorse.java index 5b968417..a8e3ac4b 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramHorse.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramHorse.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_6_R3; import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_6_R3.EntityHorse; import net.minecraft.server.v1_6_R3.NBTTagCompound; import net.minecraft.server.v1_6_R3.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_6_R3.World; public class EntityHologramHorse extends EntityHorse implements HologramHorse { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramHorse(World world) { super(world); @@ -138,13 +139,13 @@ public class EntityHologramHorse extends EntityHorse implements HologramHorse { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramWitherSkull.java index ec0c7732..7d4dcb8c 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramWitherSkull.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityHologramWitherSkull.java @@ -4,16 +4,19 @@ import org.bukkit.craftbukkit.v1_6_R3.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 com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_6_R3.Entity; import net.minecraft.server.v1_6_R3.EntityWitherSkull; import net.minecraft.server.v1_6_R3.NBTTagCompound; +import net.minecraft.server.v1_6_R3.Packet34EntityTeleport; import net.minecraft.server.v1_6_R3.World; +import net.minecraft.server.v1_6_R3.EntityPlayer; public class EntityHologramWitherSkull extends EntityWitherSkull implements HologramWitherSkull { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramWitherSkull(World world) { super(world); @@ -106,6 +109,24 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo public void setLocationNMS(double x, double y, double z) { super.setPosition(x, y, z); } + + @Override + public void sendUpdatePacketNear() { + + // Send a packet to update the position. + Packet34EntityTeleport teleportPacket = new Packet34EntityTeleport(this); + + for (Object obj : this.world.players) { + if (obj instanceof EntityPlayer) { + EntityPlayer nmsPlayer = (EntityPlayer) obj; + + double distanceSquared = nmsPlayer.e(locX, locY, locZ); + if (distanceSquared < 8192 && nmsPlayer.playerConnection != null) { + nmsPlayer.playerConnection.sendPacket(teleportPacket); + } + } + } + } @Override public boolean isDeadNMS() { @@ -126,13 +147,13 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } \ No newline at end of file diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityTouchSlime.java index 9a7af600..82b72a1e 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityTouchSlime.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityTouchSlime.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_6_R3; import org.bukkit.craftbukkit.v1_6_R3.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_6_R3.EntitySlime; import net.minecraft.server.v1_6_R3.NBTTagCompound; import net.minecraft.server.v1_6_R3.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_6_R3.World; public class EntityTouchSlime extends EntitySlime implements TouchSlime { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityTouchSlime(World world) { super(world); @@ -124,13 +125,13 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/NmsManagerImpl.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/NmsManagerImpl.java index 3cefdad0..154af650 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/NmsManagerImpl.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/NmsManagerImpl.java @@ -13,7 +13,7 @@ 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.object.HologramBase; import com.gmail.filoghost.holograms.utils.ReflectionUtils; import com.gmail.filoghost.holograms.utils.VersionUtils; @@ -102,7 +102,7 @@ public class NmsManagerImpl implements NmsManager { } @Override - public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity) { + public HologramBase getParentHologram(org.bukkit.entity.Entity bukkitEntity) { Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); if (nmsEntity instanceof HologramComponent) { @@ -121,5 +121,4 @@ public class NmsManagerImpl implements NmsManager { public boolean hasChatHoverFeature() { return false; } - } 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 e0a061fb..c7cc182a 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 @@ -2,23 +2,27 @@ 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.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; 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; +import net.minecraft.server.v1_7_R1.EntityHuman; +import net.minecraft.server.v1_7_R1.EntityPlayer; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityCustomItem(World world) { super(world); @@ -40,6 +44,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } } + // Method called when a player is near. + @Override + public void b_(EntityHuman human) { + + if (parent instanceof FloatingItem && human instanceof EntityPlayer) { + + FloatingItem floatingItemParent = (FloatingItem) parent; + if (floatingItemParent.hasPickupHandler()) { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } + + // It is never added to the inventory. + } + } + @Override public void b(NBTTagCompound nbttagcompound) { // Do not save NBT. @@ -119,13 +138,22 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; + } + + @Override + public void allowPickup(boolean pickup) { + if (pickup) { + super.pickupDelay = 0; + } else { + super.pickupDelay = Integer.MAX_VALUE; + } } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramHorse.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramHorse.java index 0ec1dea5..4aae6728 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramHorse.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramHorse.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_7_R1; import org.bukkit.craftbukkit.v1_7_R1.entity.CraftEntity; import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R1.EntityHorse; import net.minecraft.server.v1_7_R1.NBTTagCompound; import net.minecraft.server.v1_7_R1.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_7_R1.World; public class EntityHologramHorse extends EntityHorse implements HologramHorse { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramHorse(World world) { super(world); @@ -138,13 +139,12 @@ public class EntityHologramHorse extends EntityHorse implements HologramHorse { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramWitherSkull.java index 77674dd2..d0d709d9 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramWitherSkull.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityHologramWitherSkull.java @@ -4,16 +4,19 @@ import org.bukkit.craftbukkit.v1_7_R1.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 com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R1.Entity; import net.minecraft.server.v1_7_R1.EntityWitherSkull; import net.minecraft.server.v1_7_R1.NBTTagCompound; import net.minecraft.server.v1_7_R1.World; +import net.minecraft.server.v1_7_R1.EntityPlayer; +import net.minecraft.server.v1_7_R1.PacketPlayOutEntityTeleport; public class EntityHologramWitherSkull extends EntityWitherSkull implements HologramWitherSkull { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramWitherSkull(World world) { super(world); @@ -106,6 +109,24 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo public void setLocationNMS(double x, double y, double z) { super.setPosition(x, y, z); } + + @Override + public void sendUpdatePacketNear() { + + // Send a packet to update the position. + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(this); + + for (Object obj : this.world.players) { + if (obj instanceof EntityPlayer) { + EntityPlayer nmsPlayer = (EntityPlayer) obj; + + double distanceSquared = nmsPlayer.e(locX, locY, locZ); + if (distanceSquared < 8192 && nmsPlayer.playerConnection != null) { + nmsPlayer.playerConnection.sendPacket(teleportPacket); + } + } + } + } @Override public boolean isDeadNMS() { @@ -125,12 +146,12 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } \ No newline at end of file diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityTouchSlime.java index c2460ce6..b6a20dbd 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityTouchSlime.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityTouchSlime.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_7_R1; import org.bukkit.craftbukkit.v1_7_R1.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_R1.EntitySlime; import net.minecraft.server.v1_7_R1.NBTTagCompound; import net.minecraft.server.v1_7_R1.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_7_R1.World; public class EntityTouchSlime extends EntitySlime implements TouchSlime { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityTouchSlime(World world) { super(world); @@ -124,14 +125,12 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/NmsManagerImpl.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/NmsManagerImpl.java index 496239c8..e907cc90 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/NmsManagerImpl.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/NmsManagerImpl.java @@ -13,7 +13,7 @@ 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.object.HologramBase; import com.gmail.filoghost.holograms.utils.ReflectionUtils; import com.gmail.filoghost.holograms.utils.VersionUtils; @@ -101,7 +101,7 @@ public class NmsManagerImpl implements NmsManager { } @Override - public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity) { + public HologramBase getParentHologram(org.bukkit.entity.Entity bukkitEntity) { Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); if (nmsEntity instanceof HologramComponent) { @@ -120,5 +120,4 @@ public class NmsManagerImpl implements NmsManager { public boolean hasChatHoverFeature() { return true; } - } 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 79ce6a12..aea5a2b7 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 @@ -2,23 +2,27 @@ 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.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; 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; +import net.minecraft.server.v1_7_R2.EntityHuman; +import net.minecraft.server.v1_7_R2.EntityPlayer; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityCustomItem(World world) { super(world); @@ -40,6 +44,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } } + // Method called when a player is near. + @Override + public void b_(EntityHuman human) { + + if (parent instanceof FloatingItem && human instanceof EntityPlayer) { + + FloatingItem floatingItemParent = (FloatingItem) parent; + if (floatingItemParent.hasPickupHandler()) { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } + + // It is never added to the inventory. + } + } + @Override public void b(NBTTagCompound nbttagcompound) { // Do not save NBT. @@ -119,13 +138,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; + } + + @Override + public void allowPickup(boolean pickup) { + if (pickup) { + super.pickupDelay = 0; + } else { + super.pickupDelay = Integer.MAX_VALUE; + } } - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramHorse.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramHorse.java index 65e3b9d6..624b3f00 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramHorse.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramHorse.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_7_R2; import org.bukkit.craftbukkit.v1_7_R2.entity.CraftEntity; import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R2.EntityHorse; import net.minecraft.server.v1_7_R2.NBTTagCompound; import net.minecraft.server.v1_7_R2.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_7_R2.World; public class EntityHologramHorse extends EntityHorse implements HologramHorse { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramHorse(World world) { super(world); @@ -138,13 +139,13 @@ public class EntityHologramHorse extends EntityHorse implements HologramHorse { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramWitherSkull.java index 06252e8b..c60606c6 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramWitherSkull.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityHologramWitherSkull.java @@ -4,16 +4,19 @@ import org.bukkit.craftbukkit.v1_7_R2.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 com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R2.Entity; import net.minecraft.server.v1_7_R2.EntityWitherSkull; import net.minecraft.server.v1_7_R2.NBTTagCompound; import net.minecraft.server.v1_7_R2.World; +import net.minecraft.server.v1_7_R2.EntityPlayer; +import net.minecraft.server.v1_7_R2.PacketPlayOutEntityTeleport; public class EntityHologramWitherSkull extends EntityWitherSkull implements HologramWitherSkull { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramWitherSkull(World world) { super(world); @@ -106,6 +109,24 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo public void setLocationNMS(double x, double y, double z) { super.setPosition(x, y, z); } + + @Override + public void sendUpdatePacketNear() { + + // Send a packet to update the position. + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(this); + + for (Object obj : this.world.players) { + if (obj instanceof EntityPlayer) { + EntityPlayer nmsPlayer = (EntityPlayer) obj; + + double distanceSquared = nmsPlayer.e(locX, locY, locZ); + if (distanceSquared < 8192 && nmsPlayer.playerConnection != null) { + nmsPlayer.playerConnection.sendPacket(teleportPacket); + } + } + } + } @Override public boolean isDeadNMS() { @@ -125,13 +146,13 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } \ No newline at end of file diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityTouchSlime.java index 4090a819..9d47c2eb 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityTouchSlime.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityTouchSlime.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_7_R2; import org.bukkit.craftbukkit.v1_7_R2.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_R2.EntitySlime; import net.minecraft.server.v1_7_R2.NBTTagCompound; import net.minecraft.server.v1_7_R2.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_7_R2.World; public class EntityTouchSlime extends EntitySlime implements TouchSlime { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityTouchSlime(World world) { super(world); @@ -124,13 +125,13 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/NmsManagerImpl.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/NmsManagerImpl.java index 1550a4f1..c5e1173f 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/NmsManagerImpl.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/NmsManagerImpl.java @@ -1,5 +1,9 @@ package com.gmail.filoghost.holograms.nms.v1_7_R2; +import net.minecraft.server.v1_7_R2.Entity; +import net.minecraft.server.v1_7_R2.EntityTypes; +import net.minecraft.server.v1_7_R2.WorldServer; + import org.bukkit.craftbukkit.v1_7_R2.CraftWorld; import org.bukkit.craftbukkit.v1_7_R2.entity.CraftEntity; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; @@ -9,18 +13,14 @@ 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.HologramComponent; 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.object.HologramBase; import com.gmail.filoghost.holograms.utils.ReflectionUtils; import com.gmail.filoghost.holograms.utils.VersionUtils; -import net.minecraft.server.v1_7_R2.Entity; -import net.minecraft.server.v1_7_R2.EntityTypes; -import net.minecraft.server.v1_7_R2.WorldServer; - public class NmsManagerImpl implements NmsManager { @Override @@ -105,7 +105,7 @@ public class NmsManagerImpl implements NmsManager { } @Override - public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity) { + public HologramBase getParentHologram(org.bukkit.entity.Entity bukkitEntity) { Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); if (nmsEntity instanceof HologramComponent) { @@ -123,6 +123,5 @@ public class NmsManagerImpl implements NmsManager { @Override public boolean hasChatHoverFeature() { return true; - } - + } } 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 e4012fea..e8177937 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 @@ -2,23 +2,27 @@ 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.entity.Player; +import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; 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; import net.minecraft.server.v1_7_R3.World; +import net.minecraft.server.v1_7_R3.EntityHuman; +import net.minecraft.server.v1_7_R3.EntityPlayer; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityCustomItem(World world) { super(world); @@ -40,6 +44,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } } + // Method called when a player is near. + @Override + public void b_(EntityHuman human) { + + if (parent instanceof FloatingItem && human instanceof EntityPlayer) { + + FloatingItem floatingItemParent = (FloatingItem) parent; + if (floatingItemParent.hasPickupHandler()) { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } + + // It is never added to the inventory. + } + } + @Override public void b(NBTTagCompound nbttagcompound) { // Do not save NBT. @@ -119,13 +138,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; + } + + @Override + public void allowPickup(boolean pickup) { + if (pickup) { + super.pickupDelay = 0; + } else { + super.pickupDelay = Integer.MAX_VALUE; + } } - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramHorse.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramHorse.java index bb5b87e8..9d9b71c1 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramHorse.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramHorse.java @@ -3,7 +3,8 @@ package com.gmail.filoghost.holograms.nms.v1_7_R3; import org.bukkit.craftbukkit.v1_7_R3.entity.CraftEntity; import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; -import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R3.EntityHorse; import net.minecraft.server.v1_7_R3.NBTTagCompound; import net.minecraft.server.v1_7_R3.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_7_R3.World; public class EntityHologramHorse extends EntityHorse implements HologramHorse { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramHorse(World world) { super(world); @@ -138,13 +139,12 @@ public class EntityHologramHorse extends EntityHorse implements HologramHorse { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramWitherSkull.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramWitherSkull.java index b493fef5..097ca20c 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramWitherSkull.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityHologramWitherSkull.java @@ -4,16 +4,19 @@ import org.bukkit.craftbukkit.v1_7_R3.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 com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R3.Entity; +import net.minecraft.server.v1_7_R3.EntityPlayer; import net.minecraft.server.v1_7_R3.EntityWitherSkull; import net.minecraft.server.v1_7_R3.NBTTagCompound; +import net.minecraft.server.v1_7_R3.PacketPlayOutEntityTeleport; import net.minecraft.server.v1_7_R3.World; public class EntityHologramWitherSkull extends EntityWitherSkull implements HologramWitherSkull { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramWitherSkull(World world) { super(world); @@ -110,6 +113,24 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo public void setLocationNMS(double x, double y, double z) { super.setPosition(x, y, z); } + + @Override + public void sendUpdatePacketNear() { + + // Send a packet to update the position. + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(this); + + for (Object obj : this.world.players) { + if (obj instanceof EntityPlayer) { + EntityPlayer nmsPlayer = (EntityPlayer) obj; + + double distanceSquared = nmsPlayer.e(locX, locY, locZ); + if (distanceSquared < 8192 && nmsPlayer.playerConnection != null) { + nmsPlayer.playerConnection.sendPacket(teleportPacket); + } + } + } + } @Override public boolean isDeadNMS() { @@ -129,13 +150,12 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - } \ No newline at end of file diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityTouchSlime.java index 71773986..9f43451d 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityTouchSlime.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityTouchSlime.java @@ -3,7 +3,6 @@ package com.gmail.filoghost.holograms.nms.v1_7_R3; import org.bukkit.craftbukkit.v1_7_R3.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_R3.EntitySlime; @@ -13,7 +12,7 @@ import net.minecraft.server.v1_7_R3.World; public class EntityTouchSlime extends EntitySlime implements TouchSlime { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityTouchSlime(World world) { super(world); @@ -91,10 +90,12 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { // Remove sounds. } + @Override public void setLockTick(boolean lock) { lockTick = lock; } + @Override public void die() { setLockTick(false); super.die(); @@ -104,6 +105,7 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { return parent; } + @Override public CraftEntity getBukkitEntity() { if (super.bukkitEntity == null) { this.bukkitEntity = new CraftTouchSlime(this.world.getServer(), this); @@ -127,13 +129,12 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/NmsManagerImpl.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/NmsManagerImpl.java index 4c9554d1..d3918837 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/NmsManagerImpl.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/NmsManagerImpl.java @@ -1,5 +1,9 @@ package com.gmail.filoghost.holograms.nms.v1_7_R3; +import net.minecraft.server.v1_7_R3.Entity; +import net.minecraft.server.v1_7_R3.EntityTypes; +import net.minecraft.server.v1_7_R3.WorldServer; + import org.bukkit.craftbukkit.v1_7_R3.CraftWorld; import org.bukkit.craftbukkit.v1_7_R3.entity.CraftEntity; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; @@ -9,18 +13,14 @@ 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.HologramComponent; 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.object.HologramBase; import com.gmail.filoghost.holograms.utils.ReflectionUtils; import com.gmail.filoghost.holograms.utils.VersionUtils; -import net.minecraft.server.v1_7_R3.Entity; -import net.minecraft.server.v1_7_R3.EntityTypes; -import net.minecraft.server.v1_7_R3.WorldServer; - public class NmsManagerImpl implements NmsManager { @Override @@ -105,7 +105,7 @@ public class NmsManagerImpl implements NmsManager { } @Override - public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity) { + public HologramBase getParentHologram(org.bukkit.entity.Entity bukkitEntity) { Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); if (nmsEntity instanceof HologramComponent) { @@ -123,6 +123,5 @@ public class NmsManagerImpl implements NmsManager { @Override public boolean hasChatHoverFeature() { return true; - } - + } } 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 index 450c63fd..077f42ca 100644 --- 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 @@ -1,24 +1,28 @@ 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.EntityHuman; import net.minecraft.server.v1_7_R4.EntityItem; +import net.minecraft.server.v1_7_R4.EntityPlayer; import net.minecraft.server.v1_7_R4.ItemStack; import net.minecraft.server.v1_7_R4.NBTTagCompound; import net.minecraft.server.v1_7_R4.World; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; +import org.bukkit.entity.Player; + +import com.gmail.filoghost.holograms.api.FloatingItem; +import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; +import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; +import com.gmail.filoghost.holograms.object.HologramBase; + public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { private static final ItemStack STONE = new ItemStack(Blocks.STONE, 0); private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityCustomItem(World world) { super(world); @@ -26,7 +30,7 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } @Override - public void h() { + public void h() { // Checks every 20 ticks. if (ticksLived % 20 == 0) { // The item dies without a vehicle. @@ -40,6 +44,21 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt } } + // Method called when a player is near. + @Override + public void b_(EntityHuman human) { + + if (parent instanceof FloatingItem && human instanceof EntityPlayer) { + + FloatingItem floatingItemParent = (FloatingItem) parent; + if (floatingItemParent.hasPickupHandler()) { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } + + // It is never added to the inventory. + } + } + @Override public void b(NBTTagCompound nbttagcompound) { // Do not save NBT. @@ -117,15 +136,25 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt newItem.count = 0; setItemStack(newItem); } - + + @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; + } + + @Override + public void allowPickup(boolean pickup) { + if (pickup) { + super.pickupDelay = 0; + } else { + super.pickupDelay = Integer.MAX_VALUE; + } } } 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 index 8d3ee3ec..0423ffcc 100644 --- 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 @@ -3,7 +3,8 @@ 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 com.gmail.filoghost.holograms.object.HologramBase; + import net.minecraft.server.v1_7_R4.EntityHorse; import net.minecraft.server.v1_7_R4.NBTTagCompound; import net.minecraft.server.v1_7_R4.World; @@ -11,7 +12,7 @@ import net.minecraft.server.v1_7_R4.World; public class EntityHologramHorse extends EntityHorse implements HologramHorse { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramHorse(World world) { super(world); @@ -138,13 +139,12 @@ public class EntityHologramHorse extends EntityHorse implements HologramHorse { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - } 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 index 862c53c3..c05cdb42 100644 --- 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 @@ -4,7 +4,10 @@ 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 com.gmail.filoghost.holograms.object.HologramBase; + +import net.minecraft.server.v1_7_R4.EntityPlayer; +import net.minecraft.server.v1_7_R4.PacketPlayOutEntityTeleport; import net.minecraft.server.v1_7_R4.Entity; import net.minecraft.server.v1_7_R4.EntityWitherSkull; import net.minecraft.server.v1_7_R4.NBTTagCompound; @@ -13,7 +16,7 @@ import net.minecraft.server.v1_7_R4.World; public class EntityHologramWitherSkull extends EntityWitherSkull implements HologramWitherSkull { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityHologramWitherSkull(World world) { super(world); @@ -108,7 +111,25 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo @Override public void setLocationNMS(double x, double y, double z) { - super.setPosition(x, y, z); + super.setPosition(x, y, z); + } + + @Override + public void sendUpdatePacketNear() { + + // Send a packet to update the position. + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(this); + + for (Object obj : this.world.players) { + if (obj instanceof EntityPlayer) { + EntityPlayer nmsPlayer = (EntityPlayer) obj; + + double distanceSquared = nmsPlayer.e(locX, locY, locZ); + if (distanceSquared < 8192 && nmsPlayer.playerConnection != null) { + nmsPlayer.playerConnection.sendPacket(teleportPacket); + } + } + } } @Override @@ -129,13 +150,12 @@ public class EntityHologramWitherSkull extends EntityWitherSkull implements Holo } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } - } \ 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 index 3389b8b6..e7dd8a1e 100644 --- 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 @@ -3,7 +3,6 @@ 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; @@ -13,7 +12,7 @@ import net.minecraft.server.v1_7_R4.World; public class EntityTouchSlime extends EntitySlime implements TouchSlime { private boolean lockTick; - private CraftHologram parent; + private HologramBase parent; public EntityTouchSlime(World world) { super(world); @@ -91,10 +90,12 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { // Remove sounds. } + @Override public void setLockTick(boolean lock) { lockTick = lock; } + @Override public void die() { setLockTick(false); super.die(); @@ -104,6 +105,7 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { return parent; } + @Override public CraftEntity getBukkitEntity() { if (super.bukkitEntity == null) { this.bukkitEntity = new CraftTouchSlime(this.world.getServer(), this); @@ -127,13 +129,13 @@ public class EntityTouchSlime extends EntitySlime implements TouchSlime { } @Override - public CraftHologram getParentHologram() { + public HologramBase getParentHologram() { return parent; } @Override - public void setParentHologram(CraftHologram hologram) { - this.parent = hologram; + public void setParentHologram(HologramBase base) { + this.parent = base; } } 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 index c8def7d5..912ea1d1 100644 --- 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 @@ -1,5 +1,9 @@ package com.gmail.filoghost.holograms.nms.v1_7_R4; +import net.minecraft.server.v1_7_R4.Entity; +import net.minecraft.server.v1_7_R4.EntityTypes; +import net.minecraft.server.v1_7_R4.WorldServer; + import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; @@ -9,18 +13,14 @@ 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.HologramComponent; 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.object.HologramBase; 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 @@ -105,7 +105,7 @@ public class NmsManagerImpl implements NmsManager { } @Override - public CraftHologram getParentHologram(org.bukkit.entity.Entity bukkitEntity) { + public HologramBase getParentHologram(org.bukkit.entity.Entity bukkitEntity) { Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); if (nmsEntity instanceof HologramComponent) { @@ -123,6 +123,5 @@ public class NmsManagerImpl implements NmsManager { @Override public boolean hasChatHoverFeature() { return true; - } - + } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APICraftHologram.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APICraftHologram.java new file mode 100644 index 00000000..01621cd2 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APICraftHologram.java @@ -0,0 +1,55 @@ +package com.gmail.filoghost.holograms.object; + +import org.bukkit.Location; +import com.gmail.filoghost.holograms.Configuration; +import com.gmail.filoghost.holograms.exception.SpawnFailedException; +import com.gmail.filoghost.holograms.utils.Validator; + +/** + * Exactly like CraftHologram, but without variable replacement (more clean). + */ +public class APICraftHologram extends CraftHologram { + + public APICraftHologram(Location source) { + super("{API-Hologram}", source); + } + + // Just changes this method. + @Override + public boolean forceUpdate() { + + Validator.checkState(!isDeleted(), "Hologram already deleted"); + + // Remove previous entities. + hide(); + + try { + + double lineSpacing = Configuration.verticalLineSpacing; + + // While iterating we change this var. + double currentY = this.y; + + for (String text : textLines) { + + HologramLine lineEntity = new HologramLine(text); + lineEntity.spawn(this, bukkitWorld, x, currentY, z); + linesEntities.add(lineEntity); + + currentY -= lineSpacing; + } + + if (touchHandler != null) { + touchSlimeEntity.spawn(this, bukkitWorld, x, y, z); + } + + } catch (SpawnFailedException ex) { + // Kill the entities and return false. + hide(); + return false; + } + + return true; + } + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIFloatingItemManager.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIFloatingItemManager.java new file mode 100644 index 00000000..f36b2846 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIFloatingItemManager.java @@ -0,0 +1,65 @@ +package com.gmail.filoghost.holograms.object; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.Chunk; +import org.bukkit.plugin.Plugin; + +import com.gmail.filoghost.holograms.api.FloatingItem; + +/** + * This class is only used by the plugin itself. Other plugins should just use the API. + */ + +public class APIFloatingItemManager { + + private static Map> apiFloatingItems = new HashMap>(); + + public static void onChunkLoad(Chunk chunk) { + for (List pluginFloatingItemList : apiFloatingItems.values()) { + for (CraftFloatingItem floatingItem : pluginFloatingItemList) { + if (floatingItem.isInChunk(chunk)) { + floatingItem.forceUpdate(); + } + } + } + } + + public static void onChunkUnload(Chunk chunk) { + for (List pluginFloatingItemList : apiFloatingItems.values()) { + for (CraftFloatingItem floatingItem : pluginFloatingItemList) { + if (floatingItem.isInChunk(chunk)) { + floatingItem.hide(); + } + } + } + } + + public static void addFloatingItem(Plugin plugin, CraftFloatingItem floatingItem) { + List pluginFloatingItemList = apiFloatingItems.get(plugin); + if (pluginFloatingItemList == null) { + pluginFloatingItemList = new ArrayList(); + apiFloatingItems.put(plugin, pluginFloatingItemList); + } + pluginFloatingItemList.add(floatingItem); + } + + public static void remove(FloatingItem floatingItem) { + for (List pluginFloatingItemList : apiFloatingItems.values()) { + pluginFloatingItemList.remove(floatingItem); + } + } + + public static FloatingItem[] getFloatingItems(Plugin plugin) { + List pluginFloatingItemList = apiFloatingItems.get(plugin); + if (pluginFloatingItemList == null) { + return new FloatingItem[0]; + } else { + return pluginFloatingItemList.toArray(new FloatingItem[pluginFloatingItemList.size()]); + // It's a copy of the original list. Floating items should be removed with delete() + } + } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIHologramManager.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIHologramManager.java index 7ccd434c..a5bb7dad 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIHologramManager.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/APIHologramManager.java @@ -59,7 +59,7 @@ public class APIHologramManager { return new Hologram[0]; } else { return pluginHologramList.toArray(new Hologram[pluginHologramList.size()]); - // It's a copy of the original list. Holograms should be removed with hologram.delete() + // It's a copy of the original list. Holograms should be removed with delete() } } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftFloatingItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftFloatingItem.java new file mode 100644 index 00000000..8f5c1075 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftFloatingItem.java @@ -0,0 +1,194 @@ +package com.gmail.filoghost.holograms.object; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import com.gmail.filoghost.holograms.api.FloatingItem; +import com.gmail.filoghost.holograms.api.ItemTouchHandler; +import com.gmail.filoghost.holograms.api.PickupHandler; +import com.gmail.filoghost.holograms.exception.SpawnFailedException; +import com.gmail.filoghost.holograms.object.pieces.FloatingItemDoubleEntity; +import com.gmail.filoghost.holograms.object.pieces.FloatingTouchSlimeDoubleEntity; +import com.gmail.filoghost.holograms.utils.Validator; +import com.gmail.filoghost.holograms.utils.VisibilityManager; + +/** + * This class is only used by the plugin itself. Other plugins should just use the API. + */ + +public class CraftFloatingItem extends HologramBase implements FloatingItem { + + protected FloatingItemDoubleEntity floatingItemDoubleEntity; + protected VisibilityManager visibilityManager; + + protected long creationTimestamp; + + protected FloatingTouchSlimeDoubleEntity touchSlimeEntity; + protected ItemTouchHandler touchHandler; + protected PickupHandler pickupHandler; + + public CraftFloatingItem(Location source, ItemStack itemStack) { + super("{API-FloatingItem}", source); + floatingItemDoubleEntity = new FloatingItemDoubleEntity(itemStack); + touchSlimeEntity = new FloatingTouchSlimeDoubleEntity(); + creationTimestamp = System.currentTimeMillis(); + } + + @Override + public long getCreationTimestamp() { + return creationTimestamp; + } + + public void setVisibilityManager(VisibilityManager visibilityManager) { + this.visibilityManager = visibilityManager; + } + + public boolean hasVisibilityManager() { + return visibilityManager != null; + } + + public VisibilityManager getVisibilityManager() { + return visibilityManager; + } + + @Override + public void setTouchHandler(ItemTouchHandler touchHandler) { + this.touchHandler = touchHandler; + + if (touchHandler != null && !touchSlimeEntity.isSpawned()) { + try { + touchSlimeEntity.spawn(this, bukkitWorld, x, y, z); + } catch (SpawnFailedException e) { } + } else if (touchHandler == null && touchSlimeEntity.isSpawned()) { + touchSlimeEntity.despawn(); + } + } + + @Override + public boolean hasTouchHandler() { + return touchHandler != null; + } + + @Override + public ItemTouchHandler getTouchHandler() { + return touchHandler; + } + + @Override + public void setPickupHandler(PickupHandler handler) { + this.pickupHandler = handler; + + // Allow the item to be pickup up only if there's a PickupHandler. + floatingItemDoubleEntity.setAllowPickup(hasPickupHandler()); + } + + @Override + public PickupHandler getPickupHandler() { + return pickupHandler; + } + + @Override + public boolean hasPickupHandler() { + return pickupHandler != null; + } + + @Override + public boolean update() { + if (isInLoadedChunk()) { + return forceUpdate(); + } + + return true; + } + + /** + * Updates the hologram without checking if it's in a loaded chunk. + */ + public boolean forceUpdate() { + + Validator.checkState(!isDeleted(), "Floating item already deleted"); + + // Remove previous entities. + hide(); + + try { + + floatingItemDoubleEntity.spawn(this, bukkitWorld, x, y, z); + + } catch (SpawnFailedException ex) { + // Kill the entities and return false. + hide(); + return false; + } + + return true; + } + + @Override + public void hide() { + floatingItemDoubleEntity.despawn(); + + if (touchSlimeEntity.isSpawned()) { + touchSlimeEntity.despawn(); + } + } + + @Override + public void onDeleteEvent() { + hide(); + APIFloatingItemManager.remove(this); + } + + @Override + public String toString() { + return "CraftFloatingItem{itemstack=" + floatingItemDoubleEntity.getItemStack().toString() + ",x=" + x + ",y=" + y + ",z=" + z + ",world=" + bukkitWorld.getName() + "}"; + } + + @Override + public void teleport(Location loc) { + if (loc.getWorld().equals(bukkitWorld) && loc.getChunk().isLoaded() && floatingItemDoubleEntity.isSpawned()) { + + /* Conditions: + * - Same world + * - Destination chunk is loaded + * - Entities for this floating are already spawned + * + * Then: + * Send a packet near to update the position, because of this bug: https://bugs.mojang.com/browse/MC-55638 + */ + + + floatingItemDoubleEntity.teleport(loc.getX(), loc.getY(), loc.getZ()); + + if (touchSlimeEntity.isSpawned()) { + touchSlimeEntity.teleport(loc.getX(), loc.getY(), loc.getZ()); + } + setLocation(loc); + + } else { + + boolean wasSpawned = !floatingItemDoubleEntity.isSpawned(); + + // Recreate it completely. + hide(); + setLocation(loc); + + if (wasSpawned) { + update(); + } + } + } + + @Override + public void setItemStack(ItemStack itemstack) { + Validator.notNull(itemstack, "itemStack cannot be null"); + Validator.checkArgument(itemstack.getType() != Material.AIR, "itemStack cannot be AIR"); + floatingItemDoubleEntity.setItemStack(itemstack); + } + + @Override + public ItemStack getItemStack() { + return floatingItemDoubleEntity.getItemStack(); + } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftHologram.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftHologram.java index e8e30269..30da5813 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftHologram.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/CraftHologram.java @@ -14,6 +14,9 @@ import com.gmail.filoghost.holograms.api.TouchHandler; import com.gmail.filoghost.holograms.commands.CommandValidator; import com.gmail.filoghost.holograms.exception.CommandException; import com.gmail.filoghost.holograms.exception.SpawnFailedException; +import com.gmail.filoghost.holograms.object.pieces.FloatingDoubleEntity; +import com.gmail.filoghost.holograms.object.pieces.FloatingItemDoubleEntity; +import com.gmail.filoghost.holograms.object.pieces.FloatingTouchSlimeDoubleEntity; import com.gmail.filoghost.holograms.utils.Validator; import com.gmail.filoghost.holograms.utils.VisibilityManager; @@ -23,21 +26,21 @@ import com.gmail.filoghost.holograms.utils.VisibilityManager; public class CraftHologram extends HologramBase implements Hologram { - private List linesEntities; - private List textLines; + protected List linesEntities; + protected List textLines; - private VisibilityManager visibilityManager; + protected VisibilityManager visibilityManager; - private long creationTimestamp; + protected long creationTimestamp; - private FloatingTouchSlime touchSlimeEntity; - private TouchHandler touchHandler; + protected FloatingTouchSlimeDoubleEntity touchSlimeEntity; + protected TouchHandler touchHandler; public CraftHologram(String name, Location source) { super(name, source); linesEntities = new ArrayList(); textLines = new ArrayList(); - touchSlimeEntity = new FloatingTouchSlime(); + touchSlimeEntity = new FloatingTouchSlimeDoubleEntity(); creationTimestamp = System.currentTimeMillis(); } @@ -161,7 +164,7 @@ public class CraftHologram extends HologramBase implements Hologram { currentY -= 0.27; } - FloatingItem lineEntity = new FloatingItem(icon); + FloatingItemDoubleEntity lineEntity = new FloatingItemDoubleEntity(icon); lineEntity.spawn(this, bukkitWorld, x, currentY, z); linesEntities.add(lineEntity); @@ -215,4 +218,60 @@ public class CraftHologram extends HologramBase implements Hologram { public String toString() { return "CraftHologram{lines=" + textLines.toString() + ",x=" + x + ",y=" + y + ",z=" + z + ",world=" + bukkitWorld.getName() + "}"; } + + @Override + public void teleport(Location loc) { + if (loc.getWorld().equals(bukkitWorld) && loc.getChunk().isLoaded() && !linesEntities.isEmpty()) { + + /* Conditions: + * - Same world + * - Destination chunk is loaded + * - Entities for this hologram are already spawned + * + * Then: + * Send a packet near to update the position, because of this bug: https://bugs.mojang.com/browse/MC-55638 + */ + + double lineSpacing = Configuration.verticalLineSpacing; + + // While iterating we change this var. + double currentY = loc.getY(); + + for (FloatingDoubleEntity lineEntity : linesEntities) { + + if (lineEntity instanceof FloatingItemDoubleEntity) { + + if (currentY != loc.getY()) { + // Extra space for the floating item... + currentY -= 0.27; + } + + lineEntity.teleport(loc.getX(), currentY, loc.getZ()); + currentY -= 0.05; + + } else { + lineEntity.teleport(loc.getX(), currentY, loc.getZ()); + } + + currentY -= lineSpacing; + } + + if (touchSlimeEntity.isSpawned()) { + touchSlimeEntity.teleport(loc.getX(), loc.getY(), loc.getZ()); + } + setLocation(loc); + + } else { + + boolean wasSpawned = !linesEntities.isEmpty(); + + // Recreate it completely. + hide(); + setLocation(loc); + + if (wasSpawned) { + update(); + } + } + } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingDoubleEntity.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingDoubleEntity.java deleted file mode 100644 index 33704684..00000000 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingDoubleEntity.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gmail.filoghost.holograms.object; - -import org.bukkit.World; - -import com.gmail.filoghost.holograms.exception.SpawnFailedException; - -// Represents an object associated with a hologram, made of a wither skull with a passenger. -public abstract class FloatingDoubleEntity { - - public abstract void spawn(CraftHologram parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException; - - public abstract void despawn(); - -} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingItem.java deleted file mode 100644 index ec07a6c6..00000000 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingItem.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gmail.filoghost.holograms.object; - -import org.bukkit.World; -import org.bukkit.inventory.ItemStack; - -import com.gmail.filoghost.holograms.exception.SpawnFailedException; -import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; -import com.gmail.filoghost.holograms.nms.interfaces.HologramWitherSkull; -import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; - -public class FloatingItem extends FloatingDoubleEntity { - - private static final double VERTICAL_OFFSET = -0.21; - - private ItemStack itemStack; - private CustomItem item; - private HologramWitherSkull skull; - - public FloatingItem(ItemStack itemStack) { - this.itemStack = itemStack; - } - - @Override - public void spawn(CraftHologram parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException { - despawn(); - - item = nmsManager.spawnCustomItem(bukkitWorld, x, y + VERTICAL_OFFSET, z, itemStack); - item.setParentHologram(parent); - - skull = nmsManager.spawnHologramWitherSkull(bukkitWorld, x, y + VERTICAL_OFFSET, z); - skull.setParentHologram(parent); - - // Let the item ride the wither skull. - skull.setPassengerNMS(item); - - item.setLockTick(true); - skull.setLockTick(true); - } - - @Override - public void despawn() { - if (item != null) { - item.killEntityNMS(); - item = null; - } - - if (skull != null) { - skull.killEntityNMS(); - skull = null; - } - } -} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramBase.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramBase.java index 73f55bad..543aef4f 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramBase.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramBase.java @@ -90,12 +90,6 @@ public abstract class HologramBase { return deleted; } - public abstract void onDeleteEvent(); - - public abstract boolean update(); - - public abstract void hide(); - public final void setLocation(Location source) { Validator.notNull(source, "location cannot be null"); Validator.notNull(source.getWorld(), "location's world cannot be null"); @@ -108,4 +102,10 @@ public abstract class HologramBase { chunkZ = source.getChunk().getZ(); } + public abstract void onDeleteEvent(); + + public abstract boolean update(); + + public abstract void hide(); + } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramLine.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramLine.java index ffb2f73c..677c1cec 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramLine.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/HologramLine.java @@ -5,6 +5,8 @@ import org.bukkit.World; import com.gmail.filoghost.holograms.exception.SpawnFailedException; import com.gmail.filoghost.holograms.nms.interfaces.HologramHorse; import com.gmail.filoghost.holograms.nms.interfaces.HologramWitherSkull; +import com.gmail.filoghost.holograms.object.pieces.FloatingDoubleEntity; + import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; public class HologramLine extends FloatingDoubleEntity { @@ -24,7 +26,7 @@ public class HologramLine extends FloatingDoubleEntity { } @Override - public void spawn(CraftHologram parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException { + public void spawn(HologramBase parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException { despawn(); horse = nmsManager.spawnHologramHorse(bukkitWorld, x, y + VERTICAL_OFFSET, z); @@ -56,4 +58,12 @@ public class HologramLine extends FloatingDoubleEntity { skull = null; } } + + @Override + public void teleport(double x, double y, double z) { + if (skull != null) { + skull.setLocationNMS(x, y + VERTICAL_OFFSET, z); + skull.sendUpdatePacketNear(); + } + } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingDoubleEntity.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingDoubleEntity.java new file mode 100644 index 00000000..bcafbd01 --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingDoubleEntity.java @@ -0,0 +1,17 @@ +package com.gmail.filoghost.holograms.object.pieces; + +import org.bukkit.World; + +import com.gmail.filoghost.holograms.exception.SpawnFailedException; +import com.gmail.filoghost.holograms.object.HologramBase; + +// Represents an object associated with a hologram, made of a wither skull with a passenger. +public abstract class FloatingDoubleEntity { + + public abstract void spawn(HologramBase parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException; + + public abstract void despawn(); + + public abstract void teleport(double x, double y, double z); + +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingItemDoubleEntity.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingItemDoubleEntity.java new file mode 100644 index 00000000..533b761a --- /dev/null +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingItemDoubleEntity.java @@ -0,0 +1,88 @@ +package com.gmail.filoghost.holograms.object.pieces; + +import org.bukkit.World; +import org.bukkit.inventory.ItemStack; + +import com.gmail.filoghost.holograms.exception.SpawnFailedException; +import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; +import com.gmail.filoghost.holograms.nms.interfaces.HologramWitherSkull; +import com.gmail.filoghost.holograms.object.HologramBase; + +import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; + +public class FloatingItemDoubleEntity extends FloatingDoubleEntity { + + private static final double VERTICAL_OFFSET = -0.21; + + private ItemStack itemStack; + private CustomItem item; + private HologramWitherSkull skull; + + private boolean allowPickup; + + public FloatingItemDoubleEntity(ItemStack itemStack) { + this.itemStack = itemStack; + } + + @Override + public void spawn(HologramBase parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException { + despawn(); + + item = nmsManager.spawnCustomItem(bukkitWorld, x, y + VERTICAL_OFFSET, z, itemStack); + item.setParentHologram(parent); + + item.allowPickup(allowPickup); + + skull = nmsManager.spawnHologramWitherSkull(bukkitWorld, x, y + VERTICAL_OFFSET, z); + skull.setParentHologram(parent); + + // Let the item ride the wither skull. + skull.setPassengerNMS(item); + + item.setLockTick(true); + skull.setLockTick(true); + } + + @Override + public void despawn() { + if (item != null) { + item.killEntityNMS(); + item = null; + } + + if (skull != null) { + skull.killEntityNMS(); + skull = null; + } + } + + public boolean isSpawned() { + return item != null && skull != null; + } + + public ItemStack getItemStack() { + return itemStack; + } + + public void setItemStack(ItemStack itemStack) { + this.itemStack = itemStack; + if (isSpawned()) { + item.setItemStackNMS(itemStack); + } + } + + public void setAllowPickup(boolean allowPickup) { + this.allowPickup = allowPickup; + if (item != null) { + item.allowPickup(allowPickup); + } + } + + @Override + public void teleport(double x, double y, double z) { + if (skull != null) { + skull.setLocationNMS(x, y + VERTICAL_OFFSET, z); + skull.sendUpdatePacketNear(); + } + } +} diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingTouchSlime.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingTouchSlimeDoubleEntity.java similarity index 64% rename from HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingTouchSlime.java rename to HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingTouchSlimeDoubleEntity.java index a96036ab..554e3635 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/object/FloatingTouchSlime.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/object/pieces/FloatingTouchSlimeDoubleEntity.java @@ -1,24 +1,26 @@ -package com.gmail.filoghost.holograms.object; +package com.gmail.filoghost.holograms.object.pieces; import org.bukkit.World; import com.gmail.filoghost.holograms.exception.SpawnFailedException; import com.gmail.filoghost.holograms.nms.interfaces.HologramWitherSkull; import com.gmail.filoghost.holograms.nms.interfaces.TouchSlime; +import com.gmail.filoghost.holograms.object.HologramBase; + import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; -public class FloatingTouchSlime extends FloatingDoubleEntity { +public class FloatingTouchSlimeDoubleEntity extends FloatingDoubleEntity { private static final double VERTICAL_OFFSET = -0.3; private TouchSlime slime; private HologramWitherSkull skull; - public FloatingTouchSlime() { + public FloatingTouchSlimeDoubleEntity() { } @Override - public void spawn(CraftHologram parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException { + public void spawn(HologramBase parent, World bukkitWorld, double x, double y, double z) throws SpawnFailedException { despawn(); slime = nmsManager.spawnTouchSlime(bukkitWorld, x, y + VERTICAL_OFFSET, z); @@ -50,4 +52,12 @@ public class FloatingTouchSlime extends FloatingDoubleEntity { public boolean isSpawned() { return slime != null && skull != null; } + + @Override + public void teleport(double x, double y, double z) { + if (skull != null) { + skull.setLocationNMS(x, y + VERTICAL_OFFSET, z); + skull.sendUpdatePacketNear(); + } + } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java index c13edbe9..1bc0ee31 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java @@ -17,6 +17,8 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedWatchableObject; import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.object.CraftHologram; +import com.gmail.filoghost.holograms.object.HologramBase; + import static com.gmail.filoghost.holograms.HolographicDisplays.nmsManager; public class ProtocolLibHook { @@ -136,6 +138,11 @@ public class ProtocolLibHook { // Horses are always part of a CraftHologram private static CraftHologram getHologram(Entity bukkitEntity) { - return (CraftHologram) nmsManager.getParentHologram(bukkitEntity); + HologramBase base = nmsManager.getParentHologram(bukkitEntity); + if (base instanceof CraftHologram) { + return (CraftHologram) base; + } else { + return null; + } } }