package tc.oc.pgm.core; import java.util.Optional; import java.util.stream.Stream; import javax.annotation.Nullable; import org.bukkit.material.MaterialData; import tc.oc.api.docs.virtual.MapDoc; import tc.oc.pgm.features.FeatureInfo; import tc.oc.pgm.features.GamemodeFeature; import tc.oc.pgm.goals.ProximityGoalDefinition; import tc.oc.pgm.goals.ProximityGoalDefinitionImpl; import tc.oc.pgm.goals.ProximityMetric; import tc.oc.pgm.match.Match; import tc.oc.pgm.regions.Region; import tc.oc.pgm.teams.TeamFactory; @FeatureInfo(name = "core") public interface CoreFactory extends ProximityGoalDefinition, GamemodeFeature { @Override Core getGoal(Match match); Region getRegion(); MaterialData getMaterial(); int getLeakLevel(); boolean hasModeChanges(); } class CoreFactoryImpl extends ProximityGoalDefinitionImpl implements CoreFactory { private final @Inspect Region region; private final @Inspect MaterialData material; private final @Inspect int leakLevel; private final @Inspect boolean modeChanges; public CoreFactoryImpl(String name, @Nullable Boolean required, boolean visible, TeamFactory owner, ProximityMetric proximityMetric, Region region, MaterialData material, int leakLevel, boolean modeChanges) { super(name, required, visible, Optional.of(owner), proximityMetric); this.region = region; this.material = material; this.leakLevel = leakLevel; this.modeChanges = modeChanges; } @Override public Stream<MapDoc.Gamemode> gamemodes() { return Stream.of(MapDoc.Gamemode.dtc); } @Override public Core getGoal(Match match) { return (Core) super.getGoal(match); } @Override public Core createFeature(Match match) { return new Core(this, match); } @Override public boolean isShared() { return false; } @Override public Region getRegion() { return this.region; } @Override public MaterialData getMaterial() { return this.material; } @Override public int getLeakLevel() { return this.leakLevel; } @Override public boolean hasModeChanges() { return this.modeChanges; } }