diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index a2770142..1921a81d 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -104,6 +104,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("launch.class_search_cache", true); boolean isDevEnv = !FMLLoader.isProduction() && FMLLoader.getLoadingModList().getModFileById("modernfix").getFile().getLocator() instanceof ExplodedDirectoryLocator; this.addMixinRule("devenv", isDevEnv); + this.addMixinRule("perf.remove_spawn_chunks", isDevEnv); /* Mod compat */ disableIfModPresent("mixin.perf.thread_priorities", "smoothboot"); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/devenv/MinecraftServerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/devenv/MinecraftServerMixin.java deleted file mode 100644 index 176ac2c6..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/devenv/MinecraftServerMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.embeddedt.modernfix.mixin.devenv; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerChunkCache; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -/* Disable waiting for spawn chunk load */ -@Mixin(MinecraftServer.class) -public class MinecraftServerMixin { - @Redirect(method = "prepareLevels", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;getTickingGenerated()I")) - private int noSpawnChunkWait(ServerChunkCache cache) { - return 441; - } - - @Redirect(method = "prepareLevels", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;waitUntilNextTick()V")) - private void noWaitTick(MinecraftServer server) { - - } -} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java new file mode 100644 index 00000000..c48deeda --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.mixin.perf.remove_spawn_chunks; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.DistanceManager; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.TicketType; +import net.minecraft.util.Unit; +import net.minecraft.world.level.ChunkPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = MinecraftServer.class, priority = 1100) +public class MinecraftServerMixin { + @Redirect(method = "prepareLevels", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;addRegionTicket(Lnet/minecraft/server/level/TicketType;Lnet/minecraft/world/level/ChunkPos;ILjava/lang/Object;)V")) + private void addSpawnChunkTicket(ServerChunkCache cache, TicketType type, ChunkPos pos, int distance, Object o) { + DistanceManager manager = ((ServerChunkCacheAccessor)cache).getDistanceManager(); + /* make one chunk load */ + manager.addTicket(TicketType.START, pos, 44, Unit.INSTANCE); + } + + @Redirect(method = "prepareLevels", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;getTickingGenerated()I"), require = 0) + private int getGenerated(ServerChunkCache cache) { + return 441; + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java new file mode 100644 index 00000000..76ed3c26 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java @@ -0,0 +1,12 @@ +package org.embeddedt.modernfix.mixin.perf.remove_spawn_chunks; + +import net.minecraft.server.level.DistanceManager; +import net.minecraft.server.level.ServerChunkCache; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerChunkCache.class) +public interface ServerChunkCacheAccessor { + @Accessor("distanceManager") + DistanceManager getDistanceManager(); +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java new file mode 100644 index 00000000..3545dbbe --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java @@ -0,0 +1,28 @@ +package org.embeddedt.modernfix.mixin.perf.remove_spawn_chunks; + +import net.minecraft.server.level.DistanceManager; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.TicketType; +import net.minecraft.util.Unit; +import net.minecraft.world.level.ChunkPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerLevel.class) +public class ServerLevelMixin { + @Redirect(method = "setDefaultSpawnPos", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;removeRegionTicket(Lnet/minecraft/server/level/TicketType;Lnet/minecraft/world/level/ChunkPos;ILjava/lang/Object;)V")) + private void removeTicket(ServerChunkCache cache, TicketType type, ChunkPos pos, int distance, Object o) { + DistanceManager manager = ((ServerChunkCacheAccessor)cache).getDistanceManager(); + /* make one chunk load */ + manager.removeTicket(TicketType.START, pos, 44, Unit.INSTANCE); + } + + @Redirect(method = "setDefaultSpawnPos", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;addRegionTicket(Lnet/minecraft/server/level/TicketType;Lnet/minecraft/world/level/ChunkPos;ILjava/lang/Object;)V")) + private void addTicket(ServerChunkCache cache, TicketType type, ChunkPos pos, int distance, Object o) { + DistanceManager manager = ((ServerChunkCacheAccessor)cache).getDistanceManager(); + /* make one chunk load */ + manager.addTicket(TicketType.START, pos, 44, Unit.INSTANCE); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index bc1b1668..bdfba0a8 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -76,7 +76,9 @@ "perf.compress_blockstate.BlockBehaviourMixin", "perf.dedup_blockstate_flattening_map.BlockStateDataMixin", "perf.dedup_blockstate_flattening_map.ChunkPalettedStorageFixMixin", - "devenv.MinecraftServerMixin", + "perf.remove_spawn_chunks.ServerChunkCacheAccessor", + "perf.remove_spawn_chunks.MinecraftServerMixin", + "perf.remove_spawn_chunks.ServerLevelMixin", "devenv.GameDataMixin" ], "client": [