Merge branch 'main' of gitlab.com:distant-horizons-team/distant-horizons

This commit is contained in:
James Seibel
2025-11-13 07:21:10 -06:00
parent 34412305d0
commit 2545c7e76d
11 changed files with 135 additions and 17 deletions
@@ -115,8 +115,8 @@ public abstract class AbstractModInitializer
this.initializeModCompat();
LOGGER.info(ModInfo.READABLE_NAME + " server Initialized, adding event subscribers...");
this.subscribeRegisterCommandsEvent(dispatcher -> { this.commandInitializer = new CommandInitializer(dispatcher); });
this.commandInitializer = new CommandInitializer();
this.subscribeRegisterCommandsEvent(dispatcher -> { commandInitializer.initCommands(dispatcher); });
this.subscribeServerStartingEvent(server ->
{
@@ -124,7 +124,7 @@ public abstract class AbstractModInitializer
this.initConfig();
this.postInit();
this.commandInitializer.initCommands();
this.commandInitializer.onServerReady();
this.checkForUpdates();
@@ -3,6 +3,7 @@ package com.seibel.distanthorizons.common.commands;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import net.minecraft.commands.CommandSourceStack;
import org.jetbrains.annotations.Nullable;
import static com.seibel.distanthorizons.core.network.messages.MessageRegistry.DEBUG_CODEC_CRASH_MESSAGE;
import static net.minecraft.commands.Commands.literal;
@@ -12,25 +13,42 @@ import static net.minecraft.commands.Commands.literal;
*/
public class CommandInitializer
{
private final CommandDispatcher<CommandSourceStack> commandDispatcher;
private boolean serverReady = false;
/**
* Constructs a new instance of this class.
*
* @param commandDispatcher The dispatcher to use for registering commands.
* A received command dispatcher, which is held until the server is ready to initialize the commands.
*/
public CommandInitializer(CommandDispatcher<CommandSourceStack> commandDispatcher)
@Nullable
private CommandDispatcher<CommandSourceStack> commandDispatcher;
/**
* Notify the command initializer that the game is ready to accept commands.
* If {@link CommandInitializer#initCommands(CommandDispatcher)} has been fired before it was ready, it will also initialize the commands.
*/
public void onServerReady()
{
this.commandDispatcher = commandDispatcher;
this.serverReady = true;
if (this.commandDispatcher != null)
{
this.initCommands(this.commandDispatcher);
this.commandDispatcher = null;
}
}
/**
* Initializes all available commands.
* If the game is not ready yet, it stores the dispatcher to initialize the commands later.
*
* @param commandDispatcher The command dispatcher to register commands to.
*/
public void initCommands()
public void initCommands(CommandDispatcher<CommandSourceStack> commandDispatcher)
{
if (!this.serverReady)
{
this.commandDispatcher = commandDispatcher;
return;
}
LiteralArgumentBuilder<CommandSourceStack> builder = literal("dh")
.requires(source -> source.hasPermission(4));
@@ -43,7 +61,7 @@ public class CommandInitializer
builder.then(new CrashCommand().buildCommand());
}
this.commandDispatcher.register(builder);
commandDispatcher.register(builder);
}
}
@@ -396,4 +396,10 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
}
}
@Override
public void setPreventAutoPause(boolean preventAutoPause)
{
throw new UnsupportedOperationException();
}
}
@@ -11,6 +11,7 @@ public class MinecraftServerWrapper implements IMinecraftSharedWrapper
public static final MinecraftServerWrapper INSTANCE = new MinecraftServerWrapper();
public DedicatedServer dedicatedServer = null;
public boolean preventAutoPause = false;
//=============//
@@ -49,4 +50,10 @@ public class MinecraftServerWrapper implements IMinecraftSharedWrapper
return this.dedicatedServer.getPlayerCount();
}
@Override
public void setPreventAutoPause(boolean preventAutoPause)
{
this.preventAutoPause = preventAutoPause;
}
}
@@ -0,0 +1,28 @@
package com.seibel.distanthorizons.fabric.mixins.server;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import net.minecraft.server.MinecraftServer;
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.callback.CallbackInfo;
import java.util.function.BooleanSupplier;
@Mixin(MinecraftServer.class)
public class MixinMinecraftServer
{
@Shadow
private int emptyTicks;
@Inject(method = "tickServer", at = @At("HEAD"))
private void onTickServer(BooleanSupplier hasTimeLeft, CallbackInfo ci)
{
if (MinecraftServerWrapper.INSTANCE.preventAutoPause)
{
this.emptyTicks = 0;
}
}
}
@@ -9,7 +9,8 @@
"server.MixinServerPlayer",
"server.MixinTracingExecutor",
"server.MixinUtilBackgroundThread",
"server.MixinLevelTicks"
"server.MixinLevelTicks",
"server.MixinMinecraftServer"
],
"client": [
"client.MixinClientLevel",
@@ -0,0 +1,28 @@
package com.seibel.distanthorizons.fabric.mixins.server;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import net.minecraft.server.MinecraftServer;
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.callback.CallbackInfo;
import java.util.function.BooleanSupplier;
@Mixin(MinecraftServer.class)
public class MixinMinecraftServer
{
@Shadow
private int emptyTicks;
@Inject(method = "tickServer", at = @At("HEAD"))
private void onTickServer(BooleanSupplier hasTimeLeft, CallbackInfo ci)
{
if (MinecraftServerWrapper.INSTANCE.preventAutoPause)
{
this.emptyTicks = 0;
}
}
}
@@ -8,7 +8,8 @@
"server.MixinTFChunkGenerator",
"server.MixinChunkMap",
"server.MixinServerPlayer",
"server.MixinEntity"
"server.MixinEntity",
"server.MixinMinecraftServer"
],
"client": [
"client.MixinClientPacketListener",
@@ -0,0 +1,28 @@
package com.seibel.distanthorizons.neoforge.mixins.server;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftServerWrapper;
import net.minecraft.server.MinecraftServer;
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.callback.CallbackInfo;
import java.util.function.BooleanSupplier;
@Mixin(MinecraftServer.class)
public class MixinMinecraftServer
{
@Shadow
private int emptyTicks;
@Inject(method = "tickServer", at = @At("HEAD"))
private void onTickServer(BooleanSupplier hasTimeLeft, CallbackInfo ci)
{
if (MinecraftServerWrapper.INSTANCE.preventAutoPause)
{
this.emptyTicks = 0;
}
}
}
@@ -9,7 +9,8 @@
"server.MixinTFChunkGenerator",
"server.MixinTracingExecutor",
"server.MixinUtilBackgroundThread",
"server.MixinLevelTicks"
"server.MixinLevelTicks",
"server.MixinMinecraftServer"
],
"client": [
"client.MixinClientPacketListener",