package in.twizmwaz.cardinal.module.modules.visibility;
import com.google.common.base.Optional;
import in.twizmwaz.cardinal.Cardinal;
import in.twizmwaz.cardinal.event.CardinalSpawnEvent;
import in.twizmwaz.cardinal.event.MatchEndEvent;
import in.twizmwaz.cardinal.event.MatchStartEvent;
import in.twizmwaz.cardinal.event.PlayerChangeTeamEvent;
import in.twizmwaz.cardinal.event.PlayerSettingChangeEvent;
import in.twizmwaz.cardinal.match.Match;
import in.twizmwaz.cardinal.module.Module;
import in.twizmwaz.cardinal.module.modules.observers.ObserverModule;
import in.twizmwaz.cardinal.module.modules.team.TeamModule;
import in.twizmwaz.cardinal.settings.Settings;
import in.twizmwaz.cardinal.util.Teams;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerJoinEvent;
public class Visibility implements Module {
private final Match match;
protected Visibility(Match match) {
this.match = match;
}
@Override
public void unload() {
HandlerList.unregisterAll(this);
for (Player player : Bukkit.getOnlinePlayers()) {
for (Player otherPlayer : Bukkit.getOnlinePlayers()) {
player.showPlayer(otherPlayer);
}
}
}
public void showOrHideOthers(Player viewer) {
for (Player toSee : Bukkit.getOnlinePlayers()) {
resetVisibility(viewer, toSee, Teams.getTeamByPlayer(toSee));
}
}
public void showOrHide(Player toSee) {
for (Player viewer : Bukkit.getOnlinePlayers()) {
resetVisibility(viewer, toSee, Teams.getTeamByPlayer(toSee));
}
}
private void resetVisibility(Player viewer, Player toSee, Optional<TeamModule> newTeam) {
if (viewer.equals(toSee)) return;
try {
boolean showObs = Settings.getSettingByName("Observers") == null || !Settings.getSettingByName("Observers").getValueByPlayer(viewer).getValue().equalsIgnoreCase("none");
if (match.isRunning()) {
if (ObserverModule.testDead(toSee)) {
setVisibility(viewer, toSee, false);
} else if (ObserverModule.testObserver(viewer)) {
setVisibility(viewer, toSee, !(newTeam.isPresent() && newTeam.get().isObserver() && !showObs));
} else {
setVisibility(viewer, toSee, !(newTeam.isPresent() && newTeam.get().isObserver()));
}
} else {
setVisibility(viewer, toSee, showObs);
}
} catch (NullPointerException e) {
viewer.showPlayer(toSee);
}
}
private void setVisibility(final Player viewer, final Player toSee, boolean shouldSee) {
if (shouldSee) {
viewer.showPlayer(toSee);
} else {
viewer.hidePlayer(toSee);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
for (Player player : Bukkit.getOnlinePlayers()) {
player.hidePlayer(event.getPlayer());
event.getPlayer().hidePlayer(player);
}
showOrHide(event.getPlayer());
showOrHideOthers(event.getPlayer());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onMatchStart(MatchStartEvent event) {
for (Player player : Bukkit.getOnlinePlayers()) {
showOrHide(player);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerRespawn(CardinalSpawnEvent event) {
final Player player = event.getPlayer();
for (Player viewer : Bukkit.getOnlinePlayers()) {
setVisibility(viewer, player, false);
}
Bukkit.getScheduler().scheduleSyncDelayedTask(Cardinal.getInstance(), new Runnable() {
@Override
public void run() {
showOrHide(player);
}
}, 5L);
}
@EventHandler(priority = EventPriority.MONITOR)
public void onMatchEnd(MatchEndEvent event) {
for (Player player : Bukkit.getOnlinePlayers()) {
showOrHide(player);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerChangeTeam(PlayerChangeTeamEvent event) {
Player switched = event.getPlayer();
showOrHide(switched);
showOrHideOthers(switched);
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerVisibilityChange(PlayerSettingChangeEvent event) {
if (!event.getSetting().equals(Settings.getSettingByName("Observers"))) return;
showOrHideOthers(event.getPlayer());
}
}