diff --git a/sources/src/main/java/io/akarin/api/IMixinChunk.java b/sources/src/main/java/io/akarin/api/IMixinChunk.java new file mode 100644 index 000000000..c33b1579c --- /dev/null +++ b/sources/src/main/java/io/akarin/api/IMixinChunk.java @@ -0,0 +1,9 @@ +package io.akarin.api; + +import java.util.concurrent.atomic.AtomicInteger; + +public interface IMixinChunk { + AtomicInteger getPendingLightUpdates(); + + long getLightUpdateTime(); +} \ No newline at end of file diff --git a/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunkProviderServer.java b/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunkProviderServer.java new file mode 100644 index 000000000..31a6ffa2d --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/lighting/MixinChunkProviderServer.java @@ -0,0 +1,27 @@ +package io.akarin.server.mixin.lighting; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.Redirect; + +import io.akarin.api.IMixinChunk; +import net.minecraft.server.ChunkProviderServer; +import net.minecraft.server.WorldServer; + +@Mixin(value = ChunkProviderServer.class, remap = false, priority = 1001) +public class MixinChunkProviderServer { + @Shadow @Final public WorldServer world; + + @Redirect(method = "unloadChunks", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/Chunk;isUnloading()Z" + )) + public boolean shouldUnload(IMixinChunk chunk) { + if (chunk.getPendingLightUpdates().get() > 0 || this.world.getTime() - chunk.getLightUpdateTime() < 20) { + return false; + } + return true; + } +} diff --git a/sources/src/main/java/net/minecraft/server/EntityTracker.java b/sources/src/main/java/net/minecraft/server/EntityTracker.java index 168bb75f7..ad48af80b 100644 --- a/sources/src/main/java/net/minecraft/server/EntityTracker.java +++ b/sources/src/main/java/net/minecraft/server/EntityTracker.java @@ -11,6 +11,13 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +/** + * Akarin Changes Note
+ *
+ * 1) Make entries-set concurrent
+ * 2) Add lock for entries-set operations
+ * @author cakoyo + */ public class EntityTracker { private static final Logger a = LogManager.getLogger();