package be.isach.ultracosmetics.cosmetics.gadgets;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.config.SettingsManager;
import be.isach.ultracosmetics.cosmetics.type.GadgetType;
import be.isach.ultracosmetics.util.*;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.EnderPearl;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.vehicle.VehicleDestroyEvent;
import java.util.*;
/**
* Represents an instance of a paintball gun gadget summoned by a player.
*
* @author iSach
* @since 08-03-2015
*/
public class GadgetPaintballGun extends Gadget implements Listener {
Map<UUID, ArrayList<Projectile>> projectiles = new HashMap<>();
int radius = 2;
public GadgetPaintballGun(UltraPlayer owner, UltraCosmetics ultraCosmetics) {
super(owner, GadgetType.PAINTBALLGUN, ultraCosmetics);
if (owner != null) {
radius = SettingsManager.getConfig().getInt("Gadgets." + getType().getConfigName() + ".Radius");
}
displayCooldownMessage = false;
}
@Override
void onRightClick() {
Projectile projectile = getPlayer().launchProjectile(EnderPearl.class, getPlayer().getLocation().getDirection().multiply(2));
if (projectiles.containsKey(getOwnerUniqueId()))
projectiles.get(getOwnerUniqueId()).add(projectile);
else {
ArrayList<Projectile> projectilesList = new ArrayList<>();
projectilesList.add(projectile);
projectiles.put(getOwnerUniqueId(), projectilesList);
}
SoundUtil.playSound(getPlayer(), Sounds.CHICKEN_EGG_POP, 1.5f, 1.2f);
}
public boolean mapContainsProjectile(Projectile projectile) {
for (ArrayList<Projectile> plist : projectiles.values()) {
if (plist.contains(projectile)) return true;
}
return false;
}
@EventHandler
public void onVehicleDestroy(VehicleDestroyEvent event) {
for (ArrayList<Projectile> projectile : projectiles.values()) {
for (Projectile proj : projectile) {
if (proj.getLocation().distance(event.getVehicle().getLocation()) < 10) {
event.setCancelled(true);
}
}
}
}
@EventHandler
public void onItemFrameBreak(HangingBreakByEntityEvent event) {
if (event.getRemover() instanceof Projectile) {
if (mapContainsProjectile((Projectile) event.getRemover())) {
event.setCancelled(true);
}
} else if (event.getRemover() == getPlayer())
event.setCancelled(true);
}
public void removeProjectile(Projectile projectile) {
for (UUID uuid : projectiles.keySet()) {
ArrayList<Projectile> plist = projectiles.get(uuid);
if (plist.contains(projectile)) {
plist.remove(projectile);
if (plist.isEmpty())
projectiles.remove(uuid);
return;
}
}
}
@EventHandler
public void onProjectileHit(ProjectileHitEvent event) {
if (event.getEntity().getType() != EntityType.ENDER_PEARL) return;
if (mapContainsProjectile(event.getEntity())) {
removeProjectile(event.getEntity());
Random r = new Random();
byte b = (byte) r.nextInt(15);
Location center = event.getEntity().getLocation().add(event.getEntity().getVelocity());
for (Block block : BlockUtils.getBlocksInRadius(center.getBlock().getLocation(), radius, false)) {
BlockUtils.setToRestore(block, Material.getMaterial((String) SettingsManager.getConfig().get("Gadgets." + getType().getConfigName() + ".Block-Type")), b, 20 * 3);
}
if (SettingsManager.getConfig().getBoolean("Gadgets." + getType().getConfigName() + ".Particle.Enabled")) {
Particles effect = Particles.valueOf((SettingsManager.getConfig().getString("Gadgets." + getType().getConfigName() + ".Particle.Effect")).replace("_", ""));
UtilParticles.display(effect, 2.5, 0.2f, 2.5f, center.clone().add(0.5f, 1.2f, 0.5F), 50);
}
event.getEntity().remove();
}
}
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager().getType() != EntityType.ENDER_PEARL) return;
if (mapContainsProjectile((Projectile) event.getDamager()))
event.setCancelled(true);
}
@EventHandler
public void onEntityTeleport(PlayerTeleportEvent event) {
UUID uuid = event.getPlayer().getUniqueId();
if (projectiles.containsKey(uuid)) {
event.setCancelled(true);
}
}
@Override
public void onUpdate() {
}
@EventHandler
public void onCreatureSpawn(CreatureSpawnEvent event) {
if (event.getEntity().getType() == EntityType.ENDERMITE)
event.setCancelled(true);
}
@Override
public void onClear() {
for (ArrayList<Projectile> list : projectiles.values()) {
for (Projectile projectile : list) {
projectile.remove();
}
}
}
@Override
void onLeftClick() {
}
}