package tc.oc.pgm.chat;
import javax.inject.Inject;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import tc.oc.commons.bukkit.chat.CachingNameRenderer;
import tc.oc.commons.bukkit.nick.IdentityProvider;
import tc.oc.commons.bukkit.nick.PlayerAppearanceChanger;
import tc.oc.commons.core.plugin.PluginFacet;
import tc.oc.pgm.events.MatchLoadEvent;
import tc.oc.pgm.events.MatchUnloadEvent;
import tc.oc.pgm.events.PlayerPartyChangeEvent;
import tc.oc.pgm.map.Contributor;
import tc.oc.pgm.match.Match;
public class MatchNameInvalidator implements Listener, PluginFacet {
private final PlayerAppearanceChanger playerAppearanceChanger;
private final CachingNameRenderer cachingNameRenderer;
private final IdentityProvider identityProvider;
@Inject MatchNameInvalidator(PlayerAppearanceChanger playerAppearanceChanger, CachingNameRenderer cachingNameRenderer, IdentityProvider identityProvider) {
this.playerAppearanceChanger = playerAppearanceChanger;
this.cachingNameRenderer = cachingNameRenderer;
this.identityProvider = identityProvider;
}
// Invalidate names on team change so the color can update.
// Dead players have a different NameType than living ones, so invalidation is not needed for that.
@EventHandler(priority = EventPriority.LOWEST)
public void onPartyChange(PlayerPartyChangeEvent event) {
playerAppearanceChanger.refreshPlayer(event.getPlayer().getBukkit());
cachingNameRenderer.invalidateCache(identityProvider.currentIdentity(event.getPlayer().getBukkit()));
}
// Invalidate the names of mapmakers when their map loads/unloads,
// so the mapmaker flair can be added/removed.
private void invalidateMapmakers(Match match) {
match.getMap().getInfo().authors.stream()
.filter((c) -> c.getUser() != null)
.map(Contributor::getIdentity)
.forEach((identity) -> {
cachingNameRenderer.invalidateCache(identity);
final Player player = identity.getPlayer();
if(player != null) playerAppearanceChanger.refreshPlayer(player);
});
}
@EventHandler(priority = EventPriority.LOWEST)
public void onMatchLoad(MatchLoadEvent event) {
invalidateMapmakers(event.getMatch());
}
@EventHandler(priority = EventPriority.LOWEST)
public void onMatchUnload(MatchUnloadEvent event) {
invalidateMapmakers(event.getMatch());
}
}