package com.nisovin.magicspells.util; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.bukkit.GameMode; import org.bukkit.entity.Animals; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.Spell; public class ValidTargetList { boolean targetSelf = false; boolean targetPlayers = false; boolean targetInvisibles = false; boolean targetNonPlayers = false; boolean targetMonsters = false; boolean targetAnimals = false; Set<EntityType> types = new HashSet<EntityType>(); public ValidTargetList(Spell spell, String list) { if (list != null) { String[] ss = list.replace(" ", "").split(","); init(spell, Arrays.asList(ss)); } } public ValidTargetList(Spell spell, List<String> list) { if (list != null) { init(spell, list); } } void init(Spell spell, List<String> list) { for (String s : list) { s = s.trim(); if (s.equalsIgnoreCase("self") || s.equalsIgnoreCase("caster")) { targetSelf = true; } else if (s.equalsIgnoreCase("players") || s.equalsIgnoreCase("player")) { targetPlayers = true; } else if (s.equalsIgnoreCase("invisible") || s.equalsIgnoreCase("invisibles")) { targetInvisibles = true; } else if (s.equalsIgnoreCase("nonplayers") || s.equalsIgnoreCase("nonplayer")) { targetNonPlayers = true; } else if (s.equalsIgnoreCase("monsters") || s.equalsIgnoreCase("monster")) { targetMonsters = true; } else if (s.equalsIgnoreCase("animals") || s.equalsIgnoreCase("animal")) { targetAnimals = true; } else { EntityType type = Util.getEntityType(s); if (type != null) { types.add(type); } else { MagicSpells.error("Invalid target type '" + s + "' on spell '" + spell.getInternalName() + "'"); } } } } public ValidTargetList(boolean targetPlayers, boolean targetNonPlayers) { this.targetPlayers = targetPlayers; this.targetNonPlayers = targetNonPlayers; } public boolean canTarget(Player caster, LivingEntity target) { return canTarget(caster, target, targetPlayers); } public boolean canTarget(Player caster, LivingEntity target, boolean targetPlayers) { if (target instanceof Player && ((Player)target).getGameMode() == GameMode.CREATIVE) { return false; } else if (targetSelf && target.equals(caster)) { return true; } else if (!targetSelf && target.equals(caster)) { return false; } else if (!targetInvisibles && target instanceof Player && !caster.canSee((Player)target)) { return false; } else if (targetPlayers && target instanceof Player) { return true; } else if (targetNonPlayers && !(target instanceof Player)) { return true; } else if (targetMonsters && target instanceof Monster) { return true; } else if (targetAnimals && target instanceof Animals) { return true; } else if (types.contains(target.getType())) { return true; } else { return false; } } public boolean canTarget(LivingEntity target) { if (target instanceof Player && ((Player)target).getGameMode() == GameMode.CREATIVE) { return false; } else if (targetPlayers && target instanceof Player) { return true; } else if (targetNonPlayers && !(target instanceof Player)) { return true; } else if (targetMonsters && target instanceof Monster) { return true; } else if (targetAnimals && target instanceof Animals) { return true; } else if (types.contains(target.getType())) { return true; } else { return false; } } public List<LivingEntity> filterTargetList(Player caster, List<Entity> targets) { return filterTargetList(caster, targets, targetPlayers); } public List<LivingEntity> filterTargetList(Player caster, List<Entity> targets, boolean targetPlayers) { List<LivingEntity> realTargets = new ArrayList<LivingEntity>(); for (Entity e : targets) { if (e instanceof LivingEntity && canTarget(caster, (LivingEntity)e, targetPlayers)) { realTargets.add((LivingEntity)e); } } return realTargets; } public boolean canTargetPlayers() { return targetPlayers; } }