Skip to content

Commit 8bdde64

Browse files
committed
new: delayFullChunkEvents
1 parent 08dc640 commit 8bdde64

File tree

3 files changed

+213
-1
lines changed

3 files changed

+213
-1
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: ishland <[email protected]>
3+
Date: Wed, 24 Sep 2025 21:32:48 +0800
4+
Subject: [PATCH] new: delayFullChunkEvents
5+
6+
7+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/ChunkState.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/ChunkState.java
8+
index 50e44542..2e905ad0 100644
9+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/ChunkState.java
10+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/ChunkState.java
11+
@@ -4,5 +4,5 @@ import net.minecraft.world.chunk.Chunk;
12+
import net.minecraft.world.chunk.ChunkStatus;
13+
import net.minecraft.world.chunk.ProtoChunk;
14+
15+
-public record ChunkState(Chunk chunk, ProtoChunk protoChunk, ChunkStatus reachedStatus) {
16+
+public record ChunkState(Chunk chunk, ProtoChunk protoChunk, ChunkStatus reachedStatus, boolean wasFullChunk) {
17+
}
18+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/Config.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/Config.java
19+
index f0e4a197..5e906b89 100644
20+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/Config.java
21+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/Config.java
22+
@@ -99,6 +99,16 @@ public class Config {
23+
""")
24+
.getBoolean(false, false);
25+
26+
+ public static final boolean delayFullChunkEvents = new ConfigSystem.ConfigAccessor()
27+
+ .key("chunkSystem.delayFullChunkEvents")
28+
+ .comment("""
29+
+ Whether to delay full chunk events to after full chunk future have been completed
30+
+ This restores the buggy behavior in NeoForge that the ecosystem have been relying on
31+
+
32+
+ Do not change this unless you know what you are doing
33+
+ """)
34+
+ .getBoolean(true, false);
35+
+
36+
public static void init() {
37+
// intentionally empty
38+
}
39+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/TheChunkSystem.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/TheChunkSystem.java
40+
index a324dcdd..a3253b78 100644
41+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/TheChunkSystem.java
42+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/TheChunkSystem.java
43+
@@ -91,7 +91,7 @@ public class TheChunkSystem extends StatusAdvancingScheduler<ChunkPos, ChunkStat
44+
protected void onItemCreation(ItemHolder<ChunkPos, ChunkState, ChunkLoadingContext, NewChunkHolderVanillaInterface> holder) {
45+
super.onItemCreation(holder);
46+
holder.getUserData().set(new NewChunkHolderVanillaInterface(this, holder, ((IThreadedAnvilChunkStorage) this.tacs).getWorld(), ((IThreadedAnvilChunkStorage) this.tacs).getLightingProvider(), this.tacs));
47+
- holder.getItem().set(new ChunkState(null, null, null));
48+
+ holder.getItem().set(new ChunkState(null, null, null, false));
49+
}
50+
51+
@Override
52+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDisk.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDisk.java
53+
index a59fbe35..5b30f9ab 100644
54+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDisk.java
55+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDisk.java
56+
@@ -75,7 +75,7 @@ public class ReadFromDisk extends NewChunkStatus {
57+
}
58+
})
59+
.doOnSuccess(chunk -> {
60+
- context.holder().getItem().set(new ChunkState(chunk, chunk, ChunkStatus.EMPTY));
61+
+ context.holder().getItem().set(new ChunkState(chunk, chunk, ChunkStatus.EMPTY, chunk instanceof WrapperProtoChunk));
62+
if (!Config.lowMemoryMode) {
63+
context.holder().getUserData().get().triggerDeferredLoad(NewChunkStatus.DISK);
64+
}
65+
@@ -184,7 +184,7 @@ public class ReadFromDisk extends NewChunkStatus {
66+
67+
((IPOIUnloading) ((IThreadedAnvilChunkStorage) context.tacs()).getPointOfInterestStorage()).c2me$unloadPoi(context.holder().getKey());
68+
69+
- context.holder().getItem().set(new ChunkState(null, null, null));
70+
+ context.holder().getItem().set(new ChunkState(null, null, null, false));
71+
72+
return Completable.complete();
73+
}
74+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDiskAsync.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDiskAsync.java
75+
index c8f3a66a..a1185eed 100644
76+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDiskAsync.java
77+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ReadFromDiskAsync.java
78+
@@ -201,7 +201,7 @@ public class ReadFromDiskAsync extends ReadFromDisk {
79+
80+
((IPOIUnloading) ((IThreadedAnvilChunkStorage) context.tacs()).getPointOfInterestStorage()).c2me$unloadPoi(context.holder().getKey());
81+
82+
- context.holder().getItem().set(new ChunkState(null, null, null));
83+
+ context.holder().getItem().set(new ChunkState(null, null, null, false));
84+
}
85+
})
86+
.doOnError((throwable) -> {
87+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java
88+
index 1cafd0ad..64acc6cd 100644
89+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java
90+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java
91+
@@ -7,6 +7,7 @@ import com.ishland.c2me.base.mixin.access.IThreadedAnvilChunkStorage;
92+
import com.ishland.c2me.base.mixin.access.IWorldChunk;
93+
import com.ishland.c2me.rewrites.chunksystem.common.ChunkLoadingContext;
94+
import com.ishland.c2me.rewrites.chunksystem.common.ChunkState;
95+
+import com.ishland.c2me.rewrites.chunksystem.common.Config;
96+
import com.ishland.c2me.rewrites.chunksystem.common.NewChunkStatus;
97+
import com.ishland.c2me.rewrites.chunksystem.common.compat.lithium.LithiumChunkStatusTrackerInvoker;
98+
import com.ishland.c2me.rewrites.chunksystem.common.fapi.LifecycleEventInvoker;
99+
@@ -47,20 +48,10 @@ public class ServerAccessible extends NewChunkStatus {
100+
final WorldChunk worldChunk = toFullChunk(protoChunk, serverWorld);
101+
102+
worldChunk.setLevelTypeProvider(context.holder().getUserData().get()::getLevelType);
103+
- context.holder().getItem().set(new ChunkState(worldChunk, new WrapperProtoChunk(worldChunk, false), ChunkStatus.FULL));
104+
- if (!((IWorldChunk) worldChunk).isLoadedToWorld()) {
105+
- worldChunk.loadEntities();
106+
- worldChunk.setLoadedToWorld(true);
107+
- worldChunk.updateAllBlockEntities();
108+
- worldChunk.addChunkTickSchedulers(serverWorld);
109+
- LifecycleEventInvoker.invokeChunkLoaded(serverWorld, worldChunk, !(protoChunk instanceof WrapperProtoChunk));
110+
+ context.holder().getItem().set(new ChunkState(worldChunk, new WrapperProtoChunk(worldChunk, false), ChunkStatus.FULL, protoChunk instanceof WrapperProtoChunk));
111+
+ if (!Config.delayFullChunkEvents) {
112+
+ invokeFullChunkEvents(context, worldChunk, serverWorld, protoChunk instanceof WrapperProtoChunk);
113+
}
114+
-
115+
- if (LateModStatuses.fabric_lifecycle_events_v1_CHUNK_LEVEL_TYPE_CHANGE) {
116+
- LifecycleEventInvoker.invokeChunkLevelTypeChange(serverWorld, worldChunk, ChunkLevelType.INACCESSIBLE, ChunkLevelType.FULL);
117+
- }
118+
- ((IThreadedAnvilChunkStorage) context.tacs()).getCurrentChunkHolders().put(context.holder().getKey().toLong(), context.holder().getUserData().get());
119+
- ((IThreadedAnvilChunkStorage) context.tacs()).setChunkHolderListDirty(true);
120+
}
121+
})
122+
.subscribeOn(Schedulers.from(((IThreadedAnvilChunkStorage) context.tacs()).getMainThreadExecutor()));
123+
@@ -68,7 +59,31 @@ public class ServerAccessible extends NewChunkStatus {
124+
125+
@Override
126+
public Completable postUpgradeToThis(ChunkLoadingContext context) {
127+
- return Completable.complete();
128+
+ if (!Config.delayFullChunkEvents) return Completable.complete();
129+
+
130+
+ return Completable.fromRunnable(() -> {
131+
+ Assertions.assertTrue(((IThreadedAnvilChunkStorage) context.tacs()).getMainThreadExecutor().isOnThread());
132+
+ ChunkState chunkState = context.holder().getItem().get();
133+
+ WorldChunk worldChunk = (WorldChunk) chunkState.chunk();
134+
+ ServerWorld serverWorld = ((IThreadedAnvilChunkStorage) context.tacs()).getWorld();
135+
+ invokeFullChunkEvents(context, worldChunk, serverWorld, chunkState.wasFullChunk());
136+
+ });
137+
+ }
138+
+
139+
+ private static void invokeFullChunkEvents(ChunkLoadingContext context, WorldChunk worldChunk, ServerWorld serverWorld, boolean wasFullChunk) {
140+
+ if (!((IWorldChunk) worldChunk).isLoadedToWorld()) {
141+
+ worldChunk.loadEntities();
142+
+ worldChunk.setLoadedToWorld(true);
143+
+ worldChunk.updateAllBlockEntities();
144+
+ worldChunk.addChunkTickSchedulers(serverWorld);
145+
+ LifecycleEventInvoker.invokeChunkLoaded(serverWorld, worldChunk, !wasFullChunk);
146+
+ }
147+
+
148+
+ if (LateModStatuses.fabric_lifecycle_events_v1_CHUNK_LEVEL_TYPE_CHANGE) {
149+
+ LifecycleEventInvoker.invokeChunkLevelTypeChange(serverWorld, worldChunk, ChunkLevelType.INACCESSIBLE, ChunkLevelType.FULL);
150+
+ }
151+
+ ((IThreadedAnvilChunkStorage) context.tacs()).getCurrentChunkHolders().put(context.holder().getKey().toLong(), context.holder().getUserData().get());
152+
+ ((IThreadedAnvilChunkStorage) context.tacs()).setChunkHolderListDirty(true);
153+
}
154+
155+
private static WorldChunk toFullChunk(ProtoChunk protoChunk, ServerWorld serverWorld) {
156+
@@ -109,7 +124,7 @@ public class ServerAccessible extends NewChunkStatus {
157+
if (LateModStatuses.fabric_lifecycle_events_v1_CHUNK_LEVEL_TYPE_CHANGE) {
158+
LifecycleEventInvoker.invokeChunkLevelTypeChange(serverWorld, worldChunk, ChunkLevelType.FULL, ChunkLevelType.INACCESSIBLE);
159+
}
160+
- LithiumChunkStatusTrackerInvoker.invokeOnChunkInaccessible(((IThreadedAnvilChunkStorage) context.tacs()).getWorld(), context.holder().getKey());worldChunk.setLevelTypeProvider(null);context.holder().getItem().set(new ChunkState(state.protoChunk(), state.protoChunk(), ChunkStatus.FULL));
161+
+ LithiumChunkStatusTrackerInvoker.invokeOnChunkInaccessible(((IThreadedAnvilChunkStorage) context.tacs()).getWorld(), context.holder().getKey());worldChunk.setLevelTypeProvider(null);context.holder().getItem().set(new ChunkState(state.protoChunk(), state.protoChunk(), ChunkStatus.FULL, true));
162+
}
163+
})
164+
.subscribeOn(Schedulers.from(((IThreadedAnvilChunkStorage) context.tacs()).getMainThreadExecutor()));
165+
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/VanillaWorldGenerationDelegate.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/VanillaWorldGenerationDelegate.java
166+
index 8f9e99cc..9c17a371 100644
167+
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/VanillaWorldGenerationDelegate.java
168+
+++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/VanillaWorldGenerationDelegate.java
169+
@@ -24,6 +24,7 @@ import net.minecraft.world.chunk.ChunkGenerationSteps;
170+
import net.minecraft.world.chunk.ChunkStatus;
171+
import net.minecraft.world.chunk.GenerationDependencies;
172+
import net.minecraft.world.chunk.ProtoChunk;
173+
+import net.minecraft.world.chunk.WrapperProtoChunk;
174+
import org.jetbrains.annotations.Nullable;
175+
import org.slf4j.Logger;
176+
import org.slf4j.LoggerFactory;
177+
@@ -123,7 +124,7 @@ public class VanillaWorldGenerationDelegate extends NewChunkStatus {
178+
.run(((IThreadedAnvilChunkStorage) context.tacs()).getGenerationContext(), context.chunks(), chunk)
179+
.whenComplete((chunk1, throwable) -> {
180+
if (chunk1 != null) {
181+
- context.holder().getItem().set(new ChunkState(chunk1, (ProtoChunk) chunk1, this.status));
182+
+ context.holder().getItem().set(new ChunkState(chunk1, (ProtoChunk) chunk1, this.status, chunk1 instanceof WrapperProtoChunk));
183+
}
184+
})
185+
));
186+
@@ -138,7 +139,7 @@ public class VanillaWorldGenerationDelegate extends NewChunkStatus {
187+
return step.run(chunkGenerationContext, context.chunks(), chunk)
188+
.whenComplete((chunk1, throwable) -> {
189+
if (chunk1 != null) {
190+
- context.holder().getItem().set(new ChunkState(chunk1, (ProtoChunk) chunk1, this.status));
191+
+ context.holder().getItem().set(new ChunkState(chunk1, (ProtoChunk) chunk1, this.status, chunk1 instanceof WrapperProtoChunk));
192+
}
193+
}).thenAccept(__ -> {
194+
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: ishland <[email protected]>
3+
Date: Wed, 24 Sep 2025 21:43:31 +0800
4+
Subject: [PATCH] fix: weird neoforge issue
5+
6+
7+
diff --git a/c2me-opts-allocs/src/main/resources/c2me-opts-allocs.mixins.json b/c2me-opts-allocs/src/main/resources/c2me-opts-allocs.mixins.json
8+
index 4c62f92c..1e41f49e 100644
9+
--- a/c2me-opts-allocs/src/main/resources/c2me-opts-allocs.mixins.json
10+
+++ b/c2me-opts-allocs/src/main/resources/c2me-opts-allocs.mixins.json
11+
@@ -5,7 +5,6 @@
12+
"plugin": "com.ishland.c2me.opts.allocs.MixinPlugin",
13+
"mixins": [
14+
"MixinIdentifier",
15+
- "MixinNbtList",
16+
"MixinUtil",
17+
"asm.ASMTargets",
18+
"noise.MixinChainedBlockSource",

0 commit comments

Comments
 (0)