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.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);
|
||||||
|
|||||||
+1
@@ -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<>();
|
||||||
|
|||||||
Reference in New Issue
Block a user