package net.clouder7.magicitems;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.*;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Listeners implements Listener {
List<Player> shooters = new ArrayList<Player>();
HashMap<Player, WitherSkull> pws = new HashMap<>();
HashMap<Fireball, Player> pf = new HashMap<>();
HashMap<Player, Vector> pv = new HashMap<>();
@EventHandler
public void PlayerInteract(PlayerInteractEvent e) {
if (!e.getAction().equals(Action.RIGHT_CLICK_AIR)) return;
for (String keys : Main.getConfiguration().getConfigurationSection("magicItems").getKeys(false)) {
if (MagicItemManager.equals(keys, e.getItem())) {
if (MagicItemManager.countdowns.contains(MagicItemManager.getCountdown(e.getPlayer()))) {
e.getPlayer().sendMessage(ChatColor.YELLOW + "Ты уже недавно использовал такой предмет!");
return;
}
MagicItemManager.countdowns.add(new MagicItemManager.Countdown(e.getPlayer(),
MagicItemManager.getMagicItem(keys).getDelay()));
Location loc = e.getPlayer().getEyeLocation().toVector().add(e.getPlayer().getLocation()
.getDirection().multiply(2)).toLocation(e.getPlayer().getWorld(),
e.getPlayer().getLocation().getYaw(), e.getPlayer().getLocation().getPitch());
switch (MagicItemManager.getMagicItem(keys).getEffect()) {
case LIGHTNING:
Fireball f = e.getPlayer().getWorld().spawn(loc, Fireball.class);
if (pf.containsKey(e.getPlayer()))
pf.remove(e.getPlayer());
pf.put(f, e.getPlayer());
if (!shooters.contains(e.getPlayer()))
shooters.add(e.getPlayer());
f.setVelocity(e.getPlayer().getEyeLocation().getDirection().multiply(2));
break;
case REPULSION:
Snowball s = e.getPlayer().getWorld().spawn(loc, Snowball.class);
s.setShooter(e.getPlayer());
if (pv.containsKey(e.getPlayer()))
pv.remove(e.getPlayer());
pv.put(e.getPlayer(), e.getPlayer().getLocation().getDirection().normalize());
if (!shooters.contains(e.getPlayer()))
shooters.add(e.getPlayer());
s.setVelocity(e.getPlayer().getEyeLocation().getDirection().multiply(2));
break;
case TELEPORTER:
e.getPlayer().launchProjectile(EnderPearl.class);
if (!shooters.contains(e.getPlayer()))
shooters.add(e.getPlayer());
break;
case WITHERSKULL:
WitherSkull ws = e.getPlayer().getWorld().spawn(loc, WitherSkull.class);
if (pws.containsKey(e.getPlayer()))
pws.remove(e.getPlayer());
pws.put(e.getPlayer(), ws);
if (!shooters.contains(e.getPlayer()))
shooters.add(e.getPlayer());
ws.setShooter(e.getPlayer());
ws.setVelocity(e.getPlayer().getEyeLocation().getDirection().multiply(2));
break;
default:
e.getPlayer().sendMessage(ChatColor.RED + "Ошибка! Эффект для предмета " + ChatColor.GOLD
+ keys + ChatColor.RED + " не установлен или отсутствует!");
break;
}
}
}
}
@EventHandler
public void PlayerTeleport(PlayerTeleportEvent e) {
if(e.getCause().equals(PlayerTeleportEvent.TeleportCause.ENDER_PEARL) &&
shooters.contains(e.getPlayer())) {
shooters.remove(e.getPlayer());
e.setCancelled(true);
}
}
public boolean canPvP(Location location) {
if (Main.getWG() == null) {
return true;
}
return Main.getWG().getRegionManager(location.getWorld()).getApplicableRegions(location).allows(DefaultFlag.PVP);
}
@EventHandler
public void EntityDamageByEntity(EntityDamageByEntityEvent e) {
if (!canPvP(e.getEntity().getLocation())) return;
if (e.getEntity().getType() == EntityType.PLAYER) {
if (e.getDamager() instanceof Fireball) {
Fireball f = (Fireball) e.getDamager();
if (pf.containsKey(f) && shooters.contains(pf.get(f))) {
final Player a = (Player) e.getEntity();
a.damage(6); //Забирает 3 сердечка
shooters.remove(pf.get(f));
for (Player p : Bukkit.getOnlinePlayers())
try {
ParticleEffects.HUGE_EXPLOSION.sendToPlayer(p, e.getEntity().getLocation(), 1, 1, 1, 12F, 1);
} catch (Exception e1) {
e1.printStackTrace();
}
Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(),
new Runnable() {
@Override
public void run() {
a.getWorld().strikeLightning(a.getLocation());
}
}, 40L);
}
}
if (e.getDamager().getType() == EntityType.WITHER_SKULL && pws.containsKey(((WitherSkull) e.getDamager()).getShooter())
|| e.getDamager().getType() == EntityType.PLAYER && pws.containsKey(e.getDamager())) {
if (((Player) e.getEntity()).getActivePotionEffects().contains(PotionEffectType.WITHER))
((Player) e.getEntity()).removePotionEffect(PotionEffectType.WITHER);
((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 200, 4));
shooters.remove(e.getDamager());
((Player) e.getEntity()).damage(10); //Забирает 5 сердечка
}
if (e.getDamager() instanceof EnderPearl) {
EnderPearl ep = (EnderPearl) e.getDamager();
if (ep.getShooter() instanceof Player && shooters.contains(ep.getShooter())) {
HashMap<Player, Location> b = new HashMap<Player, Location>();
b.put((Player) e.getEntity(), e.getEntity().getLocation());
b.put((Player) ep.getShooter(), ep.getShooter().getLocation());
e.getEntity().teleport(b.get((Player) ep.getShooter()));
ep.getShooter().teleport(b.get((Player) e.getEntity()));
b.clear();
for (Player p : Bukkit.getOnlinePlayers())
try {
ParticleEffects.PORTAL.sendToPlayer(p, e.getEntity().getLocation(), 2, 2, 2, 12F, 50);
} catch (Exception e1) {
e1.printStackTrace();
}
}
if (shooters.contains(ep.getShooter()))
shooters.remove(ep.getShooter());
e.setCancelled(true);
}
if (e.getDamager() instanceof Snowball) {
Snowball s = (Snowball) e.getDamager();
if (s.getShooter() instanceof Player && shooters.contains(s.getShooter())) {
Player a = (Player) e.getEntity();
a.setVelocity(pv.get(s.getShooter()).setY(0.3).multiply(4));
pv.remove(s.getShooter());
for (Player p : Bukkit.getOnlinePlayers()) {
try {
ParticleEffects.FLAME.sendToPlayer(p, a.getLocation(), 1, 1, 1, 0F, 10);
ParticleEffects.PORTAL.sendToPlayer(p, a.getLocation(), 2, 2, 2, 0F, 10);
} catch (Exception e1) {
e1.printStackTrace();
}
}
shooters.remove(s.getShooter());
a.damage(6); //Забирает 3 сердечка
}
}
}
}
}