add toggle for per region Wind Charge limit and blocker for leaving the region

This commit is contained in:
Jakob Schulz
2026-09-02 00:10:03 +02:00
parent 18965bae1c
commit 71108651fc
3 changed files with 68 additions and 8 deletions
@@ -509,6 +509,20 @@ public final class GameModeConfig<M, W> {
*/
public final boolean WindchargesDestroyWater;
/**
* Allows Wind Charges to leave the Region.
*
* @implSpec {@code true} by default
*/
public final boolean WindchargesCanLeaveRegion;
/**
* Limits the amount of Wind Charges in each extended region. -1 is no limit
*
* @implSpec {@code -1} by default
*/
public final int WindchargeLimit;
private ArenaConfig(YMLWrapper<M, W> loader, SchematicConfig.SizeConfig Size, List<Integer> EnterStages) {
loaded = loader.canLoad();
WaterDepth = loader.getInt("WaterDepth", 0);
@@ -529,6 +543,8 @@ public final class GameModeConfig<M, W> {
WindchargesCanCrossMiddle = loader.getBoolean("WindchargesCanCrossMiddle", false);
WindchargesInteractWithBlocks = loader.getBoolean("WindchargesInteractWithBlocks", true);
WindchargesDestroyWater = loader.getBoolean("WindchargesDestroyWater", false);
WindchargesCanLeaveRegion = loader.getBoolean("WindchargesCanLeaveRegion", true);
WindchargeLimit = loader.getInt("WindchargeLimit", -1);
}
@ToString
@@ -68,6 +68,10 @@ Arena:
WindchargesCanCrossMiddle: false # defaults to false if missing
# Allows Wind Charge interaction with Blocks.
WindchargesInteractWithBlocks: false # defaults to false if missing
# Allows Wind Charges to leave the extended region.
WindchargesCanLeaveRegion: true # defaults to true
# Limits the amount of Wind Charges in each extended region. -1 is no limit
WindchargeLimit: -1 # defaults to -1
Schematic:
# The size of the schematics
@@ -22,31 +22,71 @@ package de.steamwar.fightsystem.listener;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.states.FightState;
import de.steamwar.fightsystem.states.StateDependentTask;
import de.steamwar.fightsystem.utils.Region;
import de.steamwar.linkage.Linked;
import net.minecraft.world.entity.projectile.windcharge.WindCharge;
import org.bukkit.Location;
@Linked
public class WindchargeStopper {
public WindchargeStopper() {
new StateDependentTask(!Config.GameModeConfig.Arena.WindchargesCanCrossMiddle, FightState.Running, this::run, 1, 1);
canCrossMiddle = Config.GameModeConfig.Arena.WindchargesCanCrossMiddle;
canLeaveRegion = Config.GameModeConfig.Arena.WindchargesCanLeaveRegion;
limit = Config.GameModeConfig.Arena.WindchargeLimit;
boolean enabled = limit >= 0 || !canCrossMiddle || !canLeaveRegion;
new StateDependentTask(enabled, FightState.Running, this::run, 1, 1);
}
private static final int middleLine = Config.SpecSpawn.getBlockZ();
private static final Class<?> windChargeClass = WindCharge.class;
private void run() {
Recording.iterateOverEntities(windChargeClass::isInstance, entity -> {
Location nextlocation = entity.getLocation().add(entity.getVelocity());
Location location = entity.getLocation();
private final boolean canCrossMiddle;
private final boolean canLeaveRegion;
private final int limit;
private int blueCount;
private int redCount;
private void run() {
redCount = 0;
blueCount = 0;
Recording.iterateOverEntities(windChargeClass::isInstance, entity -> {
Location location = entity.getLocation();
Location nextlocation = location.clone().add(entity.getVelocity());
if (!canCrossMiddle) {
boolean passedMiddle = nextlocation.getBlockZ() >= middleLine && location.getBlockZ() <= middleLine ||
nextlocation.getBlockZ() <= middleLine && location.getBlockZ() >= middleLine;
if (passedMiddle) {
entity.remove();
return;
}
}
Region region = Config.BlueExtendRegion.inRegion(location) ? Config.BlueExtendRegion
: Config.RedExtendRegion.inRegion(location) ? Config.RedExtendRegion
: null;
if (!canLeaveRegion) {
if (region == null) {
entity.remove();
return;
}
if (!region.inRegion(nextlocation)) {
entity.remove();
return;
}
}
if (limit >= 0 && region != null) {
if (region == Config.BlueExtendRegion) {
if (++blueCount > limit) entity.remove();
} else {
if (++redCount > limit) entity.remove();
}
}
});
}