package be.isach.ultracosmetics.cosmetics.mounts; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.UltraCosmeticsData; import be.isach.ultracosmetics.cosmetics.type.MountType; import be.isach.ultracosmetics.player.UltraPlayer; import be.isach.ultracosmetics.util.MathUtils; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.HashMap; /** * Represents an instance of a snake mount. * * @author iSach * @since 08-10-2015 */ public class MountSnake extends Mount<Sheep> { private HashMap<Player, ArrayList<Entity>> tailMap = new HashMap<Player, ArrayList<Entity>>(); private int color = 1; public MountSnake(UltraPlayer owner, UltraCosmetics ultraCosmetics) { super(owner, MountType.SNAKE, ultraCosmetics); } @Override public void onEquip() { super.onEquip(); color = MathUtils.randomRangeInt(0, 14); ((LivingEntity) entity).setNoDamageTicks(Integer.MAX_VALUE); ((Sheep) entity).setColor(DyeColor.values()[color]); tailMap.put(getPlayer(), new ArrayList()); ((ArrayList) tailMap.get(getPlayer())).add(entity); addSheepToTail(4); } @Override public void onClear() { super.onClear(); for (Player p : tailMap.keySet()) for (Entity ent : tailMap.get(p)) ent.remove(); tailMap.clear(); } @Override public void onUpdate() { if (getPlayer() != null) Bukkit.getScheduler().runTask(getUltraCosmetics(), new Runnable() { @Override public void run() { if (getPlayer() != null) { Vector vel = getPlayer().getLocation().getDirection().setY(0).normalize().multiply(4); Creature before = null; for (int i = 0; i < ((ArrayList) tailMap.get(getPlayer())).size(); i++) { Creature tail = (Creature) ((ArrayList) tailMap.get(getPlayer())).get(i); Location loc = getPlayer().getLocation().add(vel); if (i == 0) loc = tail.getLocation().add(vel); if (before != null) loc = before.getLocation(); if (loc.toVector().subtract(tail.getLocation().toVector()).length() > 12.0D) loc = tail.getLocation().add(traj(tail.getLocation(), loc).multiply(12)); if (before != null) { Location tp = before.getLocation().add(traj2D(before, tail).multiply(1.4D)); tp.setPitch(tail.getLocation().getPitch()); tp.setYaw(tail.getLocation().getYaw()); tail.teleport(tp); } UltraCosmeticsData.get().getVersionManager().getEntityUtil().move(tail, loc); before = tail; } } } }); } public Vector traj2D(Entity a, Entity b) { return b.getLocation().toVector().subtract(a.getLocation().toVector()).setY(0).normalize(); } public Vector traj(Location a, Location b) { return b.toVector().subtract(a.toVector()).setY(0).normalize(); } public Vector traj(Entity a, Entity b) { return b.getLocation().toVector().subtract(a.getLocation().toVector()).setY(0).normalize(); } public void addSheepToTail(int amount) { Player player = getPlayer(); for (int i = 0; i < amount; i++) { Location loc = player.getLocation(); if (!((ArrayList) tailMap.get(player)).isEmpty()) { loc = ((Creature) ((ArrayList) tailMap.get(player)).get(((ArrayList) tailMap.get(player)).size() - 1)).getLocation(); } if (((ArrayList) tailMap.get(player)).size() > 1) { loc.add(traj((Entity) ((ArrayList) tailMap.get(player)).get(((ArrayList) tailMap.get(player)).size() - 2), (Entity) ((ArrayList) tailMap.get(player)).get(((ArrayList) tailMap.get(player)).size() - 1))); } else { loc.subtract(player.getLocation().getDirection().setY(0)); } Sheep tail = (loc.getWorld().spawn(loc, Sheep.class)); tail.setNoDamageTicks(Integer.MAX_VALUE); tail.setRemoveWhenFarAway(false); tail.teleport(loc); ((ArrayList) tailMap.get(player)).add(tail); tail.setColor(DyeColor.values()[color]); /*if (tail != ent) tail.setPassenger(tail.getWorld().spawnEntity(tail.getLocation(), EntityType.MINECART)); */ } } @EventHandler public void onEntityDamage(EntityDamageEvent event) { try { if (tailMap.get(getPlayer()).contains(event.getEntity())) event.setCancelled(true); } catch (Exception exc) { } } }