package tc.oc.pgm.flag.state;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TranslatableComponent;
import org.bukkit.Location;
import java.time.Duration;
import tc.oc.commons.core.chat.Component;
import tc.oc.pgm.match.Party;
import tc.oc.pgm.goals.events.GoalStatusChangeEvent;
import tc.oc.pgm.flag.Flag;
import tc.oc.pgm.flag.Post;
import javax.annotation.Nullable;
/**
* State of a flag while it is waiting to respawn at a {@link Post}
* after being {@link Captured}. This phase can be delayed by
* respawn-time or respawn-speed.
*/
public class Respawning extends Spawned implements Returning {
protected final @Nullable Location respawnFrom;
protected final Location respawnTo;
protected final Duration respawnTime;
protected final boolean wasCaptured;
protected final boolean wasDelayed;
protected Respawning(Flag flag, Post post, @Nullable Location respawnFrom, boolean wasCaptured, boolean wasDelayed) {
super(flag, post);
this.respawnFrom = respawnFrom;
this.respawnTo = this.flag.getReturnPoint(this.post);
this.respawnTime = this.post.getRespawnTime(this.respawnFrom == null ? 0 : this.respawnFrom.distance(this.respawnTo));
this.wasCaptured = wasCaptured;
this.wasDelayed = wasDelayed;
}
@Override
protected Duration getDuration() {
return respawnTime;
}
@Override
public void enterState() {
super.enterState();
if(!Duration.ZERO.equals(respawnTime)) {
// Respawn is delayed
this.flag.getMatch().sendMessage(new TranslatableComponent("match.flag.willRespawn",
this.flag.getColoredName(),
new Component(String.valueOf(respawnTime.getSeconds()), net.md_5.bungee.api.ChatColor.AQUA)));
}
}
protected void respawn(@Nullable BaseComponent message) {
if(message != null) {
this.flag.playStatusSound(Flag.RETURN_SOUND_OWN, Flag.RETURN_SOUND);
this.flag.getMatch().sendMessage(message);
}
this.flag.transition(new Returned(this.flag, this.post, this.respawnTo));
}
@Override
protected void tickSeconds(long seconds) {
super.tickSeconds(seconds);
this.flag.getMatch().callEvent(new GoalStatusChangeEvent(this.flag));
}
@Override
protected void finishCountdown() {
super.finishCountdown();
if(!Duration.ZERO.equals(respawnTime)) {
this.respawn(new TranslatableComponent("match.flag.respawn", this.flag.getColoredName()));
} else if(!this.wasCaptured) {
// Flag was dropped
this.respawn(new TranslatableComponent("match.flag.return", this.flag.getColoredName()));
} else if(this.wasDelayed) {
// Flag was captured and respawn was delayed by a filter, so we announce that the flag has respawned
this.respawn(new TranslatableComponent("match.flag.respawn", this.flag.getColoredName()));
}
}
@Override
public Location getLocation() {
return this.respawnTo;
}
@Override
public boolean isRecoverable() {
return false;
}
@Override
public String getStatusSymbol(Party viewer) {
return Flag.RESPAWNING_SYMBOL;
}
@Override
public ChatColor getStatusColor(Party viewer) {
return ChatColor.GRAY;
}
}