package tc.oc.pgm.flag; import java.util.Optional; import javax.annotation.Nullable; import com.google.common.collect.ImmutableSet; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.util.Vector; import tc.oc.pgm.features.FeatureDefinition; import tc.oc.pgm.features.FeatureInfo; import tc.oc.pgm.features.SluggedFeatureDefinition; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.regions.Region; import tc.oc.pgm.teams.TeamFactory; @FeatureInfo(name = "net") public interface Net extends SluggedFeatureDefinition { Region getRegion(); Filter getCaptureFilter(); Filter getRespawnFilter(); @Nullable BaseComponent getRespawnMessage(); Optional<TeamFactory> owner(); @Nullable TeamFactory getOwner(); double getPointsPerCapture(); boolean isSticky(); @Nullable BaseComponent getDenyMessage(); @Nullable Post getReturnPost(); default Optional<Post> returnPost() { return Optional.ofNullable(getReturnPost()); } ImmutableSet<FlagDefinition> getCapturableFlags(); ImmutableSet<FlagDefinition> getRecoverableFlags(); boolean isRespawnTogether(); Vector getProximityLocation(); } class NetImpl extends FeatureDefinition.Impl implements Net { private final @Inspect Region region; // Region flag carrier must enter to capture private final @Inspect Filter captureFilter; // Carrier must pass this filter to capture private final @Inspect Filter respawnFilter; // Captured flags will not respawn until they pass this filter private final @Inspect Optional<TeamFactory> owner; // Team that gets points for captures in this net, null to give points to flag carrier private final @Inspect double pointsPerCapture; // Points awarded per capture private final @Inspect boolean sticky; // If capture is delayed by filter, carrier does not have to stay inside the net private final @Inspect @Nullable BaseComponent denyMessage; // Message to show carrier when capture is prevented by filter private final @Inspect @Nullable BaseComponent respawnMessage; // Message to broadcast when respawn is prevented by filter or respawnTogether private final @Inspect @Nullable Post returnPost; // Post to send flags after capture, null to send to their current post private final @Inspect ImmutableSet<FlagDefinition> capturableFlags; // Flags that can be captured in this net private final @Inspect ImmutableSet<FlagDefinition> recoverableFlags; // Flags that are force returned on capture, aside from the flag being captured private final @Inspect boolean respawnTogether; // Delay respawn until all capturableFlags are captured private @Nullable Vector proximityLocation; public NetImpl(Region region, Filter captureFilter, Filter respawnFilter, Optional<TeamFactory> owner, double pointsPerCapture, boolean sticky, @Nullable BaseComponent denyMessage, @Nullable BaseComponent respawnMessage, @Nullable Post returnPost, ImmutableSet<FlagDefinition> capturableFlags, ImmutableSet<FlagDefinition> recoverableFlags, boolean respawnTogether, @Nullable Vector proximityLocation) { this.region = region; this.captureFilter = captureFilter; this.respawnFilter = respawnFilter; this.owner = owner; this.pointsPerCapture = pointsPerCapture; this.sticky = sticky; this.denyMessage = denyMessage; this.respawnMessage = respawnMessage; this.returnPost = returnPost; this.capturableFlags = capturableFlags; this.recoverableFlags = recoverableFlags; this.respawnTogether = respawnTogether; this.proximityLocation = proximityLocation; } @Override public Region getRegion() { return this.region; } @Override public Filter getCaptureFilter() { return captureFilter; } @Override public Filter getRespawnFilter() { return respawnFilter; } @Override public @Nullable BaseComponent getRespawnMessage() { return respawnMessage; } public Optional<TeamFactory> owner() { return owner; } @Override public @Nullable TeamFactory getOwner() { return owner.orElse(null); } @Override public double getPointsPerCapture() { return pointsPerCapture; } @Override public boolean isSticky() { return sticky; } @Override public @Nullable BaseComponent getDenyMessage() { return denyMessage; } @Override public @Nullable Post getReturnPost() { return this.returnPost; } @Override public ImmutableSet<FlagDefinition> getCapturableFlags() { return capturableFlags; } @Override public ImmutableSet<FlagDefinition> getRecoverableFlags() { return recoverableFlags; } @Override public boolean isRespawnTogether() { return respawnTogether; } @Override public Vector getProximityLocation() { if(proximityLocation == null) { proximityLocation = getRegion().getBounds().center(); } return proximityLocation; } }