Fixup some init order errors and work on able to enter world.
This commit is contained in:
@@ -21,6 +21,7 @@ package com.seibel.lod.common.wrappers;
|
||||
|
||||
import com.seibel.lod.common.LodCommonMain;
|
||||
import com.seibel.lod.common.wrappers.config.ConfigWrapper;
|
||||
import com.seibel.lod.core.api.internal.a7.SharedApi;
|
||||
import com.seibel.lod.core.wrapperInterfaces.config.IConfigWrapper;
|
||||
import com.seibel.lod.common.wrappers.minecraft.MinecraftClientWrapper;
|
||||
import com.seibel.lod.common.wrappers.minecraft.MinecraftRenderWrapper;
|
||||
@@ -47,11 +48,11 @@ public class DependencySetup {
|
||||
{
|
||||
SingletonHandler.bind(IConfigWrapper.class, ConfigWrapper.INSTANCE);
|
||||
SingletonHandler.bind(IVersionConstants.class, VersionConstants.INSTANCE);
|
||||
if (!LodCommonMain.serverSided)
|
||||
if (!SharedApi.inDedicatedEnvironment)
|
||||
{
|
||||
SingletonHandler.bind(IMinecraftClientWrapper.class, MinecraftClientWrapper.INSTANCE);
|
||||
SingletonHandler.bind(IMinecraftRenderWrapper.class, MinecraftRenderWrapper.INSTANCE);
|
||||
SingletonHandler.bind(IReflectionHandler.class, ReflectionHandler.createSingleton(MinecraftClientWrapper.INSTANCE.getOptions().getClass().getDeclaredFields(), MinecraftClientWrapper.INSTANCE.getOptions()));
|
||||
SingletonHandler.bind(IReflectionHandler.class, ReflectionHandler.createSingleton());
|
||||
}
|
||||
|
||||
SingletonHandler.bind(IWrapperFactory.class, WrapperFactory.INSTANCE);
|
||||
|
||||
+11
-5
@@ -197,11 +197,6 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper
|
||||
return new DHChunkPos(playerPos.x, playerPos.z);
|
||||
}
|
||||
|
||||
public Options getOptions()
|
||||
{
|
||||
return mc.options;
|
||||
}
|
||||
|
||||
public ModelManager getModelManager()
|
||||
{
|
||||
return mc.getModelManager();
|
||||
@@ -384,6 +379,17 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper
|
||||
Minecraft.crash(report);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getOptionsObject()
|
||||
{
|
||||
return mc.options;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getSinglePlayerServerFolder() {
|
||||
return mc.getSingleplayerServer().getServerDirectory();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.mojang.blaze3d.platform.InputConstants;
|
||||
import com.seibel.lod.common.wrappers.chunk.ChunkWrapper;
|
||||
import com.seibel.lod.common.wrappers.world.WorldWrapper;
|
||||
|
||||
import com.seibel.lod.core.logging.DhLoggerBuilder;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
|
||||
@@ -37,6 +38,7 @@ import net.minecraft.world.level.Level;
|
||||
import java.util.HashSet;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
/**
|
||||
@@ -50,6 +52,7 @@ import org.lwjgl.glfw.GLFW;
|
||||
public class FabricClientProxy
|
||||
{
|
||||
private final ClientApi clientApi = ClientApi.INSTANCE;
|
||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger("FabricClientProxy");
|
||||
|
||||
public static Supplier<Boolean> isGenerationThreadChecker = null;
|
||||
|
||||
@@ -58,6 +61,8 @@ public class FabricClientProxy
|
||||
* @author Ran
|
||||
*/
|
||||
public void registerEvents() {
|
||||
LOGGER.info("Registering Fabric Client Events");
|
||||
|
||||
isGenerationThreadChecker = BatchGenerationEnvironment::isCurrentThreadDistantGeneratorThread;
|
||||
|
||||
/* Register the mod needed event callbacks */
|
||||
|
||||
@@ -4,6 +4,8 @@ import com.seibel.lod.common.networking.Networking;
|
||||
import com.seibel.lod.common.wrappers.chunk.ChunkWrapper;
|
||||
import com.seibel.lod.common.wrappers.world.WorldWrapper;
|
||||
import com.seibel.lod.core.api.internal.a7.ServerApi;
|
||||
import com.seibel.lod.core.logging.DhLoggerBuilder;
|
||||
import com.seibel.lod.core.objects.a7.Server;
|
||||
import com.seibel.lod.core.wrapperInterfaces.world.IWorldWrapper;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
|
||||
@@ -17,6 +19,7 @@ import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.Level;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
/**
|
||||
* This handles all events sent to the server,
|
||||
@@ -29,6 +32,7 @@ import net.minecraft.world.level.Level;
|
||||
// TODO
|
||||
public class FabricServerProxy {
|
||||
private final ServerApi serverApi = ServerApi.INSTANCE;
|
||||
private static final Logger LOGGER = DhLoggerBuilder.getLogger("FabricServerProxy");
|
||||
|
||||
private boolean isValidTime() {
|
||||
//FIXME: return true immediately if this is a dedicated server
|
||||
@@ -42,6 +46,7 @@ public class FabricServerProxy {
|
||||
* @author Ran, Tom
|
||||
*/
|
||||
public void registerEvents() {
|
||||
LOGGER.info("Registering Fabric Server Events");
|
||||
|
||||
/* Register the mod needed event callbacks */
|
||||
|
||||
@@ -53,11 +58,11 @@ public class FabricServerProxy {
|
||||
|
||||
// ServerWorldLoadEvent
|
||||
//TODO: Check if both of this use the correct timed events. (i.e. is it 'ed' or 'ing' one?)
|
||||
ServerLifecycleEvents.SERVER_STARTED.register((server) -> {
|
||||
ServerLifecycleEvents.SERVER_STARTING.register((server) -> {
|
||||
if (isValidTime()) ServerApi.INSTANCE.serverWorldLoadEvent();
|
||||
});
|
||||
// ServerWorldUnloadEvent
|
||||
ServerLifecycleEvents.SERVER_STOPPING.register((server) -> {
|
||||
ServerLifecycleEvents.SERVER_STOPPED.register((server) -> {
|
||||
if (isValidTime()) ServerApi.INSTANCE.serverWorldUnloadEvent();
|
||||
});
|
||||
|
||||
|
||||
@@ -67,17 +67,28 @@ public class Main implements ClientModInitializer, DedicatedServerModInitializer
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
SharedApi.inDedicatedEnvironment = false;
|
||||
ClientLifecycleEvents.CLIENT_STARTED.register(Main::init);
|
||||
init();
|
||||
ClientLifecycleEvents.CLIENT_STARTED.register(Main::postInit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeServer() {
|
||||
SharedApi.inDedicatedEnvironment = true;
|
||||
init(null); // TODO: Check if init in here is ok
|
||||
init();
|
||||
postInit(null); // TODO: Check if init in here is ok
|
||||
}
|
||||
|
||||
public static void postInit(Minecraft minecraft) {
|
||||
LOGGER.info("Post-Initializing Mod");
|
||||
FabricDependencySetup.runDelayedSetup();
|
||||
LOGGER.info("Mod Post-Initialized");
|
||||
}
|
||||
|
||||
|
||||
|
||||
// This loads the mod after minecraft loads which doesn't causes a lot of issues
|
||||
public static void init(Minecraft minecraft) {
|
||||
public static void init() {
|
||||
LOGGER.info("Initializing Mod");
|
||||
LodCommonMain.startup(null);
|
||||
FabricDependencySetup.createInitialBindings();
|
||||
FabricDependencySetup.finishBinding();
|
||||
@@ -100,5 +111,6 @@ public class Main implements ClientModInitializer, DedicatedServerModInitializer
|
||||
ModAccessorHandler.bind(IOptifineAccessor.class, new OptifineAccessor());
|
||||
}
|
||||
ModAccessorHandler.finishBinding();
|
||||
LOGGER.info("Mod Initialized");
|
||||
}
|
||||
}
|
||||
|
||||
+6
-9
@@ -8,6 +8,7 @@ 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;
|
||||
|
||||
@Mixin(ClientPacketListener.class)
|
||||
public class MixinClientPacketListener {
|
||||
@@ -21,30 +22,26 @@ public class MixinClientPacketListener {
|
||||
* Also anyone can send another GameJoinPacket at any time, so we need to watch out.
|
||||
*/
|
||||
@Inject(method = "handleLogin", at = @At("HEAD"))
|
||||
void onHandleLoginStart() {
|
||||
void onHandleLoginStart(CallbackInfo ci) {
|
||||
if (level != null) ClientApi.INSTANCE.clientLevelUnloadEvent(WorldWrapper.getWorldWrapper(level));
|
||||
}
|
||||
|
||||
@Inject(method = "handleLogin", at = @At("RETURN"))
|
||||
void onHandleLoginEnd() {
|
||||
void onHandleLoginEnd(CallbackInfo ci) {
|
||||
ClientApi.INSTANCE.clientLevelLoadEvent(WorldWrapper.getWorldWrapper(level));
|
||||
}
|
||||
|
||||
@Inject(method = "handleRespawn", at = @At("HEAD"))
|
||||
void onHandleRespawnStart() {
|
||||
void onHandleRespawnStart(CallbackInfo ci) {
|
||||
ClientApi.INSTANCE.clientLevelUnloadEvent(WorldWrapper.getWorldWrapper(level));
|
||||
}
|
||||
@Inject(method = "handleRespawn", at = @At("RETURN"))
|
||||
void onHandleRespawnEnd() {
|
||||
void onHandleRespawnEnd(CallbackInfo ci) {
|
||||
ClientApi.INSTANCE.clientLevelLoadEvent(WorldWrapper.getWorldWrapper(level));
|
||||
}
|
||||
|
||||
@Inject(method = "cleanup", at = @At("HEAD"))
|
||||
void onCleanupStart() {
|
||||
void onCleanupStart(CallbackInfo ci) {
|
||||
if (level != null) ClientApi.INSTANCE.clientLevelUnloadEvent(WorldWrapper.getWorldWrapper(level));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -7,22 +7,33 @@ import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.server.level.ChunkMap;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(ChunkMap.class)
|
||||
public class MixinChunkMap {
|
||||
static final String CHUNK_SERIALIZER_WRITE
|
||||
|
||||
@Unique
|
||||
private static final String CHUNK_SERIALIZER_WRITE
|
||||
= "Lnet/minecraft/world/level/chunk/storage/ChunkSerializer;write(" +
|
||||
"Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;)" +
|
||||
"Lnet/minecraft/nbt/CompoundTag;";
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
ServerLevel level;
|
||||
|
||||
@Inject(method = "save", at = @At(value = "INVOKE", target = CHUNK_SERIALIZER_WRITE))
|
||||
private void onChunkSave(ServerLevel serverLevel, ChunkAccess chunkAccess, CompoundTag compoundTag) {
|
||||
private void onChunkSave(ChunkAccess chunk, CallbackInfoReturnable<Boolean> ci) {
|
||||
ServerApi.INSTANCE.serverChunkSaveEvent(
|
||||
new ChunkWrapper(chunkAccess, serverLevel),
|
||||
WorldWrapper.getWorldWrapper(serverLevel)
|
||||
new ChunkWrapper(chunk, level),
|
||||
WorldWrapper.getWorldWrapper(level)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,4 +47,8 @@ public class FabricDependencySetup
|
||||
public static void finishBinding() {
|
||||
SingletonHandler.finishBinding();
|
||||
}
|
||||
|
||||
public static void runDelayedSetup() {
|
||||
SingletonHandler.runDelayedSetup();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user