package com.nisovin.magicspells.teams; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.bukkit.configuration.Configuration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.events.MagicSpellsLoadedEvent; import com.nisovin.magicspells.events.SpellTargetEvent; public class MagicSpellsTeams extends JavaPlugin implements Listener { private boolean useCache; private boolean clearCacheOnDeath; private List<Team> teams; private Map<String, Team> teamNames; private Map<String, Team> playerTeams; @Override public void onEnable() { // setup containers teams = new ArrayList<Team>(); teamNames = new HashMap<String, Team>(); playerTeams = new HashMap<String, Team>(); // get config File file = new File(getDataFolder(), "config.yml"); if (!file.exists()) { saveDefaultConfig(); } reloadConfig(); Configuration config = getConfig(); // get config useCache = config.getBoolean("use-cache", true); clearCacheOnDeath = config.getBoolean("clear-cache-on-death", false); // setup teams MagicSpells.debug(1, "Loading teams..."); Set<String> teamKeys = config.getConfigurationSection("teams").getKeys(false); for (String name : teamKeys) { Team team = new Team(config.getConfigurationSection("teams." + name), name); teams.add(team); teamNames.put(name, team); MagicSpells.debug(2, " Team " + name + " loaded"); } for (Team team : teams) { team.initialize(this); } // register events getServer().getPluginManager().registerEvents(this, this); } @Override public void onDisable() { teams = null; teamNames = null; playerTeams = null; HandlerList.unregisterAll((Plugin)this); } @EventHandler(ignoreCancelled=true) public void onSpellTarget(SpellTargetEvent event) { if (event.getCaster() != null && event.getTarget() instanceof Player) { boolean beneficial = event.getSpell().isBeneficial(); if (!canTarget(event.getCaster(), (Player)event.getTarget())) { if (!beneficial) { event.setCancelled(true); } } else { if (beneficial) { event.setCancelled(true); } } } } @EventHandler public void onMagicSpellsLoad(MagicSpellsLoadedEvent event) { onDisable(); onEnable(); } @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { if (useCache) { playerTeams.remove(event.getPlayer().getName()); } } @EventHandler public void onPlayerDeath(PlayerDeathEvent event) { if (useCache && clearCacheOnDeath) { playerTeams.remove(event.getEntity().getName()); } } public Team getTeam(Player player) { if (useCache) { Team team = playerTeams.get(player.getName()); if (team != null) { return team; } } for (Team team : teams) { if (team.inTeam(player)) { if (useCache) { playerTeams.put(player.getName(), team); } return team; } } return null; } public boolean canTarget(Player caster, Player target) { Team casterTeam = getTeam(caster); Team targetTeam = getTeam(target); // allow targeting if one of the players is not in a team if (casterTeam == null || targetTeam == null) { return true; } // if same team, check friendly fire if (casterTeam == targetTeam) { return casterTeam.allowFriendlyFire(); } // otherwise check if can target return casterTeam.canTarget(targetTeam); } public Team getTeamByName(String name) { return teamNames.get(name); } }