ProjectAres/PGM/src/main/java/tc/oc/pgm/events/MatchPlayerDeathEvent.java

161 lines
4.3 KiB
Java

package tc.oc.pgm.events;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import tc.oc.commons.core.util.Streams;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.match.MatchPlayerState;
import tc.oc.pgm.match.ParticipantState;
import tc.oc.pgm.match.PlayerRelation;
import tc.oc.pgm.tracker.damage.DamageInfo;
import static com.google.common.base.Preconditions.checkNotNull;
public class MatchPlayerDeathEvent extends MatchEvent implements MatchPlayerEvent {
private static final HandlerList handlers = new HandlerList();
protected final PlayerDeathEvent parent;
protected final MatchPlayer victim;
protected final DamageInfo damageInfo;
protected final boolean predicted;
protected int raindrops;
public MatchPlayerDeathEvent(PlayerDeathEvent parent, MatchPlayer victim, DamageInfo damageInfo, boolean predicted) {
super(checkNotNull(victim).getMatch());
this.parent = checkNotNull(parent);
this.victim = victim;
this.damageInfo = checkNotNull(damageInfo);
this.predicted = predicted;
}
@Override
public Stream<UUID> users() {
return Streams.compact1(getVictim().getUniqueId(),
killer().map(ParticipantState::getUniqueId));
}
@Override
public Stream<MatchPlayer> players() {
return Streams.compact1(getVictim(), onlineKiller());
}
public PlayerDeathEvent getParent() {
return this.parent;
}
public MatchPlayer getVictim() {
return victim;
}
public @Nullable ParticipantState getKiller() {
return damageInfo.getAttacker();
}
public Optional<ParticipantState> killer() {
return damageInfo.attacker();
}
public @Nullable MatchPlayer getOnlineKiller() {
ParticipantState killer = getKiller();
return killer == null ? null : killer.getMatchPlayer();
}
public Optional<MatchPlayer> onlineKiller() {
return killer().flatMap(MatchPlayerState::onlinePlayer);
}
public EntityDamageEvent.DamageCause getCause() {
return this.getVictim().getBukkit().getLastDamageCause().getCause();
}
public DamageInfo getDamageInfo() {
return damageInfo;
}
public void setDeathMessage(String message) {
this.parent.setDeathMessage(message);
}
public boolean isPredicted() {
return this.predicted;
}
public boolean isVictim(MatchPlayer player) {
return getVictim() == player;
}
public boolean isKiller(MatchPlayer player) {
ParticipantState killer = getKiller();
return killer != null && killer.isPlayer(player);
}
public boolean isInvolved(MatchPlayer player) {
return isVictim(player) || isKiller(player);
}
/**
* Get the relationship between the victim and killer
*/
public PlayerRelation getRelation() {
return PlayerRelation.get(getVictim().getParticipantState(), getKiller());
}
/**
* Is the victim's death caused by a teammate?
*/
public boolean isTeamKill() {
return PlayerRelation.ALLY == getRelation();
}
/**
* Is the victim's death caused by a player on another team?
*/
public boolean isEnemyKill() {
return PlayerRelation.ENEMY == getRelation();
}
/**
* Did the victim kill themselves?
*/
public boolean isSuicide() {
return PlayerRelation.SELF == getRelation();
}
/**
* Are the victim and killer the same player? (but not necessarily on the same team)
*/
public boolean isSelfKill() {
return getKiller() != null && getKiller().isPlayer(getVictim());
}
/**
* Is this an enemy kill that was actually challenging? (i.e. not killing themselves)
*/
public boolean isChallengeKill() {
return isEnemyKill() && !isSelfKill();
}
public int getRaindrops() {
return raindrops;
}
public void setRaindrops(int raindrops) {
this.raindrops = raindrops;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}