package be.isach.ultracosmetics.cosmetics.mounts; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.UltraCosmeticsData; import be.isach.ultracosmetics.cosmetics.Category; import be.isach.ultracosmetics.cosmetics.Cosmetic; import be.isach.ultracosmetics.cosmetics.Updatable; import be.isach.ultracosmetics.cosmetics.type.MountType; import be.isach.ultracosmetics.player.UltraPlayer; import be.isach.ultracosmetics.util.EntitySpawningManager; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; /** * Represents an instance of a mount summoned by a player. * <p/> * TODO: * - SubObjects: * - HorseMount * * @author iSach * @since 08-03-2015 */ public abstract class Mount<E extends Entity> extends Cosmetic<MountType> implements Updatable { /** * The Entity, if it isn't a Custom Entity. */ public E entity; protected boolean beingRemoved = false; public Mount(UltraPlayer ultraPlayer, MountType type, UltraCosmetics ultraCosmetics) { super(ultraCosmetics, Category.MOUNTS, ultraPlayer, type); } /** * Equips the pet. */ @Override public void onEquip() { if (getOwner().getCurrentMount() != null) { getOwner().removeMount(); } EntitySpawningManager.setBypass(true); this.entity = (E) getPlayer().getWorld().spawnEntity(getPlayer().getLocation(), getType().getEntityType()); EntitySpawningManager.setBypass(false); if (entity instanceof Ageable) { ((Ageable) entity).setAdult(); } else { if (entity instanceof Slime) { ((Slime) entity).setSize(4); } } entity.setCustomNameVisible(true); entity.setCustomName(getType().getName(getPlayer())); entity.setPassenger(getPlayer()); if (entity instanceof Horse) { ((Horse) entity).setDomestication(1); ((Horse) entity).getInventory().setSaddle(new ItemStack(Material.SADDLE)); } runTaskTimerAsynchronously(UltraCosmeticsData.get().getPlugin(), 0, getType().getRepeatDelay()); entity.setMetadata("Mount", new FixedMetadataValue(UltraCosmeticsData.get().getPlugin(), "UltraCosmetics")); getOwner().setCurrentMount(this); } @Override public void run() { try { if (entity.getPassenger() != getPlayer() && entity.getTicksLived() > 10 && !beingRemoved) { clear(); cancel(); return; } if (!entity.isValid()) { cancel(); return; } if (getOwner() != null && Bukkit.getPlayer(getOwnerUniqueId()) != null && getOwner().getCurrentMount() != null && getOwner().getCurrentMount().getType() == getType()) { onUpdate(); } else { cancel(); } } catch (NullPointerException exc) { exc.printStackTrace(); clear(); cancel(); } } @Override protected void onClear() { if (entity != null) { entity.remove(); } getOwner().setCurrentMount(null); try { cancel(); } catch (Exception exc) { //ignore. } } protected void removeEntity() { entity.remove(); } public E getEntity() { return entity; } @EventHandler public void onPlayerToggleSneakEvent(VehicleExitEvent event) { if (event.getVehicle().getType() == EntityType.BOAT || event.getVehicle().getType().toString().contains("MINECART")) { return; } String name = null; try { name = getType().getName(getPlayer()); } catch (Exception e) { } if (name != null && getOwner() != null && getPlayer() != null && getOwner() != null && event.getVehicle() != null && event.getExited() != null && event.getVehicle().getCustomName() != null && event.getVehicle().getCustomName().equals(name) && event.getExited() == getPlayer() && !beingRemoved) { beingRemoved = true; clear(); } } @EventHandler public void onEntityDamage(EntityDamageEvent event) { if (event.getEntity() == getEntity()) { event.setCancelled(true); } if (event.getEntity() == getPlayer() && getOwner().getCurrentMount() != null && getOwner().getCurrentMount().getType() == getType()) { event.setCancelled(true); } } @EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { if (event.getEntity() == getEntity()) event.setCancelled(true); } @EventHandler public void teleportEvent(PlayerTeleportEvent event) { if (getOwner() != null && getPlayer() != null && getOwner().getCurrentMount() == this && event.getPlayer() == getPlayer()) { if ((event.getFrom().getBlockX() != event.getTo().getBlockX() || event.getFrom().getBlockY() != event.getTo().getBlockY() || event.getFrom().getBlockZ() != event.getTo().getBlockZ() || !event.getFrom().getWorld().getName().equalsIgnoreCase(event.getTo().getWorld().getName()))) { //clear(); } } } @EventHandler public void openInv(InventoryOpenEvent event) { if(getType() == MountType.DRUGGEDHORSE || getType() == MountType.ECOLOGISTHORSE || getType() == MountType.GLACIALSTEED || getType() == MountType.INFERNALHORROR || getType() == MountType.MOUNTOFFIRE || getType() == MountType.MOUNTOFWATER || getType() == MountType.WALKINGDEAD || getType() == MountType.RUDOLPH) { if (getOwner() != null && getPlayer() != null && event.getPlayer() == getPlayer() && event.getInventory().equals(((InventoryHolder)entity).getInventory())) { event.setCancelled(true); } } } public void setBeingRemoved(boolean beingRemoved) { this.beingRemoved = beingRemoved; } }