Apply the gamemode techhider with /hullhider

Players using /hullhider also get the techhider of the region's gamemode in
the build area, like in a fight: its hidden blocks are replaced and occlude
in the hull.
This commit is contained in:
2026-10-31 20:09:45 +01:00
parent 5651455a5f
commit e1ff37bea2
2 changed files with 18 additions and 3 deletions
@@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.hullhider;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.techhider.HiddenHull; import de.steamwar.bausystem.features.techhider.HiddenHull;
import de.steamwar.bausystem.features.techhider.HidingRule;
import de.steamwar.bausystem.features.techhider.TechHiderCommand; import de.steamwar.bausystem.features.techhider.TechHiderCommand;
import de.steamwar.bausystem.features.xray.XrayCommand; import de.steamwar.bausystem.features.xray.XrayCommand;
import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Point;
@@ -63,6 +64,7 @@ public class HullHiderCommand extends SWCommand implements Listener {
private final HullHider<Region> hullHider = new HullHider<>(false); private final HullHider<Region> hullHider = new HullHider<>(false);
// Read on netty threads by the BauTechHider // Read on netty threads by the BauTechHider
private final Map<Region, HiddenHull> hulls = new ConcurrentHashMap<>(); private final Map<Region, HiddenHull> hulls = new ConcurrentHashMap<>();
private final Map<Region, HidingRule> hidingRules = new ConcurrentHashMap<>();
private final Map<Region, Set<Player>> hidden = new ConcurrentHashMap<>(); private final Map<Region, Set<Player>> hidden = new ConcurrentHashMap<>();
@LinkedInstance @LinkedInstance
@@ -99,10 +101,12 @@ public class HullHiderCommand extends SWCommand implements Listener {
Point max = region.getBuildArea().getMaxPoint(true); Point max = region.getBuildArea().getMaxPoint(true);
HullRegion hullRegion = HullRegion.fromInclusive(min.getX(), min.getY(), min.getZ(), max.getX(), max.getY(), max.getZ()); HullRegion hullRegion = HullRegion.fromInclusive(min.getX(), min.getY(), min.getZ(), max.getX(), max.getY(), max.getZ());
// Only the hidden blocks of an active techhider occlude, the hull hider is used without one // The techhider of the gamemode is applied as well, its hidden blocks occlude as they are replaced by the obfuscation block
Hull hull = new Hull(BauSystem.getInstance(), world(), hullRegion, false, Collections.emptySet(), new Viewers.VisibleByDefault()); ObfuscationConfig obfuscation = ObfuscationConfig.of(region.getGameModeConfig().Techhider);
Hull hull = new Hull(BauSystem.getInstance(), world(), hullRegion, false, region.getGameModeConfig().Techhider.HiddenBlocks, new Viewers.VisibleByDefault());
hullHider.addHull(region, hull); hullHider.addHull(region, hull);
hulls.put(region, new HiddenHull(hull, ObfuscationConfig.of(region.getGameModeConfig().Techhider).getObfuscationState())); hulls.put(region, new HiddenHull(hull, obfuscation.getObfuscationState()));
hidingRules.put(region, HidingRule.of(region.getBuildArea(), obfuscation));
} }
hidden.computeIfAbsent(region, rg -> ConcurrentHashMap.newKeySet()).add(player); hidden.computeIfAbsent(region, rg -> ConcurrentHashMap.newKeySet()).add(player);
@@ -123,6 +127,7 @@ public class HullHiderCommand extends SWCommand implements Listener {
if (players.isEmpty()) { if (players.isEmpty()) {
hidden.remove(region); hidden.remove(region);
hulls.remove(region); hulls.remove(region);
hidingRules.remove(region);
hullHider.removeHull(region); hullHider.removeHull(region);
} else { } else {
hullHider.removeViewer(player, region); hullHider.removeViewer(player, region);
@@ -130,6 +135,15 @@ public class HullHiderCommand extends SWCommand implements Listener {
} }
} }
public void addHidingRules(Player player, List<HidingRule> rules) {
hidden.forEach((region, players) -> {
HidingRule rule = hidingRules.get(region);
if (rule != null && players.contains(player)) {
rules.add(rule);
}
});
}
public void addHiddenHulls(Player player, List<HiddenHull> hiddenHulls) { public void addHiddenHulls(Player player, List<HiddenHull> hiddenHulls) {
hidden.forEach((region, players) -> { hidden.forEach((region, players) -> {
HiddenHull hiddenHull = hulls.get(region); HiddenHull hiddenHull = hulls.get(region);
@@ -69,6 +69,7 @@ public class BauTechHider implements AccessPrivilegeProvider {
List<HidingRule> rules = new ArrayList<>(); List<HidingRule> rules = new ArrayList<>();
xrayCommand.addHidingRules(p, rules); xrayCommand.addHidingRules(p, rules);
techHiderCommand.addHidingRules(p, rules); techHiderCommand.addHidingRules(p, rules);
hullHiderCommand.addHidingRules(p, rules);
spectatorListener.addHidingRules(p, rules); spectatorListener.addHidingRules(p, rules);
List<HiddenHull> hulls = new ArrayList<>(); List<HiddenHull> hulls = new ArrayList<>();