Milestone!! Both fabric:runclient & fabric:runserver now works!!!!! (in 1.18.2 for now)

This commit is contained in:
TomTheFurry
2022-07-01 18:17:07 +08:00
parent 1c63dd5183
commit 932146eea8
12 changed files with 52 additions and 21 deletions
@@ -9,15 +9,18 @@ import com.seibel.lod.core.a7.render.RenderBufferHandler;
import com.seibel.lod.core.a7.save.structure.ClientOnlySaveStructure;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.objects.math.Mat4f;
import com.seibel.lod.core.render.a7LodRenderer;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import org.apache.logging.log4j.Logger;
import java.util.concurrent.CompletableFuture;
public class DhClientLevel implements IClientLevel {
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static final IMinecraftClientWrapper MC_CLIENT = SingletonHandler.get(IMinecraftClientWrapper.class);
public final ClientOnlySaveStructure save;
public final RemoteDataFileHandler dataFileHandler;
@@ -29,6 +32,8 @@ public class DhClientLevel implements IClientLevel {
public DhClientLevel(ClientOnlySaveStructure save, ILevelWrapper level) {
this.save = save;
save.getDataFolder(level).mkdirs();
save.getRenderCacheFolder(level).mkdirs();
dataFileHandler = new RemoteDataFileHandler();
renderFileHandler = new RenderFileHandler(dataFileHandler, this, save.getRenderCacheFolder(level));
tree = new LodQuadTree(Config.Client.Graphics.Quality.lodChunkRenderDistance.get()*16,
@@ -36,6 +41,7 @@ public class DhClientLevel implements IClientLevel {
renderBufferHandler = new RenderBufferHandler(tree);
this.level = level;
FileScanner.scanFile(save, level, dataFileHandler, renderFileHandler);
LOGGER.info("Started DHLevel for {} with saves at {}", level, save);
}
@Override
@@ -75,5 +81,6 @@ public class DhClientLevel implements IClientLevel {
@Override
public void close() {
renderFileHandler.close();
LOGGER.info("Closed DHLevel for {}", level);
}
}
@@ -33,7 +33,10 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
public DhClientServerLevel(LocalSaveStructure save, ILevelWrapper level) {
this.level = level;
this.save = save;
save.getDataFolder(level).mkdirs();
save.getRenderCacheFolder(level).mkdirs();
dataFileHandler = new LocalDataFileHandler(this, save.getDataFolder(level));
LOGGER.info("Started DHLevel for {} with saves at {}", level, save);
}
public void clientTick() {
@@ -105,6 +108,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
@Override
public void close() {
dataFileHandler.close();
LOGGER.info("Closed DHLevel for {}", level);
}
@Override
@@ -3,11 +3,15 @@ package com.seibel.lod.core.a7.level;
import com.seibel.lod.core.a7.util.FileScanner;
import com.seibel.lod.core.a7.save.io.file.LocalDataFileHandler;
import com.seibel.lod.core.a7.save.structure.LocalSaveStructure;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import org.apache.logging.log4j.Logger;
import java.util.concurrent.CompletableFuture;
public class DhServerLevel implements IServerLevel {
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
public final LocalSaveStructure save;
public final LocalDataFileHandler dataFileHandler;
public final ILevelWrapper level;
@@ -15,8 +19,10 @@ public class DhServerLevel implements IServerLevel {
public DhServerLevel(LocalSaveStructure save, ILevelWrapper level) {
this.save = save;
this.level = level;
save.getDataFolder(level).mkdirs();
dataFileHandler = new LocalDataFileHandler(this, save.getDataFolder(level));
FileScanner.scanFile(save, level, dataFileHandler, null);
LOGGER.info("Started DHLevel for {} with saves at {}", level, save);
}
public void serverTick() {
@@ -35,6 +41,7 @@ public class DhServerLevel implements IServerLevel {
@Override
public void close() {
dataFileHandler.close();
LOGGER.info("Closed DHLevel for {}", level);
}
@Override
public CompletableFuture<Void> save() {
@@ -11,22 +11,27 @@ import java.io.File;
public class LocalSaveStructure extends SaveStructure {
private static final IMinecraftSharedWrapper MC = SingletonHandler.get(IMinecraftSharedWrapper.class);
private File debugPath = new File("");
// Fit for Client_Server & Server_Only environment
public LocalSaveStructure() {
}
@Override
public File tryGetLevelFolder(ILevelWrapper wrapper) {
debugPath = new File(wrapper.getSaveFolder(), "Distant_Horizons");
return new File(wrapper.getSaveFolder(), "Distant_Horizons");
}
@Override
public File getRenderCacheFolder(ILevelWrapper level) {
debugPath = new File(level.getSaveFolder(), "Distant_Horizons");
return new File(new File(level.getSaveFolder(), "Distant_Horizons"), RENDER_CACHE_FOLDER);
}
@Override
public File getDataFolder(ILevelWrapper level) {
debugPath = new File(level.getSaveFolder(), "Distant_Horizons");
return new File(new File(level.getSaveFolder(), "Distant_Horizons"), DATA_FOLDER);
}
@@ -37,6 +42,6 @@ public class LocalSaveStructure extends SaveStructure {
@Override
public String toString() {
return "[LocalSave]";
return "[LocalSave at ["+debugPath+"] ]";
}
}
@@ -28,7 +28,7 @@ public class FileScanner {
).map(Path::toFile).collect(Collectors.toList())
);
} catch (Exception e) {
LOGGER.error("Failed to scan and collect data files for {} in {}", level, save);
LOGGER.error("Failed to scan and collect data files for {} in {}", level, save, e);
}
}
if (renderSource != null) {
@@ -38,7 +38,7 @@ public class FileScanner {
).map(Path::toFile).collect(Collectors.toList())
);
} catch (Exception e) {
LOGGER.error("Failed to scan and collect data files for {} in {}", level, save);
LOGGER.error("Failed to scan and collect data files for {} in {}", level, save, e);
}
}
}
@@ -23,6 +23,7 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe
super(WorldEnvironment.Client_Server);
saveStructure = new LocalSaveStructure();
levels = new HashMap<>();
LOGGER.info("Started DhWorld of type {}", environment);
}
@Override
@@ -86,6 +87,7 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe
level.close();
}
levels.clear();
LOGGER.info("Closed DhWorld of type {}", environment);
}
public void enableRendering(ILevelWrapper wrapper) {
@@ -25,6 +25,7 @@ public class DhClientWorld extends DhWorld implements IClientWorld {
super(WorldEnvironment.Client_Only);
saveStructure = new ClientOnlySaveStructure();
levels = new HashMap<>();
LOGGER.info("Started DhWorld of type {}", environment);
}
@Override
@@ -81,5 +82,6 @@ public class DhClientWorld extends DhWorld implements IClientWorld {
level.close();
}
levels.clear();
LOGGER.info("Closed DhWorld of type {}", environment);
}
}
@@ -17,6 +17,7 @@ public class DhServerWorld extends DhWorld implements IServerWorld {
super(WorldEnvironment.Server_Only);
saveStructure = new LocalSaveStructure();
levels = new HashMap<>();
LOGGER.info("Started DhWorld of type {}", environment);
}
@Override
@@ -63,6 +64,7 @@ public class DhServerWorld extends DhWorld implements IServerWorld {
level.close();
}
levels.clear();
LOGGER.info("Closed DhWorld of type {}", environment);
}
@@ -8,6 +8,7 @@ import com.seibel.lod.core.config.types.AbstractConfigType;
import com.seibel.lod.core.config.types.ConfigEntry;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
@@ -23,7 +24,7 @@ import java.nio.file.Path;
* @version 2022-5-26
*/
public class ConfigFileHandling {
public static final Path ConfigPath = SingletonHandler.get(IMinecraftClientWrapper.class).getGameDirectory().toPath().resolve("config").resolve(ModInfo.NAME+".toml");
public static final Path ConfigPath = SingletonHandler.get(IMinecraftSharedWrapper.class).getInstallationDirectory().toPath().resolve("config").resolve(ModInfo.NAME+".toml");
/** Saves the config to the file */
public static void saveToFile() {
@@ -70,7 +70,10 @@ public class SingletonHandler
return foundObject;
}
public static <T> T getOrNull(Class<T> interfaceClass) throws ClassCastException
{
return dependencyHandler.get(interfaceClass);
}
/**
* Should only be called after all Binds have been done.
@@ -41,8 +41,6 @@ public class ColorUtil
public static final int RED = rgbToInt(255,0,0);
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
public static int rgbToInt(int red, int green, int blue)
{
return (0xFF << 24) | (red << 16) | (green << 8) | blue;
@@ -41,8 +41,11 @@ import com.seibel.lod.core.wrapperInterfaces.IVersionConstants;
import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IDimensionTypeWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
/**
* This class holds methods and constants that may be used in multiple places.
@@ -52,11 +55,8 @@ import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
*/
public class LodUtil
{
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
private static final IMinecraftRenderWrapper MC_RENDER = SingletonHandler.get(IMinecraftRenderWrapper.class);
private static final IWrapperFactory FACTORY = SingletonHandler.get(IWrapperFactory.class);
private static final IReflectionHandler REFLECTION_HANDLER = SingletonHandler.get(IReflectionHandler.class);
private static final IVersionConstants VERSION_CONSTANTS = SingletonHandler.get(IVersionConstants.class);
private static final IMinecraftClientWrapper MC_CLIENT = SingletonHandler.getOrNull(IMinecraftClientWrapper.class);
private static final IMinecraftRenderWrapper MC_RENDER = SingletonHandler.getOrNull(IMinecraftRenderWrapper.class);
/**
* Vanilla render distances less than or equal to this will not allow partial
@@ -167,10 +167,10 @@ public class LodUtil
*/
public static ILevelWrapper getServerWorldFromDimension(IDimensionTypeWrapper newDimension)
{
if(!MC.hasSinglePlayerServer())
if(!MC_CLIENT.hasSinglePlayerServer())
return null;
Iterable<ILevelWrapper> worlds = MC.getAllServerWorlds();
Iterable<ILevelWrapper> worlds = MC_CLIENT.getAllServerWorlds();
ILevelWrapper returnWorld = null;
for (ILevelWrapper world : worlds)
@@ -202,7 +202,7 @@ public class LodUtil
*/
public static String getWorldID(ILevelWrapper world)
{
if (MC.hasSinglePlayerServer())
if (MC_CLIENT.hasSinglePlayerServer())
{
// chop off the dimension ID as it is not needed/wanted
String dimId = getDimensionIDFromWorld(world);
@@ -231,7 +231,7 @@ public class LodUtil
@Deprecated // FIXME: There are soooo many duplicated methods doing the same thing everywhere
public static String getDimensionIDFromWorld(ILevelWrapper world)
{
if (MC.hasSinglePlayerServer())
if (MC_CLIENT.hasSinglePlayerServer())
{
// this will return the world save location
// and the dimension folder
@@ -254,7 +254,7 @@ public class LodUtil
public static String getServerFolderName()
{
// parse the current server's IP
ParsedIp parsedIp = new ParsedIp(MC.getCurrentServerIp());
ParsedIp parsedIp = new ParsedIp(MC_CLIENT.getCurrentServerIp());
String serverIpCleaned = parsedIp.ip.replaceAll(INVALID_FILE_CHARACTERS_REGEX, "");
String serverPortCleaned = parsedIp.port != null ? parsedIp.port.replaceAll(INVALID_FILE_CHARACTERS_REGEX, "") : "";
@@ -276,8 +276,8 @@ public class LodUtil
}
String serverName = MC.getCurrentServerName().replaceAll(INVALID_FILE_CHARACTERS_REGEX, "");
String serverMcVersion = MC.getCurrentServerVersion().replaceAll(INVALID_FILE_CHARACTERS_REGEX, "");
String serverName = MC_CLIENT.getCurrentServerName().replaceAll(INVALID_FILE_CHARACTERS_REGEX, "");
String serverMcVersion = MC_CLIENT.getCurrentServerVersion().replaceAll(INVALID_FILE_CHARACTERS_REGEX, "");
// generate the folder name
String folderName = "";
@@ -387,8 +387,8 @@ public class LodUtil
return new Pos2D(pos.getX(), pos.getZ());
}
},
MC.getPlayerChunkPos().getX() - renderDist,
MC.getPlayerChunkPos().getZ() - renderDist,
MC_CLIENT.getPlayerChunkPos().getX() - renderDist,
MC_CLIENT.getPlayerChunkPos().getZ() - renderDist,
renderDist * 2 + 1);
}