package be.isach.ultracosmetics.cosmetics.gadgets; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.player.UltraPlayer; import be.isach.ultracosmetics.cosmetics.type.GadgetType; import be.isach.ultracosmetics.util.*; import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.List; /** * Represents an instance of a TNT gadget summoned by a player. * * @author iSach * @since 08-17-2015 */ public class GadgetTNT extends Gadget { List<Entity> entities = new ArrayList<>(); public GadgetTNT(UltraPlayer owner, UltraCosmetics ultraCosmetics) { super(owner, GadgetType.TNT, ultraCosmetics); } @Override void onRightClick() { TNTPrimed tnt = getPlayer().getWorld().spawn(getPlayer().getLocation().add(0, 2, 0), TNTPrimed.class); // Vector stuff tnt.setFuseTicks(20); tnt.setVelocity(getPlayer().getLocation().getDirection().multiply(0.854321)); entities.add(tnt); } @EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { if (entities.contains(event.getDamager())) { event.setCancelled(true); } } @EventHandler public void onItemFrameBreak(HangingBreakEvent event) { for (Entity ent : entities) { if(ent.getWorld() != event.getEntity().getWorld()) continue; if (ent.getLocation().distance(event.getEntity().getLocation()) < 15) event.setCancelled(true); } } @EventHandler public void onVehicleDestroy(VehicleDestroyEvent event) { for (Entity tnt : entities) { if(tnt.getWorld() != event.getVehicle().getWorld()) continue; if (tnt.getLocation().distance(event.getVehicle().getLocation()) < 10) { event.setCancelled(true); } } } @EventHandler public void onEntityExplode(EntityExplodeEvent event) { if (entities.contains(event.getEntity())) { event.setCancelled(true); UtilParticles.display(Particles.EXPLOSION_HUGE, event.getEntity().getLocation()); SoundUtil.playSound(getPlayer(), Sounds.EXPLODE, 1.4f, 1.5f); for (Entity ent : event.getEntity().getNearbyEntities(3, 3, 3)) { if (ent instanceof Creature || ent instanceof Player) { double dX = event.getEntity().getLocation().getX() - ent.getLocation().getX(); double dY = event.getEntity().getLocation().getY() - ent.getLocation().getY(); double dZ = event.getEntity().getLocation().getZ() - ent.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); Vector vector = new Vector(X, Z, Y); if (affectPlayers) MathUtils.applyVelocity(ent, vector.multiply(1.3D).add(new Vector(0, 1.4D, 0))); } } entities.remove(event.getEntity()); } } @Override void onLeftClick() { } @Override public void onUpdate() { } @Override public void onClear() { for (Entity ent : entities) ent.remove(); HandlerList.unregisterAll(this); } }