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.*; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.util.Vector; /** * Represents an instance of a flying ship mount. * * @author iSach * @author Matthew * @since 01-23-2016 */ public class MountFlyingShip extends Mount<Boat> { long nextAllowTime = 0; Entity currentboom = null; public MountFlyingShip(UltraPlayer owner, UltraCosmetics ultraCosmetics) { super(owner, MountType.FLYINGSHIP, ultraCosmetics); } @Override public void onUpdate() { if (entity.getPassenger() == null) clear(); Vector vector = getPlayer().getLocation().toVector(); double rotX = getPlayer().getLocation().getYaw(); double rotY = getPlayer().getLocation().getPitch(); vector.setY(-Math.sin(Math.toRadians(rotY))); double h = Math.cos(Math.toRadians(rotY)); vector.setX(-h * Math.sin(Math.toRadians(rotX))); vector.setZ(h * Math.cos(Math.toRadians(rotX))); UltraCosmeticsData.get().getVersionManager().getEntityUtil().moveShip(getPlayer(), entity, vector); if (currentboom != null) { if (currentboom.isDead()) { currentboom = null; return; } SoundUtil.playSound(getPlayer(), Sounds.NOTE_STICKS); if (currentboom.isOnGround()) { Location l = currentboom.getLocation().clone(); for (Entity i : currentboom.getNearbyEntities(3, 3, 3)) { double dX = i.getLocation().getX() - currentboom.getLocation().getX(); double dY = i.getLocation().getY() - currentboom.getLocation().getY(); double dZ = i.getLocation().getZ() - currentboom.getLocation().getZ(); double yaw = Math.atan2(dZ, dX); double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI; double X = Math.sin(pitch) * Math.cos(yaw); double Y = Math.sin(pitch) * Math.sin(yaw); double Z = Math.cos(pitch); MathUtils.applyVelocity(i, new Vector(X, Z, Y).multiply(1.3D).add(new Vector(0, 1.4D, 0))); } UtilParticles.display(Particles.EXPLOSION_HUGE, l); SoundUtil.playSound(l, Sounds.EXPLODE); currentboom.remove(); currentboom = null; } } } @EventHandler public void stopBoatDamage(EntityExplodeEvent event) { if (event.getEntity() == entity) event.setCancelled(true); } @EventHandler public void onInteractEvent(PlayerInteractEvent event) { if (event.getAction() == Action.PHYSICAL) { return; } if (event.getPlayer() != getPlayer()) { return; } if (event.getPlayer().getVehicle() == null || event.getPlayer().getVehicle() != entity) { return; } if (System.currentTimeMillis() < nextAllowTime) { SoundUtil.playSound(getPlayer().getLocation(), Sounds.ITEM_PICKUP, 1.0f, 1.0f); return; } SoundUtil.playSound(getPlayer(), Sounds.NOTE_STICKS, 1.0f, 1.0f); nextAllowTime = System.currentTimeMillis() + 10000; currentboom = getPlayer().getWorld().spawnEntity(getPlayer().getLocation(), EntityType.PRIMED_TNT); currentboom.setCustomName(ChatColor.RED + ChatColor.BOLD.toString() + "!!!!!!!"); currentboom.setCustomNameVisible(true); if (currentboom instanceof LivingEntity) { ((LivingEntity) currentboom).setNoDamageTicks(-1); if (currentboom instanceof Animals) { ((Animals) currentboom).setBreed(false); } } } @EventHandler public void onEntityDamage(EntityDamageByEntityEvent event) { if (event.getDamager() == entity) { event.setCancelled(true); } } @EventHandler public void onBoatBreak(VehicleDestroyEvent event) { if (event.getVehicle() == entity) { event.setCancelled(true); } } @Override public void onClear() { if (currentboom != null) { currentboom.remove(); } super.onClear(); } }