ProjectAres/PGM/src/main/java/tc/oc/pgm/blitz/LivesBase.java

114 lines
3.0 KiB
Java

package tc.oc.pgm.blitz;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TranslatableComponent;
import tc.oc.api.docs.PlayerId;
import tc.oc.commons.core.chat.Component;
import tc.oc.pgm.match.Competitor;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public abstract class LivesBase implements Lives {
private final Map<PlayerId, Integer> deltas;
private final Competitor competitor;
private final int original;
private int current;
public LivesBase(int lives, Competitor competitor) {
this.deltas = new HashMap<>();
this.competitor = competitor;
this.original = lives;
this.current = lives;
update();
}
private void update() {
competitor().getMatch().callEvent(new LivesEvent(this));
}
@Override
public Competitor competitor() {
return competitor;
}
@Override
public int original() {
return original;
}
@Override
public int current() {
return current;
}
@Override
public boolean empty() {
return current() <= 0;
}
@Override
public void add(@Nullable PlayerId cause, int delta) {
current = Math.max(0, current() + delta);
deltas.put(cause, changesBy(cause) + delta);
update();
}
@Override
public int changesBy(PlayerId player) {
return deltas.getOrDefault(player, 0);
}
@Override
public BaseComponent remaining() {
return new Component(
new TranslatableComponent(
"lives.remaining." + type().name().toLowerCase() + "." + (current() == 1 ? "singular" : "plural"),
new Component(current(), ChatColor.YELLOW)
),
ChatColor.AQUA
);
}
@Override
public BaseComponent status() {
int alive = (int) competitor().players().count();
return new Component(
Stream.of(
new Component("("),
new TranslatableComponent(
empty() ? alive == 0 ? "lives.status.eliminated"
: "lives.status.alive"
: "lives.status.lives",
new Component(
empty() ? alive : current(),
ChatColor.WHITE
)
),
new Component(")")
),
ChatColor.GRAY,
ChatColor.ITALIC
);
}
@Override
public BaseComponent change(int delta) {
int absDelta = Math.abs(delta);
return new Component(
new TranslatableComponent(
(delta > 0 ? "lives.change.gained."
: "lives.change.lost.") + (absDelta == 1 ? "singular"
: "plural"),
new Component(absDelta, ChatColor.AQUA)
),
ChatColor.WHITE
);
}
}