package de.tobiyas.racesandclasses.util.friend; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.APIs.GroupAPI; import de.tobiyas.racesandclasses.util.bukkit.versioning.compatibility.CompatibilityModifier.Shooter; public class EnemyChecker implements Listener { private static EnemyChecker checker; public EnemyChecker() { Bukkit.getPluginManager().registerEvents(this, RacesAndClasses.getPlugin()); } @EventHandler(priority = EventPriority.HIGHEST) public void entityDamage(EntityDamageByEntityEvent event){ if(event instanceof FriendDetectEvent) { ((FriendDetectEvent) event).realCancle = event.isCancelled(); event.setCancelled(true); } } public static class FriendDetectEvent extends EntityDamageByEntityEvent{ boolean realCancle = false; @SuppressWarnings("deprecation") //still safe. public FriendDetectEvent(Entity damager, Entity damagee) { super(damager, damagee, DamageCause.CUSTOM, 0.1); } } /** * Checks if the these 2 are Allies. * * @param attacker to check * @param receiver to check * * @return true if they are allies. */ public static boolean areAllies(Entity attacker, Entity receiver){ if(checker == null) checker = new EnemyChecker(); if(attacker == null || receiver == null) return false; if(attacker instanceof Projectile){ attacker = Shooter.getShooter((Projectile) attacker); if(attacker == null) return false; } //Check if is in Group: if(attacker instanceof Player && receiver instanceof Player){ Player p1 = (Player) attacker; Player p2 = (Player) receiver; //Check if in same Group! if(GroupAPI.isInSameGroup(p1, p2)) return true; } FriendDetectEvent event = new FriendDetectEvent(attacker, receiver); RacesAndClasses.getPlugin().fireEventToBukkit(event); //only check cancles! return event.realCancle; } /** * Checks if the these 2 are enemies. * * @param attacker to check * @param receiver to check * * @return true if they are enemies. */ public static boolean areEnemies(Entity attacker, Entity receiver){ return !areAllies(attacker, receiver); } /** * Checks if the these 2 are enemies. * * @param attacker to check * @param receiver to check * * @return true if they are enemies. */ public static boolean isApplyable(Entity attacker, Entity receiver, TargetType type){ switch(type){ case ENEMY: return areEnemies(attacker, receiver); case FRIEND: return areAllies(attacker, receiver); case ALL: return true; default: return false; } } }