package tc.oc.pgm.worldborder; import org.bukkit.util.Vector; import java.time.Duration; import tc.oc.commons.bukkit.util.Vectors; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.filters.matcher.StaticFilter; import static com.google.common.base.Preconditions.checkNotNull; /** * Parameters for the world border. */ public class WorldBorder { final Filter filter; // State should only be applied when a MatchQuery passes this filter final Vector center; // Center of the border final double size; // Diameter of the border final Duration duration; // Time taken to transition into this state from any previous state final double damage; // Damage per second dealt to players for each meter outside of the border the are located final double buffer; // Distance from the edge of the border where the damage to players begins final double warningDistance; // Show red vignette to players closer than this to border final Duration warningTime; // Show red vignette to players when the border is moving and will reach them within this time public WorldBorder(Filter filter, Vector center, double size, Duration duration, double damage, double buffer, double warningDistance, Duration warningTime) { this.filter = checkNotNull(filter); this.center = checkNotNull(center); this.size = size; this.duration = checkNotNull(duration); this.damage = damage; this.buffer = buffer; this.warningDistance = warningDistance; this.warningTime = checkNotNull(warningTime); } public boolean isMoving() { return !Duration.ZERO.equals(duration); } public boolean isConditional() { return !StaticFilter.ALLOW.equals(filter); } public void apply(org.bukkit.WorldBorder bukkit, boolean transition) { bukkit.setDamageAmount(damage); bukkit.setDamageBuffer(buffer); bukkit.setWarningDistance((int) Math.round(warningDistance)); bukkit.setWarningTime((int) warningTime.getSeconds()); bukkit.setCenter(center.getX(), center.getZ()); if(transition && isMoving()) { bukkit.setSize(size, Math.max(0, duration.getSeconds())); } else { bukkit.setSize(size); } } public void refresh(org.bukkit.WorldBorder bukkit, Duration elapsed) { if(isMoving()) { bukkit.setSize(size, Math.max(0, duration.minus(elapsed).getSeconds())); } } @Override public String toString() { return getClass().getSimpleName() + "{center=" + Vectors.format(center) + " size=" + size + (isMoving() ? " duration=" + duration : "") + (isConditional() ? " filter=" + filter : "") + "}"; } }