package tc.oc.pgm.flag.state; import java.time.Duration; import java.time.Instant; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.TranslatableComponent; import org.bukkit.Location; import tc.oc.commons.core.util.TimeUtils; import tc.oc.pgm.flag.Flag; import tc.oc.pgm.flag.Post; import tc.oc.pgm.goals.events.GoalStatusChangeEvent; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.match.Party; import tc.oc.pgm.scoreboard.SidebarMatchModule; /** * State of a flag after a player drops it on the ground, either by dying * or by clicking on the banner in their inventory. A flag can only enter * this state when subject to a return delay. */ public class Dropped extends Uncarried implements Missing { // Minimum time between a player dropping the flag and picking it up again private static final Duration PICKUP_DELAY = Duration.ofSeconds(2); private final MatchPlayer dropper; public Dropped(Flag flag, Post post, Location location, MatchPlayer dropper) { super(flag, post, location); this.dropper = dropper; } @Override protected Duration getDuration() { return this.post.getRecoverTime(); } @Override public void enterState() { super.enterState(); if(!Duration.ZERO.equals(getDuration())) { this.flag.playStatusSound(Flag.DROP_SOUND_OWN, Flag.DROP_SOUND); this.flag.getMatch().sendMessage(new TranslatableComponent("match.flag.drop", this.flag.getComponentName())); } if(TimeUtils.isInfPositive(getDuration())) { SidebarMatchModule smm = this.flag.getMatch().getMatchModule(SidebarMatchModule.class); if(smm != null) smm.blinkGoal(this.flag, 2, null); } } @Override public void leaveState() { SidebarMatchModule smm = this.flag.getMatch().getMatchModule(SidebarMatchModule.class); if(smm != null) smm.stopBlinkingGoal(this.flag); super.leaveState(); } @Override protected void tickSeconds(long seconds) { super.tickSeconds(seconds); this.flag.getMatch().callEvent(new GoalStatusChangeEvent(this.flag)); this.labelEntity.setCustomName(this.flag.getColoredName() + " " + ChatColor.AQUA + seconds); } @Override protected void finishCountdown() { super.finishCountdown(); this.recover(); } @Override public boolean isRecoverable() { return true; } @Override protected boolean canPickup(MatchPlayer player) { return super.canPickup(player) && (player != this.dropper || this.enterTime.plus(PICKUP_DELAY).isBefore(Instant.now())); } @Override public ChatColor getStatusColor(Party viewer) { if(this.isCountingDown()) { return ChatColor.AQUA; } else if(this.flag.getDefinition().hasMultipleCarriers()) { return ChatColor.WHITE; } else { return super.getStatusColor(viewer); } } @Override public String getStatusSymbol(Party viewer) { return Flag.DROPPED_SYMBOL; } }