package tc.oc.pgm.spawns;
import java.util.Optional;
import org.bukkit.Location;
import tc.oc.pgm.features.FeatureDefinition;
import tc.oc.pgm.features.FeatureInfo;
import tc.oc.pgm.kits.Kit;
import tc.oc.pgm.kits.KitPlayerFacet;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.points.PointProvider;
@FeatureInfo(name = "spawn")
public interface Spawn extends FeatureDefinition {
SpawnAttributes attributes();
Optional<Kit> getKit();
boolean allows(MatchPlayer player);
// assume the caller has already called .matches()
Location getSpawn(MatchPlayer player);
void applyKit(MatchPlayer player);
}
class SpawnImpl extends FeatureDefinition.Impl implements Spawn {
private final @Inspect SpawnAttributes attributes;
private final @Inspect PointProvider pointProvider;
public SpawnImpl(SpawnAttributes attributes, PointProvider pointProvider) {
this.attributes = attributes;
this.pointProvider = pointProvider;
}
@Override
public SpawnAttributes attributes() {
return attributes;
}
@Override
public Optional<Kit> getKit() {
return attributes.kit;
}
@Override
public boolean allows(MatchPlayer player) {
return this.attributes.filter.query(player).isAllowed();
}
// assume the caller has already called .matches()
@Override
public Location getSpawn(MatchPlayer player) {
Location location = this.pointProvider.getPoint(player.getMatch(), player.getBukkit());
if(location == null) {
player.getMatch().needMatchModule(SpawnMatchModule.class).reportFailedSpawn(this, player);
}
return location;
}
@Override
public void applyKit(MatchPlayer player) {
Optional<Kit> kit = getKit();
if(kit.isPresent()) {
player.facet(KitPlayerFacet.class).applyKit(kit.get(), false);
}
}
}