Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies {
}

// check for the latest versions at https://jitpack.io/#Minecraft-Java-Edition-Speedrunning/sodium
modCompileOnly "com.github.Minecraft-Java-Edition-Speedrunning:sodium:d488d3a782"
modCompileOnly "com.github.Minecraft-Java-Edition-Speedrunning:sodium:0dd4b2d65a"

// check for the latest versions at https://jitpack.io/#kingcontaria/fastreset
modCompileOnly ("com.github.KingContaria:fastreset:82fe8eb3b2") {
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ yarn_mappings=1.16.1-build.24
loader_version=0.16.5

# Mod Properties
mod_version=1.4
mod_version=1.4.1
maven_group=me.contaria
archives_base_name=seedqueue

Expand Down
9 changes: 9 additions & 0 deletions src/main/java/me/contaria/seedqueue/SeedQueue.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.contaria.seedqueue;

import com.google.gson.JsonParseException;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import me.contaria.seedqueue.compat.ModCompat;
import me.contaria.seedqueue.debug.SeedQueueSystemInfo;
import me.contaria.seedqueue.debug.SeedQueueWatchdog;
Expand All @@ -20,6 +21,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
Expand All @@ -43,6 +45,13 @@ public class SeedQueue implements ClientModInitializer {
public static SeedQueueEntry currentEntry;
public static SeedQueueEntry selectedEntry;

public static boolean cancelDirectoryCreate(File instance, Operation<Boolean> original) {
if (config.delayFileCreation && inQueue()) {
return true;
}
return original.call(instance);
}

@Override
public void onInitializeClient() {
SeedQueueSounds.init();
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/me/contaria/seedqueue/SeedQueueConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ public class SeedQueueConfig implements SpeedrunConfig {
@Config.Category("performance")
public boolean reduceLevelList = true;

@Config.Category("performance")
public boolean delayFileCreation = true;

@Config.Category("misc")
@Config.Numbers.Whole.Bounds(min = -1, max = 500, enforce = Config.Numbers.EnforceBounds.MIN_ONLY)
public long chunkMapFreezing = -1;
Expand Down
15 changes: 14 additions & 1 deletion src/main/java/me/contaria/seedqueue/SeedQueueEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import me.contaria.seedqueue.compat.WorldPreviewFrameBuffer;
import me.contaria.seedqueue.compat.WorldPreviewProperties;
import me.contaria.seedqueue.debug.SeedQueueProfiler;
import me.contaria.seedqueue.interfaces.SQLevelStorageSession;
import me.contaria.seedqueue.interfaces.SQMinecraftServer;
import me.contaria.seedqueue.interfaces.SQWorldGenerationProgressTracker;
import me.contaria.seedqueue.mixin.accessor.MinecraftServerAccessor;
Expand All @@ -18,6 +19,9 @@
import net.minecraft.world.level.storage.LevelStorage;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.util.List;

/**
* Stores the {@link MinecraftServer} and any other resources related to a seed in the queue.
*/
Expand Down Expand Up @@ -46,6 +50,7 @@ public class SeedQueueEntry {

@Nullable
private SeedQueueSettingsCache settingsCache;

private int perspective;

private volatile boolean locked;
Expand All @@ -59,7 +64,7 @@ public class SeedQueueEntry {
*/
public int mainPosition = -1;

public SeedQueueEntry(MinecraftServer server, LevelStorage.Session session, MinecraftClient.IntegratedResourceManager resourceManager, @Nullable YggdrasilAuthenticationService yggdrasilAuthenticationService, @Nullable MinecraftSessionService minecraftSessionService, @Nullable GameProfileRepository gameProfileRepository, @Nullable UserCache userCache) {
public SeedQueueEntry(MinecraftServer server, LevelStorage.Session session, MinecraftClient.IntegratedResourceManager resourceManager, @Nullable YggdrasilAuthenticationService yggdrasilAuthenticationService, @Nullable MinecraftSessionService minecraftSessionService, @Nullable GameProfileRepository gameProfileRepository, @Nullable UserCache userCache, @Nullable WorldGenerationProgressTracker worldGenerationProgressTracker) {
this.server = server;
this.session = session;
this.resourceManager = resourceManager;
Expand Down Expand Up @@ -350,6 +355,13 @@ public synchronized void load() {
if (this.discarded) {
throw new IllegalStateException("Tried to load \"" + this.session.getDirectoryName() + "\" but it has already been discarded!");
}
try {
((SQLevelStorageSession) this.session).seedQueue$createLock();
} catch (Exception e) {
SeedQueue.LOGGER.error("Failed to create session lock for \"{}\"!", this.session.getDirectoryName(), e);
return;
}


this.loaded = true;

Expand Down Expand Up @@ -407,4 +419,5 @@ public int getProgressPercentage() {
}
return ((SQWorldGenerationProgressTracker) this.worldGenerationProgressTracker).seedQueue$getProgressPercentage();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package me.contaria.seedqueue.interfaces;

import java.io.IOException;

public interface SQLevelStorageSession {
void seedQueue$createLock() throws IOException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,13 @@
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 org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.*;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.io.File;
import java.net.Proxy;
import java.util.ArrayList;
import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicReference;
Expand Down Expand Up @@ -232,7 +230,7 @@ private MinecraftServer loadServer(Function<Thread, MinecraftServer> serverFacto
private void queueServer(MinecraftClient client, IntegratedServer server, Operation<Void> original, @Local LevelStorage.Session session, @Local MinecraftClient.IntegratedResourceManager resourceManager, @Local YggdrasilAuthenticationService yggdrasilAuthenticationService, @Local MinecraftSessionService minecraftSessionService, @Local GameProfileRepository gameProfileRepository, @Local UserCache userCache) {
if (SeedQueue.inQueue()) {
((SQMinecraftServer) server).seedQueue$setExecutor(SeedQueueExecutorWrapper.SEEDQUEUE_EXECUTOR);
SeedQueue.add(new SeedQueueEntry(server, session, resourceManager, yggdrasilAuthenticationService, minecraftSessionService, gameProfileRepository, userCache));
SeedQueue.add(new SeedQueueEntry(server, session, resourceManager, yggdrasilAuthenticationService, minecraftSessionService, gameProfileRepository, userCache,null));
return;
}
original.call(client, server);
Expand Down Expand Up @@ -371,7 +369,7 @@ private boolean cancelWorldGenTrackerSetNull(AtomicReference<?> instance, Object
)
)
private boolean cancelSessionLevelDatInit(LevelStorage.Session instance, RegistryTracker registryTracker, SaveProperties saveProperties) {
return SeedQueue.inQueue() || SeedQueue.currentEntry == null;
return !SeedQueue.config.delayFileCreation;
}

@WrapWithCondition(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,19 +241,6 @@ private void profileReset2(CallbackInfo ci) {
SeedQueueProfiler.push("reset");
}

@Inject(
method = "update",
at = @At(
value = "INVOKE",
target = "Lme/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager;unloadPending()V",
remap = false
),
remap = true
)
private void profileUnloadPending(CallbackInfo ci) {
SeedQueueProfiler.swap("unload_pending");
}

@Inject(
method = "update",
at = @At(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.contaria.seedqueue.mixin.server;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import me.contaria.seedqueue.SeedQueue;
Expand All @@ -23,8 +24,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.io.File;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
Expand Down Expand Up @@ -268,4 +271,5 @@ private void pauseServer(MinecraftServer server, boolean value, Operation<Void>
public int seedQueue$incrementAndGetEntityID() {
return this.maxEntityId.incrementAndGet();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.contaria.seedqueue.mixin.server.optimization;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import me.contaria.seedqueue.SeedQueue;
import net.minecraft.resource.FileResourcePackProvider;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import java.io.File;

@Mixin(FileResourcePackProvider.class)
public class FileResourcePackProviderMixin {

@WrapOperation(
method = "register",
at = @At(
value = "INVOKE",
target = "Ljava/io/File;mkdirs()Z"
)
)
private boolean delayDirectoryCreate(File instance, Operation<Boolean> original) {
return SeedQueue.cancelDirectoryCreate(instance, original);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package me.contaria.seedqueue.mixin.server.optimization;

import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import me.contaria.seedqueue.SeedQueue;
import me.contaria.seedqueue.interfaces.SQLevelStorageSession;
import me.contaria.seedqueue.interfaces.SQMinecraftServer;
import net.minecraft.world.level.storage.LevelStorage;
import net.minecraft.world.level.storage.SessionLock;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.io.IOException;
import java.nio.file.Path;

@Mixin(LevelStorage.Session.class)
public class LevelStorageSessionMixin implements SQLevelStorageSession {
@Shadow @Mutable
private SessionLock lock;

@Shadow @Final private Path directory;

@WrapOperation(
method = "<init>",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/level/storage/SessionLock;create(Ljava/nio/file/Path;)Lnet/minecraft/world/level/storage/SessionLock;"
)
)
private SessionLock skipSessionLockCreation(Path path, Operation<SessionLock> original) throws IOException {
return SeedQueue.inQueue()? null : original.call(path);
}

public void seedQueue$createLock() throws IOException {
this.lock = SessionLock.create(this.directory);
}

@Inject(method = "checkValid", at = @At("HEAD"),cancellable = true)
private void dontRequireLockWhileInQueue(CallbackInfo ci) {
if (SeedQueue.inQueue() || SeedQueue.getThreadLocalEntry().isPresent()) {
ci.cancel();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package me.contaria.seedqueue.mixin.server.optimization;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import me.contaria.seedqueue.SeedQueue;
import me.contaria.seedqueue.interfaces.SQMinecraftServer;
import net.minecraft.server.world.ServerChunkManager;
import net.minecraft.server.world.ServerWorld;
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.io.File;

@Mixin(ServerChunkManager.class)
public class ServerChunkManagerMixin {

@Shadow @Final private ServerWorld world;

@WrapOperation(
method = "<init>",
at = @At(
value = "INVOKE",
target = "Ljava/io/File;mkdirs()Z"
)
)
private boolean delayDirectoryCreate(File instance, Operation<Boolean> original) {
SQMinecraftServer server = (SQMinecraftServer) this.world.getServer();
if(server.seedQueue$inQueue()){
return true;
} else {
return original.call(instance);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@
import net.minecraft.server.world.ServerWorld;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.poi.PointOfInterestStorage;
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.function.BooleanSupplier;

@Mixin(ThreadedAnvilChunkStorage.class)
public abstract class ThreadedAnvilChunkStorageMixin {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package me.contaria.seedqueue.mixin.server.optimization;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import me.contaria.seedqueue.SeedQueue;
import net.minecraft.world.WorldSaveHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import java.io.File;

@Mixin(WorldSaveHandler.class)
public class WorldSaveHandlerMixin {

@WrapOperation(
method = "<init>",
at = @At(
value = "INVOKE",
target = "Ljava/io/File;mkdirs()Z"
)
)
private boolean delayDirectoryCreate(File instance, Operation<Boolean> original) {
return SeedQueue.cancelDirectoryCreate(instance, original);
}

}
2 changes: 2 additions & 0 deletions src/main/resources/assets/seedqueue/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@
"speedrunapi.config.seedqueue.option.reduceSchedulingBudget.description": "Reduces the amount of Sodium chunk rebuilds scheduled per frame. This improves framerate stability at the cost of slower chunk loads.",
"speedrunapi.config.seedqueue.option.reduceLevelList": "Reduce World List",
"speedrunapi.config.seedqueue.option.reduceLevelList.description": "Hides worlds that have been reset on the Wall Screen or during preview from the world list to avoid lag.",
"speedrunapi.config.seedqueue.option.delayFileCreation": "Delay File Creation",
"speedrunapi.config.seedqueue.option.delayFileCreation.description": "Delays the creation of world files until world enter.\n Provides significant performance increase for slow storage devices.",
"speedrunapi.config.seedqueue.option.useWatchdog": "Watchdog",
"speedrunapi.config.seedqueue.option.useWatchdog.description": "Launches an extra thread that prints out the main threads stacktrace every 10 seconds to diagnose freezing issues.",
"speedrunapi.config.seedqueue.option.showDebugMenu": "Show Debug Menu",
Expand Down
8 changes: 7 additions & 1 deletion src/main/resources/seedqueue.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,11 @@
"server.synchronization.ScheduledTickMixin",
"server.synchronization.WeightedBlockStateProviderMixin"
],
"plugin": "me.contaria.seedqueue.SeedQueueMixinConfigPlugin"
"plugin": "me.contaria.seedqueue.SeedQueueMixinConfigPlugin",
"mixins": [
"server.optimization.FileResourcePackProviderMixin",
"server.optimization.LevelStorageSessionMixin",
"server.optimization.ServerChunkManagerMixin",
"server.optimization.WorldSaveHandlerMixin"
]
}