package tc.oc.pgm.ghostsquadron; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Map; import org.bukkit.Effect; import org.bukkit.Location; import tc.oc.api.docs.PlayerId; import tc.oc.api.docs.UserId; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.classes.ClassMatchModule; public class GhostSquadronTask implements Runnable { public GhostSquadronTask(Match match, GhostSquadronMatchModule matchModule, ClassMatchModule classMatchModule) { this.match = checkNotNull(match, "match"); this.matchModule = checkNotNull(matchModule, "ghost squadron match module"); this.classMatchModule = checkNotNull(classMatchModule, "class match module"); } @Override public void run() { for(UserId userId : this.classMatchModule.getClassMembers(this.matchModule.trackerClass)) { MatchPlayer player = this.match.getPlayer(userId); if(player == null) continue; MatchPlayer closestEnemy = player; double closestRadiusSq = Double.MAX_VALUE; for(MatchPlayer enemy : this.matchModule.getMatch().getParticipatingPlayers()) { if(enemy.getParty() == player.getParty()) continue; double radiusSq = enemy.getBukkit().getLocation().distanceSquared(player.getBukkit().getLocation()); if(radiusSq < closestRadiusSq) { closestEnemy = enemy; closestRadiusSq = radiusSq; } } player.getBukkit().setCompassTarget(closestEnemy.getBukkit().getLocation()); } for(Map.Entry<Location, PlayerId> entry : this.matchModule.landmines.entrySet()) { MatchPlayer player = this.match.getPlayer(entry.getValue()); Location loc = entry.getKey(); if(player == null) continue; for(MatchPlayer enemy : this.match.getPlayers()) { enemy.getBukkit().playEffect(loc.clone().add(0, .7, 0), Effect.VILLAGER_THUNDERCLOUD, 0, 0, 0f, 0f, 0f, 0f, 1, 3); } } for(UserId userId : this.classMatchModule.getClassMembers(this.matchModule.spiderClass)) { MatchPlayer player = this.match.getPlayer(userId); if(player == null) continue; for(MatchPlayer enemy : this.matchModule.getMatch().getParticipatingPlayers()) { if(enemy.getParty() == player.getParty()) continue; if(enemy.getBukkit().getLocation().distanceSquared(player.getBukkit().getLocation()) < GhostSquadron.SPIDER_SENSE_RADIUS_SQ) { this.matchModule.spideySense(player); break; } } } } final Match match; final GhostSquadronMatchModule matchModule; final ClassMatchModule classMatchModule; }