Skip to content

Commit 4d4e170

Browse files
committed
feat: fire event to allow custom min-Y calculator registration
1 parent 367cd60 commit 4d4e170

File tree

5 files changed

+80
-6
lines changed

5 files changed

+80
-6
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package dev.ftb.mods.ftbchunks;
2+
3+
import dev.ftb.mods.ftbchunks.api.LevelMinYCalculator;
4+
import dev.ftb.mods.ftbchunks.api.event.CustomMinYEvent;
5+
import net.minecraft.core.BlockPos;
6+
import net.minecraft.world.level.Level;
7+
8+
import java.util.List;
9+
import java.util.OptionalInt;
10+
import java.util.concurrent.CopyOnWriteArrayList;
11+
12+
public class CustomMinYRegistryImpl implements CustomMinYEvent.CustomMinYRegistry {
13+
private static final CustomMinYRegistryImpl serverInstance = new CustomMinYRegistryImpl();
14+
private static final CustomMinYRegistryImpl clientInstance = new CustomMinYRegistryImpl();
15+
16+
private final List<LevelMinYCalculator> calculators = new CopyOnWriteArrayList<>(); // needs to be threadsafe
17+
18+
public static CustomMinYRegistryImpl getInstance(boolean isClientSide) {
19+
return isClientSide ? clientInstance : serverInstance;
20+
}
21+
22+
public void register(LevelMinYCalculator calculator) {
23+
calculators.add(calculator);
24+
}
25+
26+
public int getMinYAt(Level level, BlockPos pos) {
27+
for (var calc : calculators) {
28+
OptionalInt h = calc.getLevelMinY(level, pos);
29+
if (h.isPresent()) {
30+
return h.getAsInt();
31+
}
32+
}
33+
return level.getMinBuildHeight();
34+
}
35+
}

common/src/main/java/dev/ftb/mods/ftbchunks/FTBChunks.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import dev.architectury.utils.EnvExecutor;
1515
import dev.architectury.utils.value.IntValue;
1616
import dev.ftb.mods.ftbchunks.api.*;
17+
import dev.ftb.mods.ftbchunks.api.event.CustomMinYEvent;
1718
import dev.ftb.mods.ftbchunks.client.FTBChunksClient;
1819
import dev.ftb.mods.ftbchunks.client.FTBChunksClientConfig;
1920
import dev.ftb.mods.ftbchunks.data.*;
@@ -133,6 +134,10 @@ public FTBChunks() {
133134
TickEvent.PLAYER_POST.register(this::playerTickPost);
134135

135136
EnvExecutor.runInEnv(Env.CLIENT, () -> FTBChunksClient.INSTANCE::init);
137+
138+
LifecycleEvent.SETUP.register(() ->
139+
CustomMinYEvent.REGISTER.invoker().register(CustomMinYRegistryImpl.getInstance(Platform.getEnvironment() == Env.CLIENT))
140+
);
136141
}
137142

138143
private EventResult playerAttackEntity(Player player, Level level, Entity entity, InteractionHand interactionHand, @Nullable EntityHitResult entityHitResult) {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.ftb.mods.ftbchunks.api;
2+
3+
import dev.ftb.mods.ftbchunks.api.event.CustomMinYEvent;
4+
import net.minecraft.core.BlockPos;
5+
import net.minecraft.world.level.Level;
6+
7+
import java.util.OptionalInt;
8+
9+
/**
10+
* Functional interface to allow custom minimum Y levels to be returned for a given dimension and block position.
11+
* The intention of this is to allow for custom areas of a map to be concealed from FTB Chunks mapping.
12+
* <p>
13+
* Listen to the Architectury {@link CustomMinYEvent} event to register this method, on both client and server.
14+
*/
15+
@FunctionalInterface
16+
public interface LevelMinYCalculator {
17+
OptionalInt getLevelMinY(Level level, BlockPos pos);
18+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package dev.ftb.mods.ftbchunks.api.event;
2+
3+
import dev.architectury.event.Event;
4+
import dev.architectury.event.EventFactory;
5+
import dev.ftb.mods.ftbchunks.api.LevelMinYCalculator;
6+
7+
public interface CustomMinYEvent {
8+
Event<CustomMinYEvent> REGISTER = EventFactory.createLoop();
9+
10+
void register(CustomMinYRegistry registry);
11+
12+
interface CustomMinYRegistry {
13+
void register(LevelMinYCalculator calculator);
14+
}
15+
}

common/src/main/java/dev/ftb/mods/ftbchunks/util/HeightUtils.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package dev.ftb.mods.ftbchunks.util;
22

3+
import dev.ftb.mods.ftbchunks.CustomMinYRegistryImpl;
34
import dev.ftb.mods.ftbchunks.FTBChunksWorldConfig;
45
import dev.ftb.mods.ftbchunks.client.FTBChunksClient;
5-
import dev.ftb.mods.ftbchunks.client.FTBChunksClientConfig;
66
import dev.ftb.mods.ftbchunks.core.BlockStateFTBC;
77
import net.minecraft.core.BlockPos;
88
import net.minecraft.util.Mth;
@@ -43,14 +43,15 @@ public static int getHeight(Level level, @Nullable ChunkAccess chunkAccess, Bloc
4343
return UNKNOWN;
4444
}
4545

46-
int chunkX = pos.getX() >> 4;
47-
int chunkZ = pos.getZ() >> 4;
46+
// int chunkX = pos.getX() >> 4;
47+
// int chunkZ = pos.getZ() >> 4;
4848

4949
// Clamped within the dimensions build height limits
50-
int startY = FTBChunksWorldConfig.OVERRIDE_MIN_Y_LEVEL.get()
51-
? getMinYFromChunkOrConfig(chunkX, chunkZ)
52-
: chunkAccess.getMinBuildHeight();
50+
// int startY = FTBChunksWorldConfig.OVERRIDE_MIN_Y_LEVEL.get()
51+
// ? getMinYFromChunkOrConfig(chunkX, chunkZ)
52+
// : chunkAccess.getMinBuildHeight();
5353

54+
int startY = CustomMinYRegistryImpl.getInstance(level.isClientSide).getMinYAt(level, pos);
5455
int bottomY = Mth.clamp(startY, chunkAccess.getMinBuildHeight(), chunkAccess.getMaxBuildHeight());
5556

5657
int topY = pos.getY();

0 commit comments

Comments
 (0)