forked from SteamWar/SteamWar
Add Torii to PathRegion
This commit is contained in:
+4
@@ -86,9 +86,13 @@ public abstract class DynamicRegion implements Region {
|
|||||||
Set<UUID> needsFullReset = new HashSet<>();
|
Set<UUID> needsFullReset = new HashSet<>();
|
||||||
list.forEach(data -> {
|
list.forEach(data -> {
|
||||||
boolean previousGardenState = data.region().isGarden();
|
boolean previousGardenState = data.region().isGarden();
|
||||||
|
PathSide previousToriState = data.region().getToriiSide();
|
||||||
data.region().calculateGardenState();
|
data.region().calculateGardenState();
|
||||||
|
data.region().calculateToriiState();
|
||||||
if (data.region().isGarden() != previousGardenState) {
|
if (data.region().isGarden() != previousGardenState) {
|
||||||
needsFullReset.add(data.region().getID());
|
needsFullReset.add(data.region().getID());
|
||||||
|
} else if (data.region().getToriiSide() != previousToriState) {
|
||||||
|
needsFullReset.add(data.region().getID());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Updating world state for all neighbouring PathRegions
|
// Updating world state for all neighbouring PathRegions
|
||||||
|
|||||||
+1
@@ -146,6 +146,7 @@ public class DynamicRegionRepository {
|
|||||||
DynamicRegionSystem.INSTANCE.getRegionsByType(RegionType.PATH)
|
DynamicRegionSystem.INSTANCE.getRegionsByType(RegionType.PATH)
|
||||||
.forEach(region -> {
|
.forEach(region -> {
|
||||||
((PathRegion) region).calculateGardenState();
|
((PathRegion) region).calculateGardenState();
|
||||||
|
((PathRegion) region).calculateToriiState();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+55
-8
@@ -29,7 +29,6 @@ import de.steamwar.bausystem.region.dynamic.DynamicRegion;
|
|||||||
import de.steamwar.bausystem.region.dynamic.PasteUtils;
|
import de.steamwar.bausystem.region.dynamic.PasteUtils;
|
||||||
import de.steamwar.bausystem.region.dynamic.Tile;
|
import de.steamwar.bausystem.region.dynamic.Tile;
|
||||||
import de.steamwar.bausystem.region.dynamic.VariantSelector;
|
import de.steamwar.bausystem.region.dynamic.VariantSelector;
|
||||||
import de.steamwar.bausystem.region.dynamic.spawn.SpawnRegion;
|
|
||||||
import de.steamwar.bausystem.shared.Pair;
|
import de.steamwar.bausystem.shared.Pair;
|
||||||
import de.steamwar.bausystem.utils.PasteBuilder;
|
import de.steamwar.bausystem.utils.PasteBuilder;
|
||||||
import de.steamwar.sql.SchematicNode;
|
import de.steamwar.sql.SchematicNode;
|
||||||
@@ -68,6 +67,10 @@ public class PathArea extends Region.Area {
|
|||||||
private static final VariantSelector CORNER_INNER_GARDEN = VariantSelector.Get(new File(PATH_DIR, "cinner/garden"));
|
private static final VariantSelector CORNER_INNER_GARDEN = VariantSelector.Get(new File(PATH_DIR, "cinner/garden"));
|
||||||
private static final VariantSelector CORNER_OUTER_GARDEN = VariantSelector.Get(new File(PATH_DIR, "couter/garden"));
|
private static final VariantSelector CORNER_OUTER_GARDEN = VariantSelector.Get(new File(PATH_DIR, "couter/garden"));
|
||||||
|
|
||||||
|
private static final VariantSelector TORII_CENTER = VariantSelector.Schematic("Path", "Torii", "Center");
|
||||||
|
private static final VariantSelector TORII_SIDE_VOID = VariantSelector.Schematic("Path", "Torii", "Edge_Void");
|
||||||
|
private static final VariantSelector TORII_SIDE_WATER = VariantSelector.Schematic("Path", "Torii", "Edge_Water");
|
||||||
|
|
||||||
private static final SelectorSide SELECTOR_SIDE = new SelectorSide()
|
private static final SelectorSide SELECTOR_SIDE = new SelectorSide()
|
||||||
.Case(Path, CENTER)
|
.Case(Path, CENTER)
|
||||||
.Case(Void, SIDE_VOID)
|
.Case(Void, SIDE_VOID)
|
||||||
@@ -160,9 +163,16 @@ public class PathArea extends Region.Area {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reset(PathSide side) {
|
public void reset(PathSide side, boolean torii) {
|
||||||
SchematicNode reset = null;
|
SchematicNode reset = null;
|
||||||
VariantSelector selector = SELECTOR_SIDE.Select(tile, side);
|
VariantSelector selector = SELECTOR_SIDE.Select(tile, side);
|
||||||
|
if (torii) {
|
||||||
|
if (selector == SIDE_VOID) {
|
||||||
|
selector = TORII_SIDE_VOID;
|
||||||
|
} else if (selector == SIDE_WATER) {
|
||||||
|
selector = TORII_SIDE_WATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (selector != null) reset = selector.select().orElse(null);
|
if (selector != null) reset = selector.select().orElse(null);
|
||||||
if (selector == null || reset == null) {
|
if (selector == null || reset == null) {
|
||||||
if (!BauSystem.DEV_SERVER) return;
|
if (!BauSystem.DEV_SERVER) return;
|
||||||
@@ -205,19 +215,17 @@ public class PathArea extends Region.Area {
|
|||||||
public void place(PasteBuilder pasteBuilder, boolean extension) {
|
public void place(PasteBuilder pasteBuilder, boolean extension) {
|
||||||
if (region.isGarden()) {
|
if (region.isGarden()) {
|
||||||
SchematicNode reset = GARDEN.select().orElse(null);
|
SchematicNode reset = GARDEN.select().orElse(null);
|
||||||
if (reset != null) {
|
if (reset != null) PasteUtils.paste(reset, minPoint, 0);
|
||||||
PasteUtils.paste(reset, minPoint, 0);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SchematicNode reset = CENTER.select().orElse(null);
|
SchematicNode reset = (region.getToriiSide() != null ? TORII_CENTER : CENTER).select().orElse(null);
|
||||||
if (reset != null) {
|
if (reset != null) {
|
||||||
PasteUtils.paste(reset, minPoint.add(7, 0, 7), 0);
|
PasteUtils.paste(reset, minPoint.add(7, 0, 7), region.getToriiSide() != null ? region.getToriiSide().rotate : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PathSide side : PathSide.values()) {
|
for (PathSide side : PathSide.values()) {
|
||||||
reset(side);
|
reset(side, region.getToriiSide() != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PathCorner corner : PathCorner.values()) {
|
for (PathCorner corner : PathCorner.values()) {
|
||||||
@@ -225,6 +233,45 @@ public class PathArea extends Region.Area {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected PathSide getToriiSide() {
|
||||||
|
VariantSelector north = SELECTOR_SIDE.Select(tile, PathSide.North);
|
||||||
|
VariantSelector south = SELECTOR_SIDE.Select(tile, PathSide.South);
|
||||||
|
boolean zAxis = false;
|
||||||
|
if (isValidTorriVariantSelector(north) && isValidTorriVariantSelector(south)) {
|
||||||
|
zAxis = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
VariantSelector east = SELECTOR_SIDE.Select(tile, PathSide.East);
|
||||||
|
VariantSelector west = SELECTOR_SIDE.Select(tile, PathSide.West);
|
||||||
|
boolean xAxis = false;
|
||||||
|
if (isValidTorriVariantSelector(east) && isValidTorriVariantSelector(west)) {
|
||||||
|
xAxis = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xAxis && zAxis) return null;
|
||||||
|
|
||||||
|
VariantSelector northEast = SELECTOR_CORNER.Select(tile, PathCorner.NorthEast).getKey();
|
||||||
|
if (!isValidTorriVariantSelector(northEast)) return null;
|
||||||
|
VariantSelector northWest = SELECTOR_CORNER.Select(tile, PathCorner.NorthWest).getKey();
|
||||||
|
if (!isValidTorriVariantSelector(northWest)) return null;
|
||||||
|
VariantSelector southEast = SELECTOR_CORNER.Select(tile, PathCorner.SouthEast).getKey();
|
||||||
|
if (!isValidTorriVariantSelector(southEast)) return null;
|
||||||
|
VariantSelector southWest = SELECTOR_CORNER.Select(tile, PathCorner.SouthWest).getKey();
|
||||||
|
if (!isValidTorriVariantSelector(southWest)) return null;
|
||||||
|
|
||||||
|
if (zAxis) {
|
||||||
|
return PathSide.North;
|
||||||
|
} else if (xAxis) {
|
||||||
|
return PathSide.West;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidTorriVariantSelector(VariantSelector selector) {
|
||||||
|
return selector == SIDE_VOID || selector == SIDE_WATER;
|
||||||
|
}
|
||||||
|
|
||||||
protected static RegionType.ConnectionType getConnectionType(Tile source, PathSide side, PathSide optionalSide) {
|
protected static RegionType.ConnectionType getConnectionType(Tile source, PathSide side, PathSide optionalSide) {
|
||||||
Optional<Tile> optionalTile = source.add(side.tileOffsetX, side.tileOffsetZ);
|
Optional<Tile> optionalTile = source.add(side.tileOffsetX, side.tileOffsetZ);
|
||||||
if (optionalSide != null) {
|
if (optionalSide != null) {
|
||||||
|
|||||||
+14
-2
@@ -67,6 +67,7 @@ public class PathRegion extends DynamicRegion {
|
|||||||
area = new PathArea(tile, this);
|
area = new PathArea(tile, this);
|
||||||
regionData = PathRegionData.INSTANCE;
|
regionData = PathRegionData.INSTANCE;
|
||||||
calculateGardenState();
|
calculateGardenState();
|
||||||
|
calculateToriiState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -75,7 +76,7 @@ public class PathRegion extends DynamicRegion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @org.jspecify.annotations.NonNull PathConnectResult shouldPathConnect(Tile source, PathSide side, boolean diagonal) {
|
public @NonNull PathConnectResult shouldPathConnect(Tile source, PathSide side, boolean diagonal) {
|
||||||
if (diagonal) {
|
if (diagonal) {
|
||||||
// Needed for inner corners of Small Spawn
|
// Needed for inner corners of Small Spawn
|
||||||
if (!(Math.abs(source.getTileX()) == 2 && source.getTileZ() == 0) && !(source.getTileX() == 0 && Math.abs(source.getTileZ()) == 2)) {
|
if (!(Math.abs(source.getTileX()) == 2 && source.getTileZ() == 0) && !(source.getTileX() == 0 && Math.abs(source.getTileZ()) == 2)) {
|
||||||
@@ -88,7 +89,7 @@ public class PathRegion extends DynamicRegion {
|
|||||||
|
|
||||||
public void update(DynamicRegion updateFrom, NeighbourDirection direction) {
|
public void update(DynamicRegion updateFrom, NeighbourDirection direction) {
|
||||||
for (PathSide side : direction.getSideUpdates()) {
|
for (PathSide side : direction.getSideUpdates()) {
|
||||||
area.reset(side);
|
area.reset(side, toriiSide != null);
|
||||||
}
|
}
|
||||||
for (PathCorner corner : direction.getCornerUpdates()) {
|
for (PathCorner corner : direction.getCornerUpdates()) {
|
||||||
area.reset(corner);
|
area.reset(corner);
|
||||||
@@ -113,6 +114,17 @@ public class PathRegion extends DynamicRegion {
|
|||||||
garden = true;
|
garden = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private PathSide toriiSide = null;
|
||||||
|
|
||||||
|
public void calculateToriiState() {
|
||||||
|
if ((Math.abs(tile.getTileX()) + Math.abs(tile.getTileZ())) % 2 == 0) {
|
||||||
|
toriiSide = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toriiSide = area.getToriiSide();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull RegionType getType() {
|
public @NonNull RegionType getType() {
|
||||||
return RegionType.PATH;
|
return RegionType.PATH;
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@ public class SpawnRegion extends DynamicRegion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @org.jspecify.annotations.NonNull PathConnectResult shouldPathConnect(Tile source, PathSide side, boolean diagonal) {
|
public @NonNull PathConnectResult shouldPathConnect(Tile source, PathSide side, boolean diagonal) {
|
||||||
if (diagonal) return PathConnectResult.BY_TYPE;
|
if (diagonal) return PathConnectResult.BY_TYPE;
|
||||||
return switch (side) {
|
return switch (side) {
|
||||||
case North -> PathConnectResult.of(tile.equals(Tile.TILE_ZN), PathConnectResult.BY_TYPE);
|
case North -> PathConnectResult.of(tile.equals(Tile.TILE_ZN), PathConnectResult.BY_TYPE);
|
||||||
|
|||||||
Reference in New Issue
Block a user