Skip to content

Commit 957aae9

Browse files
committed
Fixed some village gen issues
1 parent d3c664e commit 957aae9

File tree

10 files changed

+75
-31
lines changed

10 files changed

+75
-31
lines changed

src/main/java/gollorum/signpost/WaystoneLibrary.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ public boolean hasThePermissionToEdit(Player player) {
123123

124124
}
125125

126+
public static final class WaystoneInfo {
127+
public final String name;
128+
public final WaystoneLocationData locationData;
129+
public final WaystoneHandle.Vanilla handle;
130+
131+
public WaystoneInfo(String name, WaystoneLocationData locationData, WaystoneHandle.Vanilla handle) {
132+
this.name = name;
133+
this.locationData = locationData;
134+
this.handle = handle;
135+
}
136+
}
137+
126138
private final Map<WaystoneHandle.Vanilla, WaystoneEntry> allWaystones = new ConcurrentHashMap<>();
127139
private final Map<PlayerHandle, Set<WaystoneHandle.Vanilla>> playerMemory = new ConcurrentHashMap<>();
128140

@@ -331,6 +343,16 @@ public Optional<Set<String>> getAllWaystoneNames(boolean isClient) {
331343
: Optional.of(new HashSet<>(cachedWaystoneNames));
332344
}
333345

346+
// Only on server
347+
public Set<WaystoneInfo> getAllWaystoneInfo() {
348+
assert Signpost.getServerType().isServer;
349+
return allWaystones.entrySet().stream().map(entry -> new WaystoneInfo(
350+
entry.getValue().name,
351+
entry.getValue().locationData,
352+
entry.getKey()
353+
)).collect(Collectors.toSet());
354+
}
355+
334356
private Optional<WaystoneData> tryGetWaystoneDataAt(WorldLocation location) {
335357
return getInstance().allWaystones.entrySet().stream()
336358
.filter(e -> e.getValue().locationData.block.equals(location))

src/main/java/gollorum/signpost/minecraft/block/ModelWaystone.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public Variant(String name, String langPrefix, VoxelShape shape, float modelYOff
6868
public static final List<Variant> variants = new ArrayList<>();
6969
public static Variant simple_0 = new Variant("simple_0", "0", Shapes.box(0.25f, 0, 0.25f, 0.75f, 0.5f, 0.75f), 1);
7070
public static Variant simple_1 = new Variant("simple_1", "0", Shapes.box(0.25f, 0, 0.25f, 0.75f, 0.5f, 0.75f), 1);
71-
public static Variant simple_2 = new Variant("simple_2", "0", Shapes.box(0.3125f, 0, 0.3125f, 0.75f, 0.6875f, 0.6875f), 0);
71+
public static Variant simple_2 = new Variant("simple_2", "0", Shapes.box(0.3125f, 0, 0.3125f, 0.6875f, 0.75f, 0.6875f), 0);
7272
public static Variant detailed_0 = new Variant("detailed_0", "1", Shapes.box(0.25f, 0, 0.25f, 0.75f, 0.5f, 0.75f), 2);
7373
public static Variant detailed_1 = new Variant("detailed_1", "1", Shapes.box(0.25f, 0, 0.25f, 0.75f, 0.75f, 0.75f), 0);
7474
public static Variant aer = new Variant("aer", "2", Shapes.box(0.05f, 0, 0.05f, 0.95f, 0.6f, 0.95f), 0);

src/main/java/gollorum/signpost/minecraft/worldgen/SignpostJigsawPiece.java

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gollorum.signpost.minecraft.worldgen;
22

33
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.Streams;
45
import com.mojang.datafixers.util.Either;
56
import com.mojang.serialization.Codec;
67
import com.mojang.serialization.codecs.RecordCodecBuilder;
@@ -45,6 +46,7 @@
4546
import java.util.function.Function;
4647
import java.util.function.Supplier;
4748
import java.util.stream.Collectors;
49+
import java.util.stream.Stream;
4850

4951
public class SignpostJigsawPiece extends SinglePoolElement {
5052

@@ -100,7 +102,7 @@ public boolean place(
100102
if(!Config.Server.worldGen.isVillageGenerationEnabled.get()) return false;
101103
if(signpostCountForVillage.getOrDefault(villageLocation, 0) >= Config.Server.worldGen.maxSignpostsPerVillage.get())
102104
return false;
103-
Queue<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> possibleTargets = fetchPossibleTargets(pieceLocation, villageLocation, random);
105+
Queue<Tuple<BlockPos, WaystoneHandle.Vanilla>> possibleTargets = fetchPossibleTargets(pieceLocation, villageLocation, random);
104106
if(possibleTargets.isEmpty()) {
105107
Signpost.LOGGER.debug("Did not generate signpost because no targets were found.");
106108
return false;
@@ -129,24 +131,40 @@ public boolean place(
129131
}
130132
}
131133

132-
private static Queue<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> fetchPossibleTargets(BlockPos pieceLocation, BlockPos villageLocation, Random random) {
133-
return WaystoneJigsawPiece.getAllEntries().stream()
134-
.filter(e -> !(e.getKey().equals(villageLocation) || (
135-
waystonesTargetedByVillage.containsKey(villageLocation)
136-
&& waystonesTargetedByVillage.get(villageLocation).contains(e.getValue()))))
137-
.map(e -> new Tuple<>(e, (float) Math.sqrt(e.getKey().distSqr(pieceLocation)) * (0.5f + random.nextFloat())))
134+
private static Queue<Tuple<BlockPos, WaystoneHandle.Vanilla>> fetchPossibleTargets(BlockPos pieceLocation, BlockPos villageLocation, Random random) {
135+
return allWaystoneTargets(villageLocation)
136+
.map(e -> new Tuple<>(e, (float) Math.sqrt(e._1.distSqr(pieceLocation)) * (0.5f + random.nextFloat())))
138137
.sorted((e1, e2) -> Float.compare(e1._2, e2._2))
139138
.map(Tuple::getLeft)
140-
.filter(e -> WaystoneLibrary.getInstance().contains(e.getValue()))
139+
.filter(e -> WaystoneLibrary.getInstance().contains(e._2))
141140
.collect(Collectors.toCollection(LinkedList::new));
142141
}
143142

143+
private static Stream<Tuple<BlockPos, WaystoneHandle.Vanilla>> allWaystoneTargets(BlockPos villageLocation) {
144+
Stream<Tuple<BlockPos, WaystoneHandle.Vanilla>> villageWaystones = villageWaystonesExceptSelf(villageLocation);
145+
return (Config.Server.worldGen.villagesOnlyTargetVillages.get()
146+
? villageWaystones
147+
: Streams.concat(villageWaystones, nonVillageWaystones())
148+
).filter(e -> waystonesTargetedByVillage.containsKey(villageLocation)
149+
&& waystonesTargetedByVillage.get(villageLocation).contains(e._2));
150+
}
151+
private static Stream<Tuple<BlockPos, WaystoneHandle.Vanilla>> villageWaystonesExceptSelf(BlockPos villageLocation) {
152+
return WaystoneJigsawPiece.getAllEntries().stream()
153+
.filter(e -> !(e.getKey().equals(villageLocation)))
154+
.map(Tuple::from);
155+
}
156+
private static Stream<Tuple<BlockPos, WaystoneHandle.Vanilla>> nonVillageWaystones() {
157+
return WaystoneLibrary.getInstance().getAllWaystoneInfo().stream()
158+
.map(info -> new Tuple<>(info.locationData.block.blockPos, info.handle))
159+
.filter(t -> WaystoneJigsawPiece.getAllEntries().stream().noneMatch(e -> e.getValue().equals(t._2)));
160+
}
161+
144162
private Collection<WaystoneHandle.Vanilla> populateSignPostGeneration(
145163
StructurePlaceSettings placementSettings,
146164
BlockPos pieceLocation,
147165
WorldGenLevel world,
148166
Random random,
149-
Queue<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> possibleTargets
167+
Queue<Tuple<BlockPos, WaystoneHandle.Vanilla>> possibleTargets
150168
) {
151169
Direction facing = placementSettings.getRotation().rotate(Direction.WEST);
152170
Direction left = placementSettings.getRotation().rotate(Direction.SOUTH);
@@ -175,7 +193,7 @@ public Tuple<Collection<WaystoneHandle.Vanilla>, Consumer<PostTile>> makeSign(
175193
Direction facing,
176194
WorldGenLevel world,
177195
BlockPos tilePos,
178-
Queue<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> possibleTargets,
196+
Queue<Tuple<BlockPos, WaystoneHandle.Vanilla>> possibleTargets,
179197
float y
180198
) {
181199
if(possibleTargets.isEmpty()) return new Tuple<>(Collections.emptySet(), x -> {});
@@ -188,13 +206,13 @@ private Tuple<Collection<WaystoneHandle.Vanilla>, Consumer<PostTile>> makeWideSi
188206
Direction facing,
189207
WorldGenLevel world,
190208
BlockPos tilePos,
191-
Queue<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> possibleTargets,
209+
Queue<Tuple<BlockPos, WaystoneHandle.Vanilla>> possibleTargets,
192210
float y
193211
) {
194-
Map.Entry<BlockPos, WaystoneHandle.Vanilla> target = possibleTargets.poll();
212+
Tuple<BlockPos, WaystoneHandle.Vanilla> target = possibleTargets.poll();
195213
if(target == null) return new Tuple<>(Collections.emptySet(), x -> {});
196-
WaystoneData targetData = WaystoneLibrary.getInstance().getData(target.getValue());
197-
Angle rotation = SignBlockPart.pointingAt(tilePos, target.getKey());
214+
WaystoneData targetData = WaystoneLibrary.getInstance().getData(target._2);
215+
Angle rotation = SignBlockPart.pointingAt(tilePos, target._1);
198216
Consumer<PostTile> onTileFetched = tile -> {
199217
if(tile.getParts().stream().anyMatch(instance -> !(instance.blockPart instanceof PostBlockPart) && isNearly(instance.offset.y, y)))
200218
return;
@@ -203,7 +221,7 @@ private Tuple<Collection<WaystoneHandle.Vanilla>, Consumer<PostTile>> makeWideSi
203221
new SmallWideSignBlockPart(
204222
rotation, targetData.name, shouldFlip(facing, rotation),
205223
tile.modelType.mainTexture, tile.modelType.secondaryTexture,
206-
overlayFor(world, tilePos), Colors.black, Optional.of(target.getValue()),
224+
overlayFor(world, tilePos), Colors.black, Optional.of(target._2),
207225
ItemStack.EMPTY, tile.modelType, false
208226
),
209227
new Vector3(0, y, 0)
@@ -212,7 +230,7 @@ rotation, targetData.name, shouldFlip(facing, rotation),
212230
PlayerHandle.Invalid
213231
);
214232
};
215-
return new Tuple<>(Collections.singleton(target.getValue()), onTileFetched);
233+
return new Tuple<>(Collections.singleton(target._2), onTileFetched);
216234
}
217235

218236
private static boolean isNearly(float a, float b) { return Math.abs(a - b) < 1e-5f; }
@@ -221,13 +239,13 @@ private Tuple<Collection<WaystoneHandle.Vanilla>, Consumer<PostTile>> makeShortS
221239
Direction facing,
222240
WorldGenLevel world,
223241
BlockPos tilePos,
224-
Queue<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> possibleTargets,
242+
Queue<Tuple<BlockPos, WaystoneHandle.Vanilla>> possibleTargets,
225243
float y
226244
) {
227-
Map.Entry<BlockPos, WaystoneHandle.Vanilla> target = possibleTargets.poll();
245+
Tuple<BlockPos, WaystoneHandle.Vanilla> target = possibleTargets.poll();
228246
if(target == null) return new Tuple<>(Collections.emptySet(), x -> {});
229-
WaystoneData targetData = WaystoneLibrary.getInstance().getData(target.getValue());
230-
Angle rotation = SignBlockPart.pointingAt(tilePos, target.getKey());
247+
WaystoneData targetData = WaystoneLibrary.getInstance().getData(target._2);
248+
Angle rotation = SignBlockPart.pointingAt(tilePos, target._1);
231249
boolean shouldFlip = shouldFlip(facing, rotation);
232250
Optional<Overlay> overlay = overlayFor(world, tilePos);
233251
List<Consumer<PostTile>> onTileFetched = new ArrayList<>();
@@ -236,26 +254,26 @@ private Tuple<Collection<WaystoneHandle.Vanilla>, Consumer<PostTile>> makeShortS
236254
new SmallShortSignBlockPart(
237255
rotation, targetData.name, shouldFlip,
238256
tile.modelType.mainTexture, tile.modelType.secondaryTexture,
239-
overlay, Colors.black, Optional.of(target.getValue()),
257+
overlay, Colors.black, Optional.of(target._2),
240258
ItemStack.EMPTY, tile.modelType, false
241259
),
242260
new Vector3(0, y, 0)
243261
),
244262
ItemStack.EMPTY,
245263
PlayerHandle.Invalid
246264
));
247-
Map.Entry<BlockPos, WaystoneHandle.Vanilla> secondTarget = possibleTargets.poll();
248-
List<Map.Entry<BlockPos, WaystoneHandle.Vanilla>> skippedTargets = new ArrayList<>();
265+
Tuple<BlockPos, WaystoneHandle.Vanilla> secondTarget = possibleTargets.poll();
266+
List<Tuple<BlockPos, WaystoneHandle.Vanilla>> skippedTargets = new ArrayList<>();
249267
while(secondTarget != null) {
250-
WaystoneData secondTargetData = WaystoneLibrary.getInstance().getData(secondTarget.getValue());
251-
Angle secondRotation = SignBlockPart.pointingAt(tilePos, secondTarget.getKey());
268+
WaystoneData secondTargetData = WaystoneLibrary.getInstance().getData(secondTarget._2);
269+
Angle secondRotation = SignBlockPart.pointingAt(tilePos, secondTarget._1);
252270
boolean shouldSecondFlip = shouldFlip(facing, secondRotation);
253271
if(shouldSecondFlip == shouldFlip) {
254272
skippedTargets.add(secondTarget);
255273
secondTarget = possibleTargets.poll();
256274
continue;
257275
}
258-
WaystoneHandle.Vanilla secondTargetHandle = secondTarget.getValue();
276+
WaystoneHandle.Vanilla secondTargetHandle = secondTarget._2;
259277
onTileFetched.add(tile -> tile.addPart(
260278
new BlockPartInstance(
261279
new SmallShortSignBlockPart(
@@ -276,10 +294,10 @@ private Tuple<Collection<WaystoneHandle.Vanilla>, Consumer<PostTile>> makeShortS
276294
possibleTargets.addAll(skippedTargets);
277295
return new Tuple<>(
278296
secondTarget == null
279-
? Collections.singleton(target.getValue())
280-
: ImmutableList.of(target.getValue(), secondTarget.getValue()),
297+
? Collections.singleton(target._2)
298+
: ImmutableList.of(target._2, secondTarget._2),
281299
tile -> {
282-
if(!tile.getParts().stream().anyMatch(instance -> !(instance.blockPart instanceof PostBlockPart) && isNearly(instance.offset.y, y)))
300+
if(tile.getParts().stream().noneMatch(instance -> !(instance.blockPart instanceof PostBlockPart) && isNearly(instance.offset.y, y)))
283301
for(Consumer<PostTile> now : onTileFetched) now.accept(tile);
284302
}
285303
);

src/main/java/gollorum/signpost/utils/Tuple.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public static <T1, T2> Tuple<T1, T2> from(org.apache.commons.lang3.tuple.Pair<T1
2222
return new Tuple<>(pair.getLeft(), pair.getRight());
2323
}
2424

25+
public static <T1, T2> Tuple<T1, T2> from(Map.Entry<T1, T2> pair) {
26+
return new Tuple<>(pair.getKey(), pair.getValue());
27+
}
28+
2529
public T1 getLeft() { return _1; }
2630
public T2 getRight() { return _2; }
2731

src/main/java/gollorum/signpost/utils/WaystoneLocationData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import gollorum.signpost.utils.serialization.CompoundSerializable;
55
import net.minecraft.nbt.CompoundTag;
66

7-
public class WaystoneLocationData {
7+
public final class WaystoneLocationData {
88

99
public final WorldLocation block;
1010
/// Global.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)