forked from SteamWar/SteamWar
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:
+17
-3
@@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.hullhider;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
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.xray.XrayCommand;
|
||||
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);
|
||||
// Read on netty threads by the BauTechHider
|
||||
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<>();
|
||||
|
||||
@LinkedInstance
|
||||
@@ -99,10 +101,12 @@ public class HullHiderCommand extends SWCommand implements Listener {
|
||||
Point max = region.getBuildArea().getMaxPoint(true);
|
||||
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
|
||||
Hull hull = new Hull(BauSystem.getInstance(), world(), hullRegion, false, Collections.emptySet(), new Viewers.VisibleByDefault());
|
||||
// The techhider of the gamemode is applied as well, its hidden blocks occlude as they are replaced by the obfuscation block
|
||||
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);
|
||||
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);
|
||||
@@ -123,6 +127,7 @@ public class HullHiderCommand extends SWCommand implements Listener {
|
||||
if (players.isEmpty()) {
|
||||
hidden.remove(region);
|
||||
hulls.remove(region);
|
||||
hidingRules.remove(region);
|
||||
hullHider.removeHull(region);
|
||||
} else {
|
||||
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) {
|
||||
hidden.forEach((region, players) -> {
|
||||
HiddenHull hiddenHull = hulls.get(region);
|
||||
|
||||
+1
@@ -69,6 +69,7 @@ public class BauTechHider implements AccessPrivilegeProvider {
|
||||
List<HidingRule> rules = new ArrayList<>();
|
||||
xrayCommand.addHidingRules(p, rules);
|
||||
techHiderCommand.addHidingRules(p, rules);
|
||||
hullHiderCommand.addHidingRules(p, rules);
|
||||
spectatorListener.addHidingRules(p, rules);
|
||||
|
||||
List<HiddenHull> hulls = new ArrayList<>();
|
||||
|
||||
Reference in New Issue
Block a user