Skip to content

Commit

Permalink
new: backport notickvd changes from 1.21.4
Browse files Browse the repository at this point in the history
  • Loading branch information
ishland committed Jan 24, 2025
1 parent f410d1c commit b349bf1
Show file tree
Hide file tree
Showing 9 changed files with 2,287 additions and 0 deletions.
1,022 changes: 1,022 additions & 0 deletions patches/main/0011-new-scalable-no-tick-view-distance-allowing-usable-3.patch

Large diffs are not rendered by default.

854 changes: 854 additions & 0 deletions patches/main/0012-fix-notickvd-lighting-desync.patch

Large diffs are not rendered by default.

51 changes: 51 additions & 0 deletions patches/main/0013-fix-mobcaps-counting-in-border-chunks.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: ishland <[email protected]>
Date: Wed, 1 Jan 2025 12:14:11 +0800
Subject: [PATCH] fix: mobcaps counting in border chunks

Backported from 28a682c159503b5ad1ed8b4e14bda39d7f6319ce

diff --git a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinSimulationDistanceLevelPropagator.java b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinSimulationDistanceLevelPropagator.java
new file mode 100644
index 00000000..cb3450e0
--- /dev/null
+++ b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinSimulationDistanceLevelPropagator.java
@@ -0,0 +1,26 @@
+package com.ishland.c2me.notickvd.mixin;
+
+import net.minecraft.world.SimulationDistanceLevelPropagator;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.Constant;
+import org.spongepowered.asm.mixin.injection.ModifyConstant;
+
+@Mixin(SimulationDistanceLevelPropagator.class)
+public class MixinSimulationDistanceLevelPropagator {
+
+ @ModifyConstant(method = "<init>", constant = {@Constant(intValue = 34), @Constant(intValue = 33)}, require = 2)
+ private static int modifyMax(int constant) {
+ return constant + 1;
+ }
+
+ @ModifyConstant(method = "getLevel(Lnet/minecraft/util/collection/SortedArraySet;)I", constant = @Constant(intValue = 34))
+ private int modifyMax1(int constant) {
+ return constant + 1;
+ }
+
+ @ModifyConstant(method = "setLevel", constant = @Constant(intValue = 33))
+ private int modifyMax2(int constant) {
+ return constant + 1;
+ }
+
+}
diff --git a/c2me-notickvd/src/main/resources/c2me-notickvd.mixins.json b/c2me-notickvd/src/main/resources/c2me-notickvd.mixins.json
index c03ffb8f..be745776 100644
--- a/c2me-notickvd/src/main/resources/c2me-notickvd.mixins.json
+++ b/c2me-notickvd/src/main/resources/c2me-notickvd.mixins.json
@@ -12,6 +12,7 @@
"MixinServerAccessibleChunkSending",
"MixinServerBlockTicking",
"MixinServerChunkManager",
+ "MixinSimulationDistanceLevelPropagator",
"MixinThreadedAnvilChunkStorage",
"MixinWorld",
"MixinWorldChunk",
48 changes: 48 additions & 0 deletions patches/main/0014-fix-add-vanilla-tickets-in-notickvd.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: ishland <[email protected]>
Date: Fri, 6 Dec 2024 23:12:12 +0800
Subject: [PATCH] fix: add vanilla tickets in notickvd

Backported from c75bb5d0ad71904d710a4475896f2ebf20e5fc1f

diff --git a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
index 319e00c9..aabdfd8e 100644
--- a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
+++ b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
@@ -18,10 +18,12 @@ import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet;
import it.unimi.dsi.fastutil.longs.LongSet;
import it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator;
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
+import net.minecraft.server.world.ChunkTicketType;
import net.minecraft.server.world.ServerChunkLoadingManager;
import net.minecraft.util.math.ChunkPos;
import org.slf4j.Logger;

+import java.util.Comparator;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.LongFunction;
@@ -31,6 +33,7 @@ public class PlayerNoTickLoader {
private static final Logger LOGGER = LogUtils.getLogger();

public static final ItemTicket.TicketType TICKET_TYPE = new ItemTicket.TicketType("c2me:notickvd");
+ public static final ChunkTicketType<ChunkPos> VANILLA_TICKET_TYPE = ChunkTicketType.create("c2me_notickvd", Comparator.comparingLong(ChunkPos::toLong));

private final ServerChunkLoadingManager tacs;
private final NoTickSystem noTickSystem;
@@ -181,6 +184,7 @@ public class PlayerNoTickLoader {
NewChunkStatus.SERVER_ACCESSIBLE_CHUNK_SENDING,
StatusAdvancingScheduler.NO_OP
);
+ this.noTickSystem.mainBeforeTicketTicks.add(() -> this.tacs.getTicketManager().addTicketWithLevel(VANILLA_TICKET_TYPE, pos, 33, pos));
return holder.getFutureForStatus(NewChunkStatus.SERVER_ACCESSIBLE);
}

@@ -192,6 +196,7 @@ public class PlayerNoTickLoader {
pos,
NewChunkStatus.SERVER_ACCESSIBLE_CHUNK_SENDING
);
+ this.noTickSystem.mainBeforeTicketTicks.add(() -> this.tacs.getTicketManager().removeTicketWithLevel(VANILLA_TICKET_TYPE, pos, 33, pos));
}

public long getPendingLoadsCount() {
45 changes: 45 additions & 0 deletions patches/main/0015-fix-no-tick-pending-chunk-loads-counter.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: ishland <[email protected]>
Date: Thu, 2 Jan 2025 21:39:27 +0800
Subject: [PATCH] fix: no-tick pending chunk loads counter

Backported from 6073966852cea0d5ffcf5048831766753dace91a

diff --git a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
index aabdfd8e..b2a9c4ce 100644
--- a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
+++ b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
@@ -114,16 +114,6 @@ public class PlayerNoTickLoader {
}

this.tickFutures();
-
- {
- long pendingLoadsCount = 0L;
- ObjectBidirectionalIterator<Long2ReferenceMap.Entry<ChunkIterator>> iterator = this.iterators.long2ReferenceEntrySet().fastIterator();
- while (iterator.hasNext()) {
- Long2ReferenceMap.Entry<ChunkIterator> entry = iterator.next();
- pendingLoadsCount += entry.getValue().remaining();
- }
- this.pendingLoadsCountSnapshot = pendingLoadsCount;
- }
}

private void clearTickets() {
@@ -142,6 +132,16 @@ public class PlayerNoTickLoader {

if (this.closing.get()) return;
while (this.chunkLoadFutures.size() < Config.maxConcurrentChunkLoads && this.addOneTicket());
+
+ {
+ long pendingLoadsCount = 0L;
+ ObjectBidirectionalIterator<Long2ReferenceMap.Entry<ChunkIterator>> iterator = this.iterators.long2ReferenceEntrySet().fastIterator();
+ while (iterator.hasNext()) {
+ Long2ReferenceMap.Entry<ChunkIterator> entry = iterator.next();
+ pendingLoadsCount += entry.getValue().remaining();
+ }
+ this.pendingLoadsCountSnapshot = pendingLoadsCount;
+ }
}

private boolean addOneTicket() {
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: ishland <[email protected]>
Date: Fri, 24 Jan 2025 22:11:49 +0800
Subject: [PATCH] change: sync 1.21.4 MixinServerAccessibleChunkSending


diff --git a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinServerAccessibleChunkSending.java b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinServerAccessibleChunkSending.java
index 4bb24b66..21ada3b6 100644
--- a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinServerAccessibleChunkSending.java
+++ b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinServerAccessibleChunkSending.java
@@ -1,18 +1,32 @@
package com.ishland.c2me.notickvd.mixin;

+import com.google.common.collect.ImmutableList;
+import com.ishland.c2me.base.common.threadstate.ThreadInstrumentation;
import com.ishland.c2me.base.mixin.access.IThreadedAnvilChunkStorage;
import com.ishland.c2me.rewrites.chunksystem.common.ChunkLoadingContext;
import com.ishland.c2me.rewrites.chunksystem.common.ChunkState;
+import com.ishland.c2me.rewrites.chunksystem.common.Config;
import com.ishland.c2me.rewrites.chunksystem.common.NewChunkHolderVanillaInterface;
import com.ishland.c2me.rewrites.chunksystem.common.NewChunkStatus;
import com.ishland.c2me.rewrites.chunksystem.common.statuses.ServerAccessibleChunkSending;
+import com.ishland.c2me.rewrites.chunksystem.common.threadstate.ChunkTaskWork;
import com.ishland.flowsched.scheduler.Cancellable;
import com.ishland.flowsched.scheduler.ItemHolder;
import com.ishland.flowsched.scheduler.KeyStatusPair;
+import it.unimi.dsi.fastutil.shorts.ShortList;
+import it.unimi.dsi.fastutil.shorts.ShortListIterator;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
import net.minecraft.server.world.ServerChunkLoadingManager;
+import net.minecraft.server.world.ServerWorld;
+import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
+import net.minecraft.world.ChunkRegion;
import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.ChunkGenerationSteps;
import net.minecraft.world.chunk.ChunkStatus;
+import net.minecraft.world.chunk.ProtoChunk;
import net.minecraft.world.chunk.WorldChunk;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@@ -24,6 +38,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

+import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

@@ -56,7 +71,48 @@ public class MixinServerAccessibleChunkSending {
*/
@Overwrite(remap = false)
public CompletionStage<Void> upgradeToThis(ChunkLoadingContext context, Cancellable cancellable) {
- return CompletableFuture.runAsync(() -> sendChunkToPlayer(context.tacs(), context.holder()), ((IThreadedAnvilChunkStorage) context.tacs()).getMainThreadExecutor());
+ ArrayList<BlockPos> blocksToRemove = new ArrayList<>();
+ if (Config.suppressGhostMushrooms) {
+ ServerWorld serverWorld = ((IThreadedAnvilChunkStorage) context.tacs()).getWorld();
+ ChunkState state = context.holder().getItem().get();
+ ChunkRegion chunkRegion = new ChunkRegion(serverWorld, context.chunks(), ChunkGenerationSteps.GENERATION.get(ChunkStatus.FULL), state.protoChunk());
+ Chunk chunk = state.chunk();
+
+ ChunkPos chunkPos = context.holder().getKey();
+
+ ShortList[] postProcessingLists = chunk.getPostProcessingLists();
+ for (int i = 0; i < postProcessingLists.length; i++) {
+ if (postProcessingLists[i] != null) {
+ for (ShortListIterator iterator = postProcessingLists[i].iterator(); iterator.hasNext(); ) {
+ short short_ = iterator.nextShort();
+ BlockPos blockPos = ProtoChunk.joinBlockPos(short_, chunk.sectionIndexToCoord(i), chunkPos);
+ BlockState blockState = chunk.getBlockState(blockPos);
+
+ if (blockState.getBlock() == Blocks.BROWN_MUSHROOM || blockState.getBlock() == Blocks.RED_MUSHROOM) {
+ if (!blockState.canPlaceAt(chunkRegion, blockPos)) {
+ blocksToRemove.add(blockPos);
+ }
+ }
+ }
+ }
+ }
+ }
+ return CompletableFuture.runAsync(() -> {
+ try (var ignored = ThreadInstrumentation.getCurrent().begin(new ChunkTaskWork(context, (ServerAccessibleChunkSending) (Object) this, true))) {
+ if (Config.suppressGhostMushrooms) {
+ ServerWorld serverWorld = ((IThreadedAnvilChunkStorage) context.tacs()).getWorld();
+ ChunkState state = context.holder().getItem().get();
+ Chunk chunk = state.chunk();
+ for (BlockPos blockPos : blocksToRemove) {
+ serverWorld.setBlockState(blockPos, Blocks.AIR.getDefaultState(), Block.NO_REDRAW | Block.FORCE_STATE);
+ }
+ for (BlockPos blockPos2 : ImmutableList.copyOf(chunk.getBlockEntityPositions())) {
+ chunk.getBlockEntity(blockPos2);
+ }
+ }
+ sendChunkToPlayer(context.tacs(), context.holder());
+ }
+ }, ((IThreadedAnvilChunkStorage) context.tacs()).getMainThreadExecutor());
}

@Unique
diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/MixinWorldChunk.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/MixinWorldChunk.java
deleted file mode 100644
index 7746bcbc..00000000
--- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/MixinWorldChunk.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.ishland.c2me.rewrites.chunksystem.mixin;
-
-import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
-import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-import net.minecraft.block.entity.BlockEntity;
-import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket;
-import net.minecraft.registry.Registry;
-import net.minecraft.server.network.ServerPlayerEntity;
-import net.minecraft.server.world.ServerWorld;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.ChunkPos;
-import net.minecraft.world.HeightLimitView;
-import net.minecraft.world.World;
-import net.minecraft.world.biome.Biome;
-import net.minecraft.world.chunk.Chunk;
-import net.minecraft.world.chunk.ChunkSection;
-import net.minecraft.world.chunk.UpgradeData;
-import net.minecraft.world.chunk.WorldChunk;
-import net.minecraft.world.gen.chunk.BlendingData;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-
-import java.util.List;
-
-@Mixin(WorldChunk.class)
-public abstract class MixinWorldChunk extends Chunk {
-
- @Shadow @Final private World world;
-
- public MixinWorldChunk(ChunkPos pos, UpgradeData upgradeData, HeightLimitView heightLimitView, Registry<Biome> biomeRegistry, long inhabitedTime, @Nullable ChunkSection[] sectionArray, @Nullable BlendingData blendingData) {
- super(pos, upgradeData, heightLimitView, biomeRegistry, inhabitedTime, sectionArray, blendingData);
- }
-
- @WrapOperation(method = "runPostProcessing", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/WorldChunk;getBlockEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/entity/BlockEntity;"))
- private BlockEntity syncBlockEntities(WorldChunk instance, BlockPos pos, Operation<BlockEntity> original) {
- if (this.world instanceof ServerWorld serverWorld) {
- BlockEntity blockEntity = original.call(instance, pos);
- if (blockEntity == null) return null;
-
- List<ServerPlayerEntity> playersWatchingChunk = serverWorld.getChunkManager().chunkLoadingManager.getPlayersWatchingChunk(this.getPos(), false);
- BlockEntityUpdateS2CPacket packet = BlockEntityUpdateS2CPacket.create(blockEntity);
- for (ServerPlayerEntity player : playersWatchingChunk) {
- player.networkHandler.send(packet);
- }
-
- return blockEntity;
- } else {
- return original.call(instance, pos);
- }
- }
-
-}
diff --git a/c2me-rewrites-chunk-system/src/main/resources/c2me-rewrites-chunk-system.mixins.json b/c2me-rewrites-chunk-system/src/main/resources/c2me-rewrites-chunk-system.mixins.json
index d54edac4..47e86bf4 100644
--- a/c2me-rewrites-chunk-system/src/main/resources/c2me-rewrites-chunk-system.mixins.json
+++ b/c2me-rewrites-chunk-system/src/main/resources/c2me-rewrites-chunk-system.mixins.json
@@ -14,7 +14,6 @@
"MixinSerializingRegionBasedStorage",
"MixinServerChunkManager",
"MixinThreadedAnvilChunkStorage",
- "MixinWorldChunk",
"async_serialization.MixinBlender",
"async_serialization.MixinChunkRegion",
"async_serialization.MixinChunkSerializer",
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: ishland <[email protected]>
Date: Tue, 21 Jan 2025 12:13:43 +0800
Subject: [PATCH] fix: load 1 extra radius to notickvd to avoid issues

Backported from a8a51fcbc9b02844e0bec7a8386e0f4128b3d8f4

diff --git a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
index b2a9c4ce..30e68469 100644
--- a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
+++ b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/common/PlayerNoTickLoader.java
@@ -64,7 +64,6 @@ public class PlayerNoTickLoader {

public void setViewDistance(int viewDistance) {
this.viewDistance = viewDistance;
- this.dirtyManagedChunks = true;
this.recreateIterators = true;
}

diff --git a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinChunkTicketManager.java b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinChunkTicketManager.java
index 1d683e6d..37732ee8 100644
--- a/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinChunkTicketManager.java
+++ b/c2me-notickvd/src/main/java/com/ishland/c2me/notickvd/mixin/MixinChunkTicketManager.java
@@ -79,7 +79,7 @@ public class MixinChunkTicketManager implements ChunkTicketManagerExtension {
*/
@Overwrite
public void setWatchDistance(int viewDistance) {
- this.noTickSystem.setNoTickViewDistance(viewDistance);
+ this.noTickSystem.setNoTickViewDistance(viewDistance + 1);
}

@Override
Loading

0 comments on commit b349bf1

Please sign in to comment.