From 4a38b15ece673c8a8f5c8f7fe8fc9e941fff8797 Mon Sep 17 00:00:00 2001 From: coolGi2007 Date: Fri, 22 Apr 2022 11:12:10 +1000 Subject: [PATCH] Testing for adding proper quilt support --- Readme.md | 3 + build.gradle | 15 +- quilt/build.gradle | 131 +++++ .../com/seibel/lod/quilt/ClientProxy.java | 201 ++++++++ .../main/java/com/seibel/lod/quilt/Main.java | 96 ++++ .../lod/quilt/mixins/MixinChunkGenerator.java | 55 +++ .../quilt/mixins/MixinDedicatedServer.java | 35 ++ .../lod/quilt/mixins/MixinFogRenderer.java | 76 +++ .../lod/quilt/mixins/MixinMinecraft.java | 40 ++ .../lod/quilt/mixins/MixinOptionsScreen.java | 72 +++ .../mixins/MixinUtilBackgroudThread.java | 73 +++ .../lod/quilt/mixins/MixinWorldRenderer.java | 118 +++++ .../quilt/mixins/events/MixinBlockUpdate.java | 46 ++ .../quilt/mixins/events/MixinClientLevel.java | 66 +++ .../quilt/mixins/events/MixinLightmap.java | 28 ++ .../quilt/mixins/events/MixinMinecraft.java | 51 ++ .../quilt/mixins/events/MixinServerLevel.java | 51 ++ .../unsafe/MixinThreadingDectector.java | 53 ++ .../lod/quilt/networking/NetworkHandler.java | 46 ++ .../quilt/wrappers/FabricDependencySetup.java | 50 ++ .../wrappers/config/ModMenuIntegration.java | 38 ++ .../wrappers/modAccessor/ModChecker.java | 32 ++ .../modAccessor/OptifineAccessor.java | 43 ++ .../wrappers/modAccessor/SodiumAccessor.java | 117 +++++ .../modAccessor/StarlightAccessor.java | 35 ++ .../main/resources/LICENSE-MinecraftForge.txt | 458 ++++++++++++++++++ .../src/main/resources/quilt.lod.mixins.json | 27 ++ quilt/src/main/resources/quilt.mod.json | 54 +++ settings.gradle | 10 +- 29 files changed, 2118 insertions(+), 2 deletions(-) create mode 100644 quilt/build.gradle create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/ClientProxy.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/Main.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinChunkGenerator.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinDedicatedServer.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinFogRenderer.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinMinecraft.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinOptionsScreen.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinUtilBackgroudThread.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinWorldRenderer.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinBlockUpdate.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinClientLevel.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinLightmap.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinMinecraft.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinServerLevel.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/mixins/unsafe/MixinThreadingDectector.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/networking/NetworkHandler.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/wrappers/FabricDependencySetup.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/wrappers/config/ModMenuIntegration.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/ModChecker.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/OptifineAccessor.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/SodiumAccessor.java create mode 100644 quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/StarlightAccessor.java create mode 100644 quilt/src/main/resources/LICENSE-MinecraftForge.txt create mode 100644 quilt/src/main/resources/quilt.lod.mixins.json create mode 100644 quilt/src/main/resources/quilt.mod.json diff --git a/Readme.md b/Readme.md index 831004056..06526b60f 100644 --- a/Readme.md +++ b/Readme.md @@ -14,6 +14,9 @@ If you want to see a quick demo, check out a video covering the mod here: ![Minecraft Level Of Detail (LOD) mod - Alpha 1.5](https://i.ytimg.com/vi_webp/H2tnvEVbO1c/mqdefault.webp) +## About this branch +This is a test branch to add support for the quilt mod loader (https://quiltmc.org/) + ### Versions This branch is for these versions of Minecraft diff --git a/build.gradle b/build.gradle index fa67fb0ed..e313459a3 100644 --- a/build.gradle +++ b/build.gradle @@ -189,12 +189,18 @@ allprojects { p -> includeGroup "forge-mod" } } + flatDir { + dirs "${rootDir}/mods/quilt" + content { + includeGroup "quilt-mod" + } + } } // Put stuff from gradle.properties into the mod info processResources { - def resourceTargets = ["fabric.mod.json", "META-INF/mods.toml"] // Location of where to put + def resourceTargets = ["fabric.mod.json", "quilt.mod.json", "META-INF/mods.toml"] // Location of where to put def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder def replaceProperties = [ version : mod_version, @@ -258,6 +264,13 @@ allprojects { p -> into project(":fabric").file("build/resources/main") rename "${acsessWidenerVersion}.lod.accesswidener", "lod.accesswidener" } + + println "Copying [common/src/main/resources/${acsessWidenerVersion}.lod.accesswidner] to [quilt/build/resources/main]." + copy { + from project(":common").file("src/main/resources/${acsessWidenerVersion}.lod.accesswidener") + into project(":quilt").file("build/resources/main") + rename "${acsessWidenerVersion}.lod.accesswidener", "lod.accesswidener" + } } tasks.withType(JavaCompile) { diff --git a/quilt/build.gradle b/quilt/build.gradle new file mode 100644 index 000000000..162ad6455 --- /dev/null +++ b/quilt/build.gradle @@ -0,0 +1,131 @@ +// Use this tutorial for quilt https://lambdaurora.dev/tools/import_quilt.html + +plugins { + id "com.github.johnrengelman.shadow" version "7.1.0" + id 'org.quiltmc.loom' version '0.12.+' // Required for the loader to work. +} + +version = rootProject.mod_version+"-"+rootProject.minecraft_version+"-"+new Date().format("yyyy_MM_dd_HH_mm") + +architectury { + platformSetupLoomIde() +// fabric() +} + +configurations { + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + + addModJar + include.extendsFrom addModJar + modImplementation.extendsFrom addModJar +} + +repositories { + // Required for ModMenu + maven { url "https://maven.terraformersmc.com/" } + + maven { + name 'Quilt' + url 'https://maven.quiltmc.org/repository/release' + } +} + +def addMod(path, enabled) { + if (enabled == "2") + dependencies { modImplementation(path) } + else if (enabled == "1") + dependencies { modCompileOnly(path) } +} + +dependencies { + // Quilt loader + modImplementation "org.quiltmc:quilt-loader:0.16.0-beta.7" + + // Quilt API + modImplementation "org.quiltmc.quilted-fabric-api:quilted-fabric-api:1.0.0-beta.7+0.51.1-1.18.2" + + // Mod Menu + modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") + + // Sodium + addMod("curse.maven:sodium-394468:${rootProject.sodium_version}", rootProject.enable_sodium) + implementation "org.joml:joml:1.10.2" + + + // Toml + shadowMe("com.electronwill.night-config:toml:${rootProject.toml_version}") {} + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowMe(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } + + // Compression + common 'org.tukaani:xz:1.9' + common 'org.apache.commons:commons-compress:1.21' + shadowMe 'org.tukaani:xz:1.9' + shadowMe 'org.apache.commons:commons-compress:1.21' +} + +task deleteResources(type: Delete) { + delete file("build/resources/main") +} + +processResources { + dependsOn(copyCoreResources) + dependsOn(copyCommonResources) + dependsOn(copyAccessWidener) +} + +runClient { + dependsOn(copyCoreResources) + dependsOn(copyCommonResources) + dependsOn(copyAccessWidener) + jvmArgs "-XX:-OmitStackTraceInFastThrow" + finalizedBy(deleteResources) +} + +shadowJar { + configurations = [project.configurations.shadowMe] + relocate 'org.tukaani', 'shaded.tukaani' + relocate 'org.apache.commons.compress', 'shaded.apache.commons.compress' + relocate 'com.electronwill.nightconfig', 'shaded.electronwill.nightconfig' + + relocate 'com.seibel.lod.common', 'quilt.com.seibel.lod.common' + + classifier "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + classifier null +} + +jar { + classifier "dev" +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/ClientProxy.java b/quilt/src/main/java/com/seibel/lod/quilt/ClientProxy.java new file mode 100644 index 000000000..bd974e77a --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/ClientProxy.java @@ -0,0 +1,201 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt; + +import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; +import com.seibel.lod.core.api.ClientApi; +import com.seibel.lod.core.api.EventApi; +import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.mojang.blaze3d.platform.InputConstants; +import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; +import com.seibel.lod.common.wrappers.world.DimensionTypeWrapper; +import com.seibel.lod.common.wrappers.world.WorldWrapper; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; +import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; + +import com.seibel.lod.quilt.mixins.MixinUtilBackgroudThread; +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.keybinding.v1.KeyBindingHelper; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.core.BlockPos; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.chunk.LevelChunk; + +import java.util.HashSet; +import java.util.List; +import java.util.function.Supplier; + +import org.lwjgl.glfw.GLFW; + +/** + * This handles all events sent to the client, + * and is the starting point for most of the mod. + * + * @author coolGi2007 + * @author Ran + * @version 11-23-2021 + */ +public class ClientProxy +{ + private final EventApi eventApi = EventApi.INSTANCE; + private final ClientApi clientApi = ClientApi.INSTANCE; + + public static Supplier isGenerationThreadChecker = null; + + /** + * Registers Fabric Events + * @author Ran + */ + public void registerEvents() { + /* Registor the mod accessor*/ + + /* World Events */ + //ServerTickEvents.START_SERVER_TICK.register(this::serverTickEvent); + ServerTickEvents.END_SERVER_TICK.register(this::serverTickEvent); + + /* World Events */ + //ServerChunkEvents.CHUNK_LOAD.register(this::chunkLoadEvent); + #if PRE_MC_1_18_1 // in 1.18+, we use mixin hook in setClientLightReady(true) + ClientChunkEvents.CHUNK_LOAD.register(this::chunkLoadEvent); + #endif + + /* World Events */ + // FIXME +// ServerWorldEvents.LOAD.register((server, level) -> this.worldLoadEvent(level)); +// ServerWorldEvents.UNLOAD.register((server, level) -> this.worldUnloadEvent(level)); + + /* The Client World Events are in the mixins + Client world load event is in MixinClientLevel + Client world unload event is in MixinMinecraft */ + /* The save events are in MixinServerLevel */ + + /* Keyboard Events */ + // FIXME +// ClientTickEvents.END_CLIENT_TICK.register(client -> { +// if (client.player != null) onKeyInput(); +// }); + isGenerationThreadChecker = BatchGenerationEnvironment::isCurrentThreadDistantGeneratorThread; + + } + + + public void serverTickEvent(MinecraftServer server) + { + eventApi.serverTickEvent(); + } + + public void chunkLoadEvent(LevelAccessor level, LevelChunk chunk) + { + clientApi.clientChunkLoadEvent(new ChunkWrapper(chunk, level), + WorldWrapper.getWorldWrapper(level)); + } + + public void worldSaveEvent() + { + eventApi.worldSaveEvent(); + } + + /** This is also called when a new dimension loads */ + public void worldLoadEvent(Level level) + { + if (Minecraft.getInstance().screen instanceof TitleScreen) return; + if (level != null) { + eventApi.worldLoadEvent(WorldWrapper.getWorldWrapper(level)); + } + } + + public void worldUnloadEvent(Level level) + { + if (level != null) { + eventApi.worldUnloadEvent(WorldWrapper.getWorldWrapper(level)); + } + } + + /** + * Can someone tell me how to make this better + * @author Ran + * + * public void blockChangeEvent(BlockEventData event) { + * // we only care about certain block events + * if (event.getClass() == BlockEventData.BreakEvent.class || + * event.getClass() == BlockEventData.EntityPlaceEvent.class || + * event.getClass() == BlockEventData.EntityMultiPlaceEvent.class || + * event.getClass() == BlockEventData.FluidPlaceBlockEvent.class || + * event.getClass() == BlockEventData.PortalSpawnEvent.class) + * { + * IChunkWrapper chunk = new ChunkWrapper(event.getWorld().getChunk(event.getPos())); + * DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(event.getWorld().dimensionType()); + * + * // recreate the LOD where the blocks were changed + * eventApi.blockChangeEvent(chunk, dimType); + * } + * } + */ + public void blockChangeEvent(LevelAccessor world, BlockPos pos) { + IChunkWrapper chunk = new ChunkWrapper(world.getChunk(pos), world); + DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(world.dimensionType()); + + // recreate the LOD where the blocks were changed + eventApi.blockChangeEvent(chunk, dimType); + } + + private static final int[] KEY_TO_CHECK_FOR = {GLFW.GLFW_KEY_F6, GLFW.GLFW_KEY_F8}; + + HashSet previousKeyDown = new HashSet(); + + public void onKeyInput() { + ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); + if (CONFIG.client().advanced().debugging().getDebugKeybindingsEnabled()) + { + HashSet currectKeyDown = new HashSet(); + + // Note: Minecraft's InputConstants is same as GLFW Key values + //TODO: Use mixin to hook directly into the GLFW Keyboard event in minecraft KeyboardHandler + // Check all keys we need + for (int i = GLFW.GLFW_KEY_A; i <= GLFW.GLFW_KEY_Z; i++) { + if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), i)) { + currectKeyDown.add(i); + } + } + for (int i : KEY_TO_CHECK_FOR) { + if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), i)) { + currectKeyDown.add(i); + } + } + + // Diff and trigger events + for (int c : currectKeyDown) { + if (!previousKeyDown.contains(c)) { + ClientApi.INSTANCE.keyPressedEvent(c); + } + } + + // Update the set + previousKeyDown = currectKeyDown; + } + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/Main.java b/quilt/src/main/java/com/seibel/lod/quilt/Main.java new file mode 100644 index 000000000..bb0904592 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/Main.java @@ -0,0 +1,96 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt; + +import com.seibel.lod.common.LodCommonMain; +import com.seibel.lod.core.ModInfo; +import com.seibel.lod.core.api.ApiShared; +import com.seibel.lod.core.api.ClientApi; +import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorHandler; +import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModChecker; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IOptifineAccessor; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IStarlightAccessor; +import com.seibel.lod.quilt.networking.NetworkHandler; +import com.seibel.lod.quilt.wrappers.modAccessor.ModChecker; +import com.seibel.lod.quilt.wrappers.modAccessor.OptifineAccessor; +import com.seibel.lod.quilt.wrappers.modAccessor.SodiumAccessor; +import com.seibel.lod.quilt.wrappers.modAccessor.StarlightAccessor; +import com.seibel.lod.quilt.wrappers.FabricDependencySetup; + +import net.fabricmc.api.ClientModInitializer; + +/** + * Initialize and setup the Mod.
+ * If you are looking for the real start of the mod + * check out the ClientProxy. + * + * @author coolGi2007 + * @author Ran + * @version 12-1-2021 + */ +public class Main implements ClientModInitializer +{ + // This is a client mod so it should implement ClientModInitializer and in fabric.mod.json it should have "environment": "client" + // Once it works on servers change the implement to ModInitializer and in fabric.mod.json it should be "environment": "*" + + public static ClientProxy client_proxy; + + + // Do if implements ClientModInitializer + // This loads the mod before minecraft loads which causes a lot of issues + @Override + public void onInitializeClient() { + // no. + } + + // This loads the mod after minecraft loads which doesn't causes a lot of issues + public static void init() { + LodCommonMain.initConfig(); + LodCommonMain.startup(null, false, new NetworkHandler()); + FabricDependencySetup.createInitialBindings(); + FabricDependencySetup.finishBinding(); + ApiShared.LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); + + // Check if this works + client_proxy = new ClientProxy(); + client_proxy.registerEvents(); + if (SingletonHandler.get(IModChecker.class).isModLoaded("sodium")) { + ModAccessorHandler.bind(ISodiumAccessor.class, new SodiumAccessor()); + } + if (SingletonHandler.get(IModChecker.class).isModLoaded("starlight")) { + ModAccessorHandler.bind(IStarlightAccessor.class, new StarlightAccessor()); + } + if (SingletonHandler.get(IModChecker.class).isModLoaded("optifine")) { + ModAccessorHandler.bind(IOptifineAccessor.class, new OptifineAccessor()); + } + + ModAccessorHandler.finishBinding(); + } + + public static void initServer() { + LodCommonMain.initConfig(); + LodCommonMain.startup(null, true, new NetworkHandler()); + FabricDependencySetup.createInitialBindings(); + FabricDependencySetup.finishBinding(); + ApiShared.LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinChunkGenerator.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinChunkGenerator.java new file mode 100644 index 000000000..3c3c97b54 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinChunkGenerator.java @@ -0,0 +1,55 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import net.minecraft.world.level.chunk.ChunkGenerator; + +#if PRE_MC_1_18_1 +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.WorldgenRandom; + +@Mixin(ChunkGenerator.class) +public class MixinChunkGenerator { + @Redirect(method = "applyBiomeDecoration", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/biome/Biome;generate(Lnet/minecraft/world/level/StructureFeatureManager;" + + "Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/server/level/WorldGenRegion;J" + + "Lnet/minecraft/world/level/levelgen/WorldgenRandom;Lnet/minecraft/core/BlockPos;)V" + + )) + private void wrapBiomeGenerateCall(Biome biome, StructureFeatureManager structFeatManager, ChunkGenerator generator, + WorldGenRegion genRegion, long l, WorldgenRandom random, BlockPos pos) { + synchronized(ChunkGenerator.class) { + biome.generate(structFeatManager, (ChunkGenerator)(Object)this, genRegion, l, random, pos); + } + } +} + +#else +@Mixin(ChunkGenerator.class) +public class MixinChunkGenerator {} +#endif \ No newline at end of file diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinDedicatedServer.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinDedicatedServer.java new file mode 100644 index 000000000..8385e38fc --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinDedicatedServer.java @@ -0,0 +1,35 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import com.seibel.lod.quilt.Main; +import net.minecraft.server.dedicated.DedicatedServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(DedicatedServer.class) +public class MixinDedicatedServer { + @Inject(method = "initServer", at = @At("TAIL")) + public void initServer(CallbackInfoReturnable cir) { + Main.initServer(); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinFogRenderer.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinFogRenderer.java new file mode 100644 index 000000000..a92d45633 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinFogRenderer.java @@ -0,0 +1,76 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.FogRenderer.FogMode; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +#if PRE_MC_1_17_1 +import net.minecraft.world.level.material.FluidState; +#else +import net.minecraft.world.level.material.FogType; +#endif + +@Mixin(FogRenderer.class) +public class MixinFogRenderer { + private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); + + // Using this instead of Float.MAX_VALUE because Sodium don't like it. + private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F; + private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; + + @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V") + private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) { + #if PRE_MC_1_17_1 + FluidState fluidState = camera.getFluidInCamera(); + boolean cameraNotInFluid = fluidState.isEmpty(); + #else + FogType fogTypes = camera.getFluidInCamera(); + boolean cameraNotInFluid = fogTypes == FogType.NONE; + #endif + + Entity entity = camera.getEntity(); + boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); + if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN + && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) + { + #if PRE_MC_1_17_1 + RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); + #else + RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); + #endif + } + } + +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinMinecraft.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinMinecraft.java new file mode 100644 index 000000000..d48b31f96 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinMinecraft.java @@ -0,0 +1,40 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import com.seibel.lod.quilt.Main; +import net.minecraft.client.Minecraft; +import net.minecraft.client.main.GameConfig; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Loads the mod after minecraft loads. + * @author Ran + */ +@Mixin(value = Minecraft.class) +public class MixinMinecraft { + @Inject(method = "", at = @At("TAIL")) + private void startMod(GameConfig gameConfig, CallbackInfo ci) { + Main.init(); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinOptionsScreen.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinOptionsScreen.java new file mode 100644 index 000000000..eb3a889f5 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinOptionsScreen.java @@ -0,0 +1,72 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import com.seibel.lod.common.wrappers.config.ConfigGui; +import com.seibel.lod.common.wrappers.config.TexturedButtonWidget; +import com.seibel.lod.core.ModInfo; +import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; +import net.minecraft.client.gui.screens.OptionsScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +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.Objects; + +/** + * Adds a button to the menu to goto the config + * + * @author coolGi2007 + * @version 12-02-2021 +*/ +@Mixin(OptionsScreen.class) +public class MixinOptionsScreen extends Screen { + // Get the texture for the button + private static final ResourceLocation ICON_TEXTURE = new ResourceLocation(ModInfo.ID,"textures/gui/button.png"); + protected MixinOptionsScreen(Component title) { + super(title); + } + + @Inject(at = @At("HEAD"),method = "init") + private void lodconfig$init(CallbackInfo ci) { + if (SingletonHandler.get(ILodConfigWrapperSingleton.class).client().getOptionsButton()) + this. #if PRE_MC_1_17_1 addButton #else addRenderableWidget #endif + (new TexturedButtonWidget( + // Where the button is on the screen + this.width / 2 - 180, this.height / 6 - 12, + // Width and height of the button + 20, 20, + // Offset + 0, 0, + // Some textuary stuff + 20, ICON_TEXTURE, 20, 40, + // Create the button and tell it where to go + // For now it goes to the client option by default + (buttonWidget) -> Objects.requireNonNull(minecraft).setScreen(ConfigGui.getScreen(this, "client")), + // Add a title to the screen + new TranslatableComponent("text.autoconfig." + ModInfo.ID + ".title"))); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinUtilBackgroudThread.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinUtilBackgroudThread.java new file mode 100644 index 000000000..9996b60c8 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinUtilBackgroudThread.java @@ -0,0 +1,73 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import java.util.concurrent.ExecutorService; +import java.util.function.Supplier; + +import com.seibel.lod.quilt.ClientProxy; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.seibel.lod.core.util.DummyRunExecutorService; + +import net.minecraft.Util; + +@Mixin(Util.class) +public class MixinUtilBackgroudThread +{ + @Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true) + private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable ci) + { + if (ClientProxy.isGenerationThreadChecker != null && ClientProxy.isGenerationThreadChecker.get()) + { + //ApiShared.LOGGER.info("util backgroundExecutor triggered"); + ci.setReturnValue(new DummyRunExecutorService()); + } + } + + #if POST_MC_1_17_1 + @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Runnable;", + at = @At("HEAD"), cancellable = true) + private static void overrideUtil$wrapThreadWithTaskName(String string, Runnable r, CallbackInfoReturnable ci) + { + if (ClientProxy.isGenerationThreadChecker != null && ClientProxy.isGenerationThreadChecker.get()) + { + //ApiShared.LOGGER.info("util wrapThreadWithTaskName(Runnable) triggered"); + ci.setReturnValue(r); + } + } + #endif + #if POST_MC_1_18_1 + @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/util/function/Supplier;", + at = @At("HEAD"), cancellable = true) + private static void overrideUtil$wrapThreadWithTaskNameForSupplier(String string, Supplier r, CallbackInfoReturnable> ci) + { + if (ClientProxy.isGenerationThreadChecker != null && ClientProxy.isGenerationThreadChecker.get()) + { + //ApiShared.LOGGER.info("util wrapThreadWithTaskName(Supplier) triggered"); + ci.setReturnValue(r); + } + } + #endif + +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinWorldRenderer.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinWorldRenderer.java new file mode 100644 index 000000000..9946223d8 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/MixinWorldRenderer.java @@ -0,0 +1,118 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.seibel.lod.common.Config; +import com.seibel.lod.common.wrappers.McObjectConverter; +import com.seibel.lod.core.api.ClientApi; +import com.seibel.lod.core.objects.math.Mat4f; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderType; +import org.lwjgl.opengl.GL15; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * This class is used to mix in my rendering code + * before Minecraft starts rendering blocks. + * If this wasn't done, and we used Forge's + * render last event, the LODs would render on top + * of the normal terrain. + * + * This is also the mixin for rendering the clouds + * + * @author coolGi2007 + * @author James Seibel + * @version 12-31-2021 + */ +@Mixin(LevelRenderer.class) +public class MixinWorldRenderer +{ + private static float previousPartialTicks = 0; + + public MixinWorldRenderer() { + throw new NullPointerException("Null cannot be cast to non-null type."); + } + + + // Inject rendering at first call to renderChunkLayer + // HEAD or RETURN + #if PRE_MC_1_17_1 + @Inject(at = @At("RETURN"), method = "renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V") + private void renderSky(PoseStack matrixStackIn, float partialTicks, CallbackInfo callback) + { + // get the partial ticks since renderBlockLayer doesn't + // have access to them + previousPartialTicks = partialTicks; + } + + @Inject(at = @At("HEAD"), + method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", + cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack matrixStackIn, double xIn, double yIn, double zIn, CallbackInfo callback) + { + // only render before solid blocks + if (renderType.equals(RenderType.solid())) + { + // get MC's current projection matrix + float[] mcProjMatrixRaw = new float[16]; + GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); + Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); + mcProjectionMatrix.transpose(); + Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); + + ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + } + if (Config.Client.Advanced.lodOnlyMode) { + callback.cancel(); + } + } + #else + @Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true) + public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float tickDelta, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + // get the partial ticks since renderChunkLayer doesn't + // have access to them + previousPartialTicks = tickDelta; + } + + @Inject(at = @At("HEAD"), + method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V", + cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) + { + // only render before solid blocks + if (renderType.equals(RenderType.solid())) + { + Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); + Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); + + ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + } + if (Config.Client.Advanced.lodOnlyMode) { + callback.cancel(); + } + } + #endif +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinBlockUpdate.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinBlockUpdate.java new file mode 100644 index 000000000..91973111a --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinBlockUpdate.java @@ -0,0 +1,46 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins.events; + +import com.seibel.lod.quilt.Main; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +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; + +/** + * If someone has a better way to do this then please let me know. + * + * @author Ran + */ +@Mixin(ClientboundBlockUpdatePacket.class) +public abstract class MixinBlockUpdate { + @Shadow public abstract BlockPos getPos(); + + @Inject(method = "handle(Lnet/minecraft/network/protocol/game/ClientGamePacketListener;)V", at = @At("TAIL")) + private void onBlockUpdate(ClientGamePacketListener clientGamePacketListener, CallbackInfo ci) { + Main.client_proxy.blockChangeEvent(Minecraft.getInstance().player.clientLevel, this.getPos()); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinClientLevel.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinClientLevel.java new file mode 100644 index 000000000..f79413829 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinClientLevel.java @@ -0,0 +1,66 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins.events; + +import com.seibel.lod.quilt.Main; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.renderer.LevelRenderer; +#if POST_MC_1_18_2 +import net.minecraft.core.Holder; +#endif +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.dimension.DimensionType; +import org.spongepowered.asm.mixin.Mixin; +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.Supplier; + +/** + * This class is used for world loading events + * @author Ran + * + * FIXME: Why does forge not have the 1.18+ onChunkLightReady mixin? + */ + +@Mixin(ClientLevel.class) +public class MixinClientLevel { + @Inject(method = "", at = @At("TAIL")) + private void loadWorldEvent(ClientPacketListener clientPacketListener, ClientLevel.ClientLevelData clientLevelData, ResourceKey resourceKey, + #if POST_MC_1_18_2 Holder holder, #else DimensionType dimensionType, #endif int i, + #if POST_MC_1_18_1 int j, #endif Supplier supplier, LevelRenderer levelRenderer, boolean bl, long l, CallbackInfo ci) { + Main.client_proxy.worldLoadEvent((ClientLevel) (Object) this); + } + + #if POST_MC_1_18_1 + @Inject(method = "setLightReady", at = @At("HEAD")) + private void onChunkLightReady(int x, int z, CallbackInfo ci) { + ClientLevel l = (ClientLevel) (Object) this; + LevelChunk chunk = l.getChunkSource().getChunk(x, z, false); + if (chunk!=null&& !chunk.isClientLightReady()) + Main.client_proxy.chunkLoadEvent(l, chunk); + } + #endif +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinLightmap.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinLightmap.java new file mode 100644 index 000000000..b825c506c --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinLightmap.java @@ -0,0 +1,28 @@ +package com.seibel.lod.quilt.mixins.events; + + +import com.mojang.blaze3d.platform.NativeImage; +import com.seibel.lod.common.wrappers.minecraft.MinecraftRenderWrapper; +import com.seibel.lod.core.api.ApiShared; +import net.minecraft.client.renderer.LightTexture; +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.callback.CallbackInfo; + +@Mixin(LightTexture.class) +public class MixinLightmap { + @Shadow + @Final + public NativeImage lightPixels; + + @Inject(method="updateLightTexture", at=@At( + value="INVOKE", + target="Lnet/minecraft/client/renderer/texture/DynamicTexture;upload()V")) + public void updateLightTexture(float f, CallbackInfo ci) { + //ApiShared.LOGGER.info("Lightmap update"); + MinecraftRenderWrapper.INSTANCE.updateLightmap(lightPixels); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinMinecraft.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinMinecraft.java new file mode 100644 index 000000000..7490b44f9 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinMinecraft.java @@ -0,0 +1,51 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins.events; + +import com.seibel.lod.quilt.Main; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientLevel; + +import org.jetbrains.annotations.Nullable; +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; + +/** + * This class is used for world unloading events + * @author Ran + */ +@Mixin(Minecraft.class) +public class MixinMinecraft { + @Shadow @Nullable public ClientLevel level; + + @Inject(method = "setLevel", at = @At("HEAD")) + private void unloadWorldEvent_sL(ClientLevel clientLevel, CallbackInfo ci) { + if (level != null) Main.client_proxy.worldUnloadEvent(level); + } + + @Inject(method = "clearLevel(Lnet/minecraft/client/gui/screens/Screen;)V", at = @At("HEAD")) + private void unloadWorldEvent_cL(Screen screen, CallbackInfo ci) { + if (this.level != null) Main.client_proxy.worldUnloadEvent(this.level); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinServerLevel.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinServerLevel.java new file mode 100644 index 000000000..ae9e13e5d --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/events/MixinServerLevel.java @@ -0,0 +1,51 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins.events; + +import com.seibel.lod.quilt.Main; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.ProgressListener; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * This class is used for world saving events + * @author Ran + */ +@Mixin(ServerLevel.class) +public class MixinServerLevel { + #if PRE_MC_1_17_1 + @Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerChunkCache;save(Z)V", shift = At.Shift.AFTER)) + private void saveWorldEvent(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) { + Main.client_proxy.worldSaveEvent(); + } + #else + @Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;saveAll()V", shift = At.Shift.AFTER)) + private void saveWorldEvent_sA(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) { + Main.client_proxy.worldSaveEvent(); + } + @Inject(method = "save", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;autoSave()V", shift = At.Shift.AFTER)) + private void saveWorldEvent_aS(ProgressListener progressListener, boolean bl, boolean bl2, CallbackInfo ci) { + Main.client_proxy.worldSaveEvent(); + } + #endif +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/mixins/unsafe/MixinThreadingDectector.java b/quilt/src/main/java/com/seibel/lod/quilt/mixins/unsafe/MixinThreadingDectector.java new file mode 100644 index 000000000..d4c27cc36 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/mixins/unsafe/MixinThreadingDectector.java @@ -0,0 +1,53 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.mixins.unsafe; + +import net.minecraft.server.level.ServerLevel; +import org.spongepowered.asm.mixin.Mixin; + +#if POST_MC_1_18_1 + +import net.minecraft.util.ThreadingDetector; +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.callback.CallbackInfo; + +import java.util.concurrent.Semaphore; + +/** + * Why does this exist? But okay! (Will be probably removed when the experimental generator is done) + */ +@Mixin(ThreadingDetector.class) +public class MixinThreadingDectector { + @Mutable + @Shadow + private Semaphore lock; + + @Inject(method = "", at = @At("RETURN")) + private void setSemaphore(CallbackInfo ci) { + this.lock = new Semaphore(2); + } +} +#else +@Mixin(ServerLevel.class) + public class MixinThreadingDectector {} //FIXME: Is there some way to make this file just not be added? +#endif diff --git a/quilt/src/main/java/com/seibel/lod/quilt/networking/NetworkHandler.java b/quilt/src/main/java/com/seibel/lod/quilt/networking/NetworkHandler.java new file mode 100644 index 000000000..2e818d19f --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/networking/NetworkHandler.java @@ -0,0 +1,46 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.networking; + +import com.seibel.lod.common.networking.NetworkInterface; +import com.seibel.lod.common.networking.Networking; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; + +/** + * @author Ran + */ +public class NetworkHandler implements NetworkInterface { + @Override + public void register_Client() { + // FIXME +// ClientPlayNetworking.registerGlobalReceiver(Networking.resourceLocation_meow, (client, handler, buf, responseSender) -> { +// com.seibel.lod.common.networking.NetworkHandler.receivePacketClient(client, handler, buf); +// }); + } + + @Override + public void register_Server() { + // FIXME +// ServerPlayNetworking.registerGlobalReceiver(Networking.resourceLocation_meow, (server, player, handler, buf, responseSender) -> { +// com.seibel.lod.common.networking.NetworkHandler.receivePacketServer(server, player, handler, buf); +// }); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/wrappers/FabricDependencySetup.java b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/FabricDependencySetup.java new file mode 100644 index 000000000..27142accd --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/FabricDependencySetup.java @@ -0,0 +1,50 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.wrappers; + +import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; +import com.seibel.lod.common.wrappers.config.LodConfigWrapperSingleton; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModChecker; +import com.seibel.lod.quilt.wrappers.modAccessor.ModChecker; + +/** + * Binds all necessary dependencies, so we + * can access them in Core.
+ * This needs to be called before any Core classes + * are loaded. + * + * @author James Seibel + * @author Ran + * @version 3-5-2022 + */ +public class FabricDependencySetup +{ + public static void createInitialBindings() + { + SingletonHandler.bind(IModChecker.class, ModChecker.INSTANCE); + + SingletonHandler.bind(ILodConfigWrapperSingleton.class, LodConfigWrapperSingleton.INSTANCE); + } + + public static void finishBinding() { + SingletonHandler.finishBinding(); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/wrappers/config/ModMenuIntegration.java b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/config/ModMenuIntegration.java new file mode 100644 index 000000000..0a39668f6 --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/config/ModMenuIntegration.java @@ -0,0 +1,38 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.wrappers.config; + +import com.seibel.lod.common.wrappers.config.ConfigGui; +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +/** + * For making the config show up in modmenu + */ +@Environment(EnvType.CLIENT) +public class ModMenuIntegration implements ModMenuApi { + // For the custom config code + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return parent -> ConfigGui.getScreen(parent, ""); + } +} \ No newline at end of file diff --git a/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/ModChecker.java b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/ModChecker.java new file mode 100644 index 000000000..1d53741dc --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/ModChecker.java @@ -0,0 +1,32 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.wrappers.modAccessor; + +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModChecker; +import org.quiltmc.loader.api.QuiltLoader; + +public class ModChecker implements IModChecker { + public static final ModChecker INSTANCE = new ModChecker(); + + @Override + public boolean isModLoaded(String modid) { + return QuiltLoader.isModLoaded(modid); + } +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/OptifineAccessor.java b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/OptifineAccessor.java new file mode 100644 index 000000000..c4b023fbe --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/OptifineAccessor.java @@ -0,0 +1,43 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.wrappers.modAccessor; + +import java.util.HashSet; + +import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IOptifineAccessor; + +public class OptifineAccessor implements IOptifineAccessor +{ + + @Override + public String getModName() + { + return "Optifine-Fabric-1.18.X"; + } + + @Override + public HashSet getNormalRenderedChunks() + { + // TODO: Impl proper methods here + return null; + } + +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/SodiumAccessor.java b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/SodiumAccessor.java new file mode 100644 index 000000000..5a9ef012c --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/SodiumAccessor.java @@ -0,0 +1,117 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.wrappers.modAccessor; + +import java.util.HashSet; +import java.util.stream.Collectors; + +import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory; +import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; +import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; + + +import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import net.minecraft.client.Minecraft; +#if PRE_MC_1_17_1 +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.phys.AABB; +#else +import net.minecraft.world.level.LevelHeightAccessor; +#endif + +public class SodiumAccessor implements ISodiumAccessor { + private final IWrapperFactory factory = SingletonHandler.get(IWrapperFactory.class); + private final IMinecraftRenderWrapper MC_RENDER = SingletonHandler.get(IMinecraftRenderWrapper.class); + + @Override + public String getModName() { + return "Sodium-Fabric"; + } + + #if POST_MC_1_17_1 + @Override + public HashSet getNormalRenderedChunks() { + SodiumWorldRenderer renderer = SodiumWorldRenderer.instance(); + LevelHeightAccessor height = Minecraft.getInstance().level; + + #if POST_MC_1_18_1 + // 0b11 = Lighted chunk & loaded chunk + return renderer.getChunkTracker().getChunks(0b00).filter( + (long l) -> { + return true; + }).mapToObj((long l) -> { + return (AbstractChunkPosWrapper)factory.createChunkPos(l); + }).collect(Collectors.toCollection(HashSet::new)); + #else + // TODO: Maybe use a mixin to make this more efficient, and maybe ignore changes behind the camera + return MC_RENDER.getMaximumRenderedChunks().stream().filter((AbstractChunkPosWrapper chunk) -> { + return (renderer.isBoxVisible( + chunk.getMinBlockX()+1, height.getMinBuildHeight()+1, chunk.getMinBlockZ()+1, + chunk.getMinBlockX()+15, height.getMaxBuildHeight()-1, chunk.getMinBlockZ()+15)); + }).collect(Collectors.toCollection(HashSet::new)); + #endif + } + #else + @Override + public HashSet getNormalRenderedChunks() { + SodiumWorldRenderer renderer = SodiumWorldRenderer.getInstance(); + LevelAccessor height = Minecraft.getInstance().level; + // TODO: Maybe use a mixin to make this more efficient + return MC_RENDER.getMaximumRenderedChunks().stream().filter((AbstractChunkPosWrapper chunk) -> { + FakeChunkEntity AABB = new FakeChunkEntity(chunk.getX(), chunk.getZ(), height.getMaxBuildHeight()); + return (renderer.isEntityVisible(AABB)); + }).collect(Collectors.toCollection(HashSet::new)); + } + + private static class FakeChunkEntity extends Entity { + public int cx; + public int cz; + public int my; + public FakeChunkEntity(int chunkX, int chunkZ, int maxHeight) { + super(EntityType.AREA_EFFECT_CLOUD, null); + cx = chunkX; + cz = chunkZ; + my = maxHeight; + } + @Override + public AABB getBoundingBoxForCulling() { + return new AABB(cx*16+1, 1, cz*16+1, + cx*16+15, my-1, cz*16+15); + } + @Override + protected void defineSynchedData() {} + @Override + protected void readAdditionalSaveData(CompoundTag paramCompoundTag) {} + @Override + protected void addAdditionalSaveData(CompoundTag paramCompoundTag) {} + @Override + public Packet getAddEntityPacket() { + throw new UnsupportedOperationException("This is a FAKE CHUNK ENTITY... For tricking the Sodium to check a AABB."); + } + } + #endif + +} diff --git a/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/StarlightAccessor.java b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/StarlightAccessor.java new file mode 100644 index 000000000..7f799f2cf --- /dev/null +++ b/quilt/src/main/java/com/seibel/lod/quilt/wrappers/modAccessor/StarlightAccessor.java @@ -0,0 +1,35 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.quilt.wrappers.modAccessor; + +import com.seibel.lod.core.wrapperInterfaces.modAccessor.IStarlightAccessor; + + +public class StarlightAccessor implements IStarlightAccessor { + + @Override + public String getModName() { + return "Starlight-Fabric-1.18.X"; + } + + public StarlightAccessor() { + + } +} diff --git a/quilt/src/main/resources/LICENSE-MinecraftForge.txt b/quilt/src/main/resources/LICENSE-MinecraftForge.txt new file mode 100644 index 000000000..fe17b67bd --- /dev/null +++ b/quilt/src/main/resources/LICENSE-MinecraftForge.txt @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/quilt/src/main/resources/quilt.lod.mixins.json b/quilt/src/main/resources/quilt.lod.mixins.json new file mode 100644 index 000000000..ce43b7865 --- /dev/null +++ b/quilt/src/main/resources/quilt.lod.mixins.json @@ -0,0 +1,27 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.seibel.lod.quilt.mixins", + "mixins": [ + "unsafe.MixinThreadingDectector", + "MixinUtilBackgroudThread", + "events.MixinServerLevel" + ], + "client": [ + "MixinMinecraft", + "MixinOptionsScreen", + "MixinWorldRenderer", + "MixinFogRenderer", + "MixinChunkGenerator", + "events.MixinClientLevel", + "events.MixinMinecraft", + "events.MixinBlockUpdate", + "events.MixinLightmap" + ], + "server": [ + "MixinDedicatedServer" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/quilt/src/main/resources/quilt.mod.json b/quilt/src/main/resources/quilt.mod.json new file mode 100644 index 000000000..b6a4e9709 --- /dev/null +++ b/quilt/src/main/resources/quilt.mod.json @@ -0,0 +1,54 @@ +{ + "schemaVersion": 1, + "quilt_loader": { + "id": "lod", + "version": "${version}", + "group": "com.seibel", + "metadata": { + "name": "${mod_name}", + "description": "${description}", + "contributors": ${authors}, + "contact": { + "homepage": "${homepage}", + "sources": "${source}", + "issues": "${issues}" + }, + "license": "CC0-1.0", + "icon": "icon.png", + }, + "environment": "client", + "entrypoints": { + "client": [ + "com.seibel.lod.quilt.Main" + ], + "modmenu": [ + "com.seibel.lod.quilt.wrappers.config.ModMenuIntegration" + ] + }, + "mixins": [ + "quilt.lod.mixins.json" + ], + "accessWidener": "lod.accesswidener", + "depends": { + { + "id": "quilt_loader", + "versions": "*" + }, + { + "id": "quilted_fabric_api", + "versions": "*" + }, + { + "id": "minecraft", + "versions": ${compatible_minecraft_versions} + } + }, + "custom": { + "modmenu": { + "links": { + "modmenu.discord": "https://discord.gg/xAB8G4cENx" + } + } + } + } +} diff --git a/settings.gradle b/settings.gradle index 346d40011..9e130fb95 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,13 @@ pluginManagement { repositories { - maven { url "https://maven.fabricmc.net/" } + maven { + name = 'Fabric' + url "https://maven.fabricmc.net/" + } + maven { + name = 'Quilt' + url = 'https://maven.quiltmc.org/repository/release' + } maven { url "https://maven.architectury.dev/" } maven { url "https://maven.minecraftforge.net/" } gradlePluginPortal() @@ -10,6 +17,7 @@ pluginManagement { include("common") include("fabric") include("forge") +include("quilt") include("core") rootProject.name = "DistantHorizons"