193 lines
6.7 KiB
Java
193 lines
6.7 KiB
Java
|
package tc.oc.pgm.tablist;
|
||
|
|
||
|
import org.bukkit.entity.Player;
|
||
|
import org.bukkit.event.EventException;
|
||
|
import org.bukkit.event.EventHandler;
|
||
|
import org.bukkit.event.EventPriority;
|
||
|
import org.bukkit.event.HandlerList;
|
||
|
import org.bukkit.event.Listener;
|
||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||
|
import org.bukkit.plugin.Plugin;
|
||
|
import org.bukkit.scheduler.BukkitTask;
|
||
|
import tc.oc.commons.bukkit.tablist.PlayerTabEntry;
|
||
|
import tc.oc.commons.bukkit.tablist.TabManager;
|
||
|
import tc.oc.pgm.events.PlayerChangePartyEvent;
|
||
|
import tc.oc.pgm.match.Match;
|
||
|
import tc.oc.pgm.match.MatchPlayer;
|
||
|
import tc.oc.pgm.ffa.Tribute;
|
||
|
import tc.oc.pgm.events.MatchPlayerDeathEvent;
|
||
|
import tc.oc.pgm.events.PlayerPartyChangeEvent;
|
||
|
import tc.oc.pgm.ffa.events.MatchResizeEvent;
|
||
|
import tc.oc.pgm.spawns.events.ParticipantSpawnEvent;
|
||
|
import tc.oc.pgm.teams.Team;
|
||
|
import tc.oc.pgm.events.MatchUnloadEvent;
|
||
|
import tc.oc.pgm.events.PlayerJoinMatchEvent;
|
||
|
import tc.oc.pgm.teams.TeamMatchModule;
|
||
|
import tc.oc.pgm.events.PartyRenameEvent;
|
||
|
import tc.oc.commons.core.util.DefaultMapAdapter;
|
||
|
import tc.oc.pgm.teams.events.TeamResizeEvent;
|
||
|
|
||
|
import javax.annotation.Nullable;
|
||
|
import java.util.Map;
|
||
|
|
||
|
public class MatchTabManager extends TabManager implements Listener {
|
||
|
public static final long RENDER_DELAY = 1;
|
||
|
|
||
|
private final Map<Team, TeamTabEntry> teamEntries = new DefaultMapAdapter<>(new TeamTabEntry.Factory(), true);
|
||
|
private final Map<Match, MapTabEntry> mapEntries = new DefaultMapAdapter<>(new MapTabEntry.Factory(), true);
|
||
|
private final Map<Match, MatchFooterTabEntry> footerEntries = new DefaultMapAdapter<>(new MatchFooterTabEntry.Factory(), true);
|
||
|
private final Map<Match, FreeForAllTabEntry> freeForAllEntries = new DefaultMapAdapter<>(new FreeForAllTabEntry.Factory(), true);
|
||
|
|
||
|
private BukkitTask renderTask;
|
||
|
|
||
|
public MatchTabManager(Plugin plugin) {
|
||
|
super(plugin, new MatchTabView.Factory(), null);
|
||
|
}
|
||
|
|
||
|
public void enable() {
|
||
|
getPlugin().eventRegistry().registerListener(this);
|
||
|
}
|
||
|
|
||
|
public void disable() {
|
||
|
if(this.renderTask != null) {
|
||
|
this.renderTask.cancel();
|
||
|
this.renderTask = null;
|
||
|
}
|
||
|
|
||
|
HandlerList.unregisterAll(this);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
protected void invalidate() {
|
||
|
super.invalidate();
|
||
|
|
||
|
if(this.renderTask == null) {
|
||
|
Runnable render = new Runnable() {
|
||
|
@Override public void run() {
|
||
|
MatchTabManager.this.renderTask = null;
|
||
|
MatchTabManager.this.render();
|
||
|
}
|
||
|
};
|
||
|
this.renderTask = this.getPlugin().getServer().getScheduler().runTaskLater(this.getPlugin(), render, RENDER_DELAY);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public @Nullable MatchTabView getViewOrNull(Player viewer) {
|
||
|
return (MatchTabView) super.getViewOrNull(viewer);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public @Nullable MatchTabView getView(Player viewer) {
|
||
|
return (MatchTabView) super.getView(viewer);
|
||
|
}
|
||
|
|
||
|
public @Nullable PlayerTabEntry getPlayerEntry(MatchPlayer player) {
|
||
|
return (PlayerTabEntry) this.getPlayerEntry(player.getBukkit());
|
||
|
}
|
||
|
|
||
|
public TeamTabEntry getTeamEntry(Team team) {
|
||
|
return this.teamEntries.get(team);
|
||
|
}
|
||
|
|
||
|
public FreeForAllTabEntry getFreeForAllEntry(Match match) {
|
||
|
return this.freeForAllEntries.get(match);
|
||
|
}
|
||
|
|
||
|
public MapTabEntry getMapEntry(Match match) {
|
||
|
return this.mapEntries.get(match);
|
||
|
}
|
||
|
|
||
|
public MatchFooterTabEntry getFooterEntry(Match match) {
|
||
|
return this.footerEntries.get(match);
|
||
|
}
|
||
|
|
||
|
protected void invalidate(MatchPlayer player) {
|
||
|
if(player.getBukkit().willBeOnline()) {
|
||
|
getPlayerEntry(player).invalidate();
|
||
|
}
|
||
|
if(player.getMatch().getMapInfo().isAuthor(player.getPlayerId())) {
|
||
|
MapTabEntry mapEntry = mapEntries.get(player.getMatch());
|
||
|
if(mapEntry != null) mapEntry.invalidate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onJoin(PlayerJoinEvent event) {
|
||
|
MatchTabView view = this.getView(event.getPlayer());
|
||
|
if(view != null) view.enable(this);
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onMatchUnload(MatchUnloadEvent event) {
|
||
|
TeamMatchModule tmm = event.getMatch().getMatchModule(TeamMatchModule.class);
|
||
|
if(tmm != null) {
|
||
|
for(Team team : tmm.getTeams()) {
|
||
|
this.teamEntries.remove(team);
|
||
|
}
|
||
|
}
|
||
|
this.freeForAllEntries.remove(event.getMatch());
|
||
|
this.mapEntries.remove(event.getMatch());
|
||
|
this.footerEntries.remove(event.getMatch());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delegated events
|
||
|
*/
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onJoinMatch(PlayerJoinMatchEvent event) {
|
||
|
MatchTabView view = this.getView(event.getPlayer().getBukkit());
|
||
|
if(view != null) view.onViewerJoinMatch(event);
|
||
|
|
||
|
invalidate(event.getPlayer());
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onPlayerTeamChange(PlayerChangePartyEvent event) throws EventException {
|
||
|
event.yield();
|
||
|
|
||
|
invalidate(event.getPlayer());
|
||
|
|
||
|
if(event.getOldParty() instanceof Team) {
|
||
|
this.getTeamEntry((Team) event.getOldParty()).invalidate();
|
||
|
}
|
||
|
|
||
|
if(event.getNewParty() instanceof Team) {
|
||
|
this.getTeamEntry((Team) event.getNewParty()).invalidate();
|
||
|
}
|
||
|
|
||
|
if(event.getOldParty() instanceof Tribute || event.getNewParty() instanceof Tribute) {
|
||
|
this.getFreeForAllEntry(event.getMatch()).invalidate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onTeamRename(PartyRenameEvent event) {
|
||
|
if(event.getParty() instanceof Team) {
|
||
|
this.getTeamEntry((Team) event.getParty()).invalidate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onTeamResize(TeamResizeEvent event) {
|
||
|
this.getTeamEntry(event.getTeam()).invalidate();
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onMatchResize(MatchResizeEvent event) {
|
||
|
FreeForAllTabEntry entry = this.getFreeForAllEntry(event.getMatch());
|
||
|
if(entry != null) entry.invalidate();
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onDeath(MatchPlayerDeathEvent event) {
|
||
|
invalidate(event.getVictim());
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void onSpawn(ParticipantSpawnEvent event) {
|
||
|
invalidate(event.getPlayer());
|
||
|
}
|
||
|
}
|