diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ad1bdb6..dc52b9fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,2 @@ ## Changelog -- update dependencies -- (Fabric) try fix nightconfig issue \ No newline at end of file +- update to 1.21.1 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2c38831e..eaeccaae 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false id "com.github.johnrengelman.shadow" version "8.+" apply false id "com.hypherionmc.modutils.modpublisher" version "2.+" apply false } @@ -9,28 +9,21 @@ architectury { minecraft = rootProject.minecraft_version } +allprojects { + version = "${rootProject.mod_version}+mc${rootProject.minecraft_version}" + group = rootProject.maven_group +} + subprojects { + apply plugin: "java" + apply plugin: "maven-publish" + apply plugin: "architectury-plugin" apply plugin: "dev.architectury.loom" apply plugin: "com.github.johnrengelman.shadow" apply plugin: "com.hypherionmc.modutils.modpublisher" - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered { - mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" - mappings "dev.architectury:yarn-mappings-patch-neoforge:${rootProject.mappings_patch}" - } - } -} -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - archivesBaseName = rootProject.archives_base_name - version = "${rootProject.mod_version}+mc${rootProject.minecraft_version}" - group = rootProject.maven_group + archivesBaseName = "${rootProject.archives_base_name}-${project.name}" repositories { maven { url = "https://maven.gegy.dev" } @@ -39,15 +32,48 @@ allprojects { maven { url = "https://maven.terraformersmc.com/releases/" } } - tasks.withType(JavaCompile) { + dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.layered { + mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" + mappings "dev.architectury:yarn-mappings-patch-neoforge:${rootProject.mappings_patch}" + } + + implementation("com.electronwill.night-config:core:3.8.0") + implementation("com.electronwill.night-config:toml:3.8.0") + } + + tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" options.release = 21 } java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } + sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 withSourcesJar() } + + // Configure Maven publishing. + publishing { + publications { + mavenJava(MavenPublication) { + artifactId = base.archivesName.get() + 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. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } + } } diff --git a/common/build.gradle b/common/build.gradle index 3de99ecc..74c53f60 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -9,23 +9,6 @@ loom { dependencies { // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies // Do NOT use other classes from fabric loader - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modImplementation "maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric" - - implementation "com.electronwill.night-config:core:3.6.6" - implementation "com.electronwill.night-config:toml:3.6.6" -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.archives_base_name - 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. - } + modImplementation("net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}") + modImplementation("maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric") } diff --git a/common/src/main/java/org/thinkingstudio/ryoamiclights/RyoamicLightsCompat.java b/common/src/main/java/org/thinkingstudio/ryoamiclights/RyoamicLightsCompat.java index bc37ce05..98722a0d 100644 --- a/common/src/main/java/org/thinkingstudio/ryoamiclights/RyoamicLightsCompat.java +++ b/common/src/main/java/org/thinkingstudio/ryoamiclights/RyoamicLightsCompat.java @@ -42,7 +42,16 @@ public static boolean isLilTaterReloadedInstalled() { * @return {@code true} if Sodium is installed, else {@code false} */ public static boolean isSodiumInstalled() { - return ModPlatform.isModLoaded("sodium") != ModPlatform.isModLoaded("embeddium"); + return ModPlatform.isModLoaded("sodium"); + } + + /** + * Returns whether Embeddium is installed. + * + * @return {@code true} if Embeddium is installed, else {@code false} + */ + public static boolean isEmbeddiumInstalled() { + return ModPlatform.isModLoaded("embeddium"); } /** diff --git a/common/src/main/java/org/thinkingstudio/ryoamiclights/mixin/WorldMixin.java b/common/src/main/java/org/thinkingstudio/ryoamiclights/mixin/WorldMixin.java index 75d3e542..aa7ccefc 100644 --- a/common/src/main/java/org/thinkingstudio/ryoamiclights/mixin/WorldMixin.java +++ b/common/src/main/java/org/thinkingstudio/ryoamiclights/mixin/WorldMixin.java @@ -10,11 +10,11 @@ package org.thinkingstudio.ryoamiclights.mixin; +import com.llamalad7.mixinextras.sugar.Local; import org.thinkingstudio.ryoamiclights.DynamicLightSource; import org.thinkingstudio.ryoamiclights.RyoamicLights; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.profiler.Profiler; import net.minecraft.world.World; import net.minecraft.world.chunk.BlockEntityTickInvoker; import org.jetbrains.annotations.Nullable; @@ -23,9 +23,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.Iterator; @Mixin(World.class) public abstract class WorldMixin { @@ -37,10 +34,13 @@ public abstract class WorldMixin { @Inject( method = "tickBlockEntities", - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/BlockEntityTickInvoker;tick()V", shift = At.Shift.BEFORE), - locals = LocalCapture.CAPTURE_FAILEXCEPTION + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/chunk/BlockEntityTickInvoker;tick()V", + shift = At.Shift.BEFORE + ) ) - private void onBlockEntityTick(CallbackInfo ci, Profiler profiler, Iterator iterator, boolean isRemoved, BlockEntityTickInvoker blockEntityTickInvoker) { + private void onBlockEntityTick(CallbackInfo ci, @Local boolean isRemoved, @Local BlockEntityTickInvoker blockEntityTickInvoker) { if (this.isClient() && RyoamicLights.get().config.getBlockEntitiesLightSource().get() && !isRemoved) { var blockEntity = this.getBlockEntity(blockEntityTickInvoker.getPos()); if (blockEntity != null) diff --git a/common/src/main/java/org/thinkingstudio/ryoamiclights/util/SodiumDynamicLightHandler.java b/common/src/main/java/org/thinkingstudio/ryoamiclights/util/SodiumDynamicLightHandler.java index 378d58d1..1f2e8eb5 100644 --- a/common/src/main/java/org/thinkingstudio/ryoamiclights/util/SodiumDynamicLightHandler.java +++ b/common/src/main/java/org/thinkingstudio/ryoamiclights/util/SodiumDynamicLightHandler.java @@ -26,7 +26,7 @@ static int getLightmap(BlockPos pos, int word, int lightmap) { return lightmap; // Equivalent to world.getBlockState(pos).isOpaqueFullCube(world, pos) - if (/*LightDataAccess.unpackFO(word)*/ (word >>> 30 & 1) != 0) + if ((word >>> 30 & 1) != 0) return lightmap; double dynamic = RyoamicLights.get().getDynamicLightLevel(pos); diff --git a/fabric/CHANGELOG.md b/fabric/CHANGELOG.md index 4ad1bdb6..dc52b9fc 100644 --- a/fabric/CHANGELOG.md +++ b/fabric/CHANGELOG.md @@ -1,3 +1,2 @@ ## Changelog -- update dependencies -- (Fabric) try fix nightconfig issue \ No newline at end of file +- update to 1.21.1 \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index 53d385ef..e5e4f10e 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -7,31 +7,35 @@ loom { accessWidenerPath = project(":common").loom.accessWidenerPath } -project.archivesBaseName = rootProject.archivesBaseName + "-fabric" - configurations { - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + common { + canBeResolved = true + canBeConsumed = false + } compileClasspath.extendsFrom common runtimeClasspath.extendsFrom common developmentFabric.extendsFrom common + // Files in this configuration will be bundled into your mod using the Shadow plugin. + // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. + shadowBundle { + canBeResolved = true + canBeConsumed = false + } } dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - modApi "maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric" - modCompileOnly "maven.modrinth:indium:${project.indium_version}" + modImplementation("net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}") + modApi("net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}") + modApi("maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric") + modCompileOnly("maven.modrinth:indium:${project.indium_version}") modCompileOnly("com.terraformersmc:modmenu:${rootProject.mod_menu_version}") { transitive false } - implementation 'com.electronwill.night-config:core:3.6.6' - implementation 'com.electronwill.night-config:toml:3.6.6' - shadowCommon 'com.electronwill.night-config:core:3.6.6' - shadowCommon 'com.electronwill.night-config:toml:3.6.6' + shadowBundle("com.electronwill.night-config:core:3.8.0") + shadowBundle("com.electronwill.night-config:toml:3.8.0") common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } + shadowBundle(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } } processResources { @@ -43,49 +47,15 @@ processResources { } shadowJar { - exclude "architectury.common.json" - relocate "com.electronwill.nightconfig", "${rootProject.maven_group}.shadow.nightconfig" - configurations = [project.configurations.shadowCommon] + configurations = [project.configurations.shadowBundle] archiveClassifier.set("dev-shadow") } remapJar { - injectAccessWidener = true - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier.set(null) -} - -jar { - archiveClassifier.set("dev") -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenFabric(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name - 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. - } + injectAccessWidener.set(true) + inputFile.set(shadowJar.archiveFile) } publisher { @@ -100,7 +70,7 @@ publisher { setChangelog(file("CHANGELOG.md").getText("UTF-8")) setVersion("${rootProject.version}-fabric") setDisplayName("[Fabric] ${rootProject.version}") - setGameVersions("1.21") + setGameVersions("1.21", "1.21.1") setLoaders("fabric") setCurseEnvironment("client") setArtifact(remapJar) diff --git a/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/NightConfigFixes.java b/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/NightConfigFixes.java deleted file mode 100644 index 5d91dee4..00000000 --- a/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/NightConfigFixes.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.thinkingstudio.fork.nightconfigfixes; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class NightConfigFixes { - public static final Logger LOGGER = LoggerFactory.getLogger(NightConfigFixes.class); -} diff --git a/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/mixin/ConfigParserFabricMixin.java b/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/mixin/ConfigParserFabricMixin.java deleted file mode 100644 index 0b690774..00000000 --- a/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/mixin/ConfigParserFabricMixin.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.thinkingstudio.fork.nightconfigfixes.mixin; - -import com.electronwill.nightconfig.core.Config; -import com.electronwill.nightconfig.core.ConfigFormat; -import com.electronwill.nightconfig.core.file.FileNotFoundAction; -import com.electronwill.nightconfig.core.io.ParsingException; -import com.electronwill.nightconfig.core.io.ParsingMode; -import com.electronwill.nightconfig.core.io.WritingException; - -import org.thinkingstudio.fork.nightconfigfixes.NightConfigFixes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; - -/** - * Specify target class as string to maybe help when night config is not present on Fabric, not sure if it really makes a different, after all Mixin is very forgiving when the target class does not exist. - *

Also we are forced to use {@link Overwrite} instead of {@link org.spongepowered.asm.mixin.injection.Inject} as the latter is not supported in interfaces. - * - * @author Fuzss - */ -@Mixin(targets = "com.electronwill.nightconfig.core.io.ConfigParser") -interface ConfigParserFabricMixin { - - @Shadow(remap = false) - ConfigFormat getFormat(); - - /** - * @author Fuzss - * @reason fix ParsingException - */ - @Overwrite(remap = false) - default C parse(Path file, FileNotFoundAction nefAction, Charset charset) { - try { - if (Files.notExists(file) && !nefAction.run(file, this.getFormat())) { - return this.getFormat().createConfig(); - } - try (InputStream input = Files.newInputStream(file)) { - return this.parse(input, charset); - } catch (ParsingException e) { - // we come in here and catch the ParsingException, just try to recreate the config via the FileNotFoundAction - // if we fail just throw the ParsingException like we aren't even here - try { - Files.delete(file); - if (nefAction.run(file, this.getFormat())) { - C config; - try (InputStream input = Files.newInputStream(file)) { - config = this.parse(input, charset); - } - NightConfigFixes.LOGGER.warn("Configuration file {} could not be parsed. Correcting", file.toAbsolutePath()); - return config; - } - } catch (Throwable t) { - e.addSuppressed(t); - } - throw e; - } - } catch (IOException e) { - throw new WritingException("An I/O error occurred", e); - } - } - - @Shadow(remap = false) - C parse(InputStream input, Charset charset); - - /** - * @author Fuzss - * @reason fix ParsingException - */ - @Overwrite(remap = false) - default void parse(Path file, Config destination, ParsingMode parsingMode, FileNotFoundAction nefAction, Charset charset) { - try { - if (Files.notExists(file) && !nefAction.run(file, this.getFormat())) { - return; - } - try (InputStream input = Files.newInputStream(file)) { - this.parse(input, destination, parsingMode, charset); - } catch (ParsingException e) { - // we come in here and catch the ParsingException, just try to recreate the config via the FileNotFoundAction - // if we fail just throw the ParsingException like we aren't even here - try { - Files.delete(file); - if (nefAction.run(file, this.getFormat())) { - try (InputStream input = Files.newInputStream(file)) { - this.parse(input, destination, parsingMode, charset); - } - NightConfigFixes.LOGGER.warn("Configuration file {} could not be parsed. Correcting", file.toAbsolutePath()); - return; - } - } catch (Throwable t) { - e.addSuppressed(t); - } - throw e; - } - } catch (IOException e) { - throw new WritingException("An I/O error occurred", e); - } - } - - @Shadow(remap = false) - void parse(InputStream input, Config destination, ParsingMode parsingMode, Charset charset); -} \ No newline at end of file diff --git a/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/package-info.java b/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/package-info.java deleted file mode 100644 index 7704291a..00000000 --- a/fabric/src/main/java/org/thinkingstudio/fork/nightconfigfixes/package-info.java +++ /dev/null @@ -1,384 +0,0 @@ -package org.thinkingstudio.fork.nightconfigfixes; - -/* - This package code from Fuzs' NightConfigFixes Mod (https://github.com/Fuzss/nightconfigfixes) - - Code is under MPL-2.0 - */ - - -/* -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. - */ \ No newline at end of file diff --git a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/RyoamicLightsFabricMixinPlugin.java b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/RyoamicLightsFabricMixinPlugin.java index 18004891..6c7b021d 100644 --- a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/RyoamicLightsFabricMixinPlugin.java +++ b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/RyoamicLightsFabricMixinPlugin.java @@ -28,13 +28,15 @@ public RyoamicLightsFabricMixinPlugin() { this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.ltr.LilTaterBlocksMixin", ltrInstalled); this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.ltr.LilTaterBlockEntityMixin", ltrInstalled); - boolean sodiumInstalled = RyoamicLightsCompat.isSodiumInstalled(); - this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.ArrayLightDataCacheMixin", sodiumInstalled); - this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.FlatLightPipelineMixin", sodiumInstalled); - this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.LightDataAccessMixin", sodiumInstalled); + if (!RyoamicLightsCompat.isEmbeddiumInstalled()) { + boolean sodiumInstalled = RyoamicLightsCompat.isSodiumInstalled(); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.ArrayLightDataCacheMixin", sodiumInstalled); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.FlatLightPipelineMixin", sodiumInstalled); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.LightDataAccessMixin", sodiumInstalled); - boolean indiumInstalled = RyoamicLightsCompat.isIndiumInstalled(); - this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.indium.TerrainRenderContextMixin", indiumInstalled); + boolean indiumInstalled = RyoamicLightsCompat.isIndiumInstalled(); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.indium.TerrainRenderContextMixin", indiumInstalled); + } boolean fabricApiInstalled = RyoamicLightsCompat.isFabricApiInstalled(); this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.fabricapi.AoCalculatorMixin", fabricApiInstalled); diff --git a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/ArrayLightDataCacheMixin.java b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/ArrayLightDataCacheMixin.java index e4c325ee..9ea05077 100644 --- a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/ArrayLightDataCacheMixin.java +++ b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/ArrayLightDataCacheMixin.java @@ -20,7 +20,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Pseudo -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.data.ArrayLightDataCache", remap = false) +@Mixin(targets = { + "me.jellysquid.mods.sodium.client.model.light.data.ArrayLightDataCache", + "net.caffeinemc.mods.sodium.client.model.light.data.ArrayLightDataCache" +}, remap = false) public abstract class ArrayLightDataCacheMixin { @Dynamic @Inject(method = "get(III)I", at = @At("HEAD"), require = 0) diff --git a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/FlatLightPipelineMixin.java b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/FlatLightPipelineMixin.java index 2af8e58c..4ad1cac8 100644 --- a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/FlatLightPipelineMixin.java +++ b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/FlatLightPipelineMixin.java @@ -22,7 +22,10 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Pseudo -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.flat.FlatLightPipeline", remap = false) +@Mixin(targets = { + "me.jellysquid.mods.sodium.client.model.light.flat.FlatLightPipeline", + "net.caffeinemc.mods.sodium.client.model.light.flat.FlatLightPipeline" +}, remap = false) public abstract class FlatLightPipelineMixin { @Dynamic @Inject( diff --git a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/LightDataAccessMixin.java b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/LightDataAccessMixin.java index abd40fe4..4bb572f8 100644 --- a/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/LightDataAccessMixin.java +++ b/fabric/src/main/java/org/thinkingstudio/ryoamiclights/fabric/mixin/sodium/LightDataAccessMixin.java @@ -19,7 +19,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Pseudo -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess", remap = false) +@Mixin(targets = { + "me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess", + "net.caffeinemc.mods.sodium.client.model.light.data.LightDataAccess" +}, remap = false) public abstract class LightDataAccessMixin { @Dynamic @Inject(method = "getLightmap", at = @At("RETURN"), remap = false, require = 0, cancellable = true) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index d5f38023..1f90fccf 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -23,8 +23,7 @@ }, "mixins": [ "ryoamiclights.common.mixins.json", - "ryoamiclights.fabric.mixins.json", - "nightconfigfixes.mixins.json" + "ryoamiclights.fabric.mixins.json" ], "depends": { "fabric-api": "*", diff --git a/fabric/src/main/resources/nightconfigfixes.mixins.json b/fabric/src/main/resources/nightconfigfixes.mixins.json deleted file mode 100644 index dd5831c0..00000000 --- a/fabric/src/main/resources/nightconfigfixes.mixins.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "compatibilityLevel": "JAVA_17", - "package": "org.thinkingstudio.fork.nightconfigfixes.mixin", - "refmap": "nightconfigfixes.refmap.json", - "mixins": [ - "ConfigParserFabricMixin" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 4b3db6d7..619422ca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,22 +1,23 @@ org.gradle.jvmargs=-Xmx2G org.gradle.daemon=false -minecraft_version=1.21 +minecraft_version=1.21.1 enabled_platforms=fabric,neoforge -yarn_mappings=1.21+build.2 +yarn_mappings=1.21.1+build.3 mappings_patch=1.21+build.4 archives_base_name=RyoamicLights -mod_version=0.2.9 +mod_version=0.2.10 maven_group=org.thinkingstudio.ryoamiclights -fabric_loader_version=0.15.11 -fabric_api_version=0.100.3+1.21 +fabric_loader_version=0.16.2 +fabric_api_version=0.102.1+1.21.1 mod_menu_version=11.0.1 -neoforge_version=21.0.37-beta +neoforge_version=21.1.18 obsidianui_version=0.2.7+mc1.21 +azusaconfig_version=0.1.3+mc1.21.1 indium_version=1.0.33+mc1.21 modrinth_id=reCfnRvJ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48c0a02c..0d184210 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/CHANGELOG.md b/neoforge/CHANGELOG.md index 4ad1bdb6..dc52b9fc 100644 --- a/neoforge/CHANGELOG.md +++ b/neoforge/CHANGELOG.md @@ -1,3 +1,2 @@ ## Changelog -- update dependencies -- (Fabric) try fix nightconfig issue \ No newline at end of file +- update to 1.21.1 \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 8d3a12b6..a3c92bf0 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -7,26 +7,32 @@ loom { accessWidenerPath = project(":common").loom.accessWidenerPath } -project.archivesBaseName = rootProject.archivesBaseName + "-neoforge" - repositories { maven { url "https://maven.neoforged.net/releases/" } } configurations { - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + common { + canBeResolved = true + canBeConsumed = false + } compileClasspath.extendsFrom common runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common + developmentFabric.extendsFrom common + // Files in this configuration will be bundled into your mod using the Shadow plugin. + // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. + shadowBundle { + canBeResolved = true + canBeConsumed = false + } } dependencies { - neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" - modImplementation "maven.modrinth:obsidianui:${rootProject.obsidianui_version}-neoforge" + neoForge("net.neoforged:neoforge:${rootProject.neoforge_version}") + modImplementation("maven.modrinth:obsidianui:${rootProject.obsidianui_version}-neoforge") common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } + shadowBundle(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } } processResources { @@ -38,47 +44,13 @@ processResources { } shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] + configurations = [project.configurations.shadowBundle] archiveClassifier.set("dev-shadow") } remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier.set(null) -} - -jar { - archiveClassifier.set("dev") -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenNeoForge(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name - 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. - } + inputFile.set(shadowJar.archiveFile) + atAccessWideners.add("ryoamiclights.accesswidener") } publisher { @@ -93,7 +65,7 @@ publisher { setChangelog(file("CHANGELOG.md").getText("UTF-8")) setVersion("${rootProject.version}-neoforge") setDisplayName("[NeoForge] ${rootProject.version}") - setGameVersions("1.21") + setGameVersions("1.21", "1.21.1") setLoaders("neoforge") setCurseEnvironment("client") setArtifact(remapJar) diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForge.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForge.java index 1a64b91c..5c50b003 100644 --- a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForge.java +++ b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForge.java @@ -15,6 +15,7 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; @@ -28,14 +29,13 @@ @Mod(value = RyoamicLights.NAMESPACE, dist = Dist.CLIENT) public class RyoamicLightsNeoForge { - public RyoamicLightsNeoForge(IEventBus modEventBus) { + public RyoamicLightsNeoForge(ModContainer modContainer, IEventBus modEventBus) { IEventBus forgeEventBus = NeoForge.EVENT_BUS; - ModLoadingContext context = ModLoadingContext.get(); if (FMLLoader.getDist().isClient()) { RyoamicLights.get().clientInit(); - context.registerExtensionPoint(IConfigScreenFactory.class, () -> (client, screen) -> new SettingsScreen(screen)); + modContainer.registerExtensionPoint(IConfigScreenFactory.class, (container, screen) -> new SettingsScreen(screen)); forgeEventBus.addListener(EventPriority.HIGHEST, RenderLevelStageEvent.class, event -> { if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForgeMixinPlugin.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForgeMixinPlugin.java index b31f5126..40a814ad 100644 --- a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForgeMixinPlugin.java +++ b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/RyoamicLightsNeoForgeMixinPlugin.java @@ -24,9 +24,12 @@ public class RyoamicLightsNeoForgeMixinPlugin implements IMixinConfigPlugin { private final Object2BooleanMap conditionalMixins = new Object2BooleanOpenHashMap<>(); public RyoamicLightsNeoForgeMixinPlugin() { - boolean ltrInstalled = RyoamicLightsCompat.isLilTaterReloadedInstalled(); - this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.neoforge.mixin.ltr.LilTaterBlocksMixin", ltrInstalled); - this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.neoforge.mixin.ltr.LilTaterBlockEntityMixin", ltrInstalled); + if (RyoamicLightsCompat.isEmbeddiumInstalled() == false) { + boolean sodiumInstalled = RyoamicLightsCompat.isSodiumInstalled(); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.ArrayLightDataCacheMixin", sodiumInstalled); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.FlatLightPipelineMixin", sodiumInstalled); + this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.fabric.mixin.sodium.LightDataAccessMixin", sodiumInstalled); + } boolean forgifiedFabricApiInstalled = RyoamicLightsCompat.isFabricApiInstalled(); this.conditionalMixins.put("org.thinkingstudio.ryoamiclights.neoforge.mixin.fabricapi.AoCalculatorMixin", forgifiedFabricApiInstalled); diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/ltr/LilTaterBlockEntityMixin.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/ltr/LilTaterBlockEntityMixin.java deleted file mode 100644 index 984bbc48..00000000 --- a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/ltr/LilTaterBlockEntityMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright © 2020~2024 LambdAurora - * Copyright © 2024 ThinkingStudio - * - * This file is part of RyoamicLights. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package org.thinkingstudio.ryoamiclights.neoforge.mixin.ltr; - -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.collection.DefaultedList; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.thinkingstudio.ryoamiclights.util.LilTaterBlockEntityAccessor; - -@Pseudo -@Mixin(targets = "mods.ltr.entities.LilTaterBlockEntity") -public abstract class LilTaterBlockEntityMixin implements Inventory, LilTaterBlockEntityAccessor { - @Override - public boolean ryoamiclights$isEmpty() { - return this.isEmpty(); - } - - @Accessor(value = "items", remap = false) - public abstract DefaultedList ryoamiclights$getItems(); -} diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/ltr/LilTaterBlocksMixin.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/ltr/LilTaterBlocksMixin.java deleted file mode 100644 index dc4d478b..00000000 --- a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/ltr/LilTaterBlocksMixin.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright © 2020~2024 LambdAurora - * Copyright © 2024 ThinkingStudio - * - * This file is part of RyoamicLights. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package org.thinkingstudio.ryoamiclights.neoforge.mixin.ltr; - -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Dynamic; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.thinkingstudio.ryoamiclights.RyoamicLights; -import org.thinkingstudio.ryoamiclights.api.DynamicLightHandlers; -import org.thinkingstudio.ryoamiclights.util.LilTaterBlockEntityAccessor; - -@Pseudo -@Mixin(targets = "mods.ltr.registry.LilTaterBlocks", remap = false) -public class LilTaterBlocksMixin { - @Accessor("LIL_TATER_BLOCK_ENTITY") - private static BlockEntityType getLilTaterBlockEntity() { - throw new IllegalStateException("Accessor did not apply properly."); - } - - @Dynamic - @Inject(method = "init", at = @At("TAIL")) - private static void onInit(CallbackInfo ci) { - DynamicLightHandlers.registerDynamicLightHandler(getLilTaterBlockEntity(), entity -> { - int luminance = 0; - if (!((LilTaterBlockEntityAccessor) entity).ryoamiclights$isEmpty()) { - for (ItemStack item : ((LilTaterBlockEntityAccessor) entity).ryoamiclights$getItems()) { - luminance = Math.max(luminance, RyoamicLights.getLuminanceFromItemStack(item, !entity.getCachedState().getFluidState().isEmpty())); - } - } - return luminance; - }); - } -} diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/ArrayLightDataCacheMixin.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/ArrayLightDataCacheMixin.java new file mode 100644 index 00000000..c89fcf72 --- /dev/null +++ b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/ArrayLightDataCacheMixin.java @@ -0,0 +1,39 @@ +/* + * Copyright © 2020~2024 LambdAurora + * Copyright © 2024 ThinkingStudio + * + * This file is part of RyoamicLights. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package org.thinkingstudio.ryoamiclights.neoforge.mixin.sodium; + +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.thinkingstudio.ryoamiclights.RyoamicLights; +import org.thinkingstudio.ryoamiclights.util.SodiumDynamicLightHandler; + +@Pseudo +@Mixin(targets = { + "me.jellysquid.mods.sodium.client.model.light.data.ArrayLightDataCache", + "net.caffeinemc.mods.sodium.client.model.light.data.ArrayLightDataCache" +}, remap = false) +public abstract class ArrayLightDataCacheMixin { + @Dynamic + @Inject(method = "get(III)I", at = @At("HEAD"), require = 0) + private void ryoamiclights$storeLightPos(int x, int y, int z, CallbackInfoReturnable cir) { + if (!RyoamicLights.get().config.getDynamicLightsMode().isEnabled()) + return; + + // Store the current light position. + // This is possible under smooth lighting scenarios, because AoFaceData in Sodium runs a get() call + // before getting the lightmap. + SodiumDynamicLightHandler.pos.get().set(x, y, z); + } +} diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/FlatLightPipelineMixin.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/FlatLightPipelineMixin.java new file mode 100644 index 00000000..de572b33 --- /dev/null +++ b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/FlatLightPipelineMixin.java @@ -0,0 +1,46 @@ +/* + * Copyright © 2020~2024 LambdAurora + * Copyright © 2024 ThinkingStudio + * + * This file is part of RyoamicLights. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package org.thinkingstudio.ryoamiclights.neoforge.mixin.sodium; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.thinkingstudio.ryoamiclights.util.SodiumDynamicLightHandler; + +@Pseudo +@Mixin(targets = { + "me.jellysquid.mods.sodium.client.model.light.flat.FlatLightPipeline", + "net.caffeinemc.mods.sodium.client.model.light.flat.FlatLightPipeline" +}, remap = false) +public abstract class FlatLightPipelineMixin { + @Dynamic + @Inject( + method = "getOffsetLightmap", + at = @At(value = "RETURN", ordinal = 1), + require = 0, + remap = false, + locals = LocalCapture.CAPTURE_FAILHARD, + cancellable = true + ) + private void ryoamiclights$getLightmap( + BlockPos pos, Direction face, CallbackInfoReturnable cir, + int word, int adjWord + ) { + int lightmap = SodiumDynamicLightHandler.getLightmap(pos, adjWord, cir.getReturnValueI()); + cir.setReturnValue(lightmap); + } +} diff --git a/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/LightDataAccessMixin.java b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/LightDataAccessMixin.java new file mode 100644 index 00000000..7b878c23 --- /dev/null +++ b/neoforge/src/main/java/org/thinkingstudio/ryoamiclights/neoforge/mixin/sodium/LightDataAccessMixin.java @@ -0,0 +1,33 @@ +/* + * Copyright © 2020~2024 LambdAurora + * Copyright © 2024 ThinkingStudio + * + * This file is part of RyoamicLights. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package org.thinkingstudio.ryoamiclights.neoforge.mixin.sodium; + +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.thinkingstudio.ryoamiclights.util.SodiumDynamicLightHandler; + +@Pseudo +@Mixin(targets = { + "me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess", + "net.caffeinemc.mods.sodium.client.model.light.data.LightDataAccess" +}, remap = false) +public abstract class LightDataAccessMixin { + @Dynamic + @Inject(method = "getLightmap", at = @At("RETURN"), remap = false, require = 0, cancellable = true) + private static void ryoamiclights$getLightmap(int word, CallbackInfoReturnable cir) { + int lightmap = SodiumDynamicLightHandler.getLightmap(SodiumDynamicLightHandler.pos.get(), word, cir.getReturnValueI()); + cir.setReturnValue(lightmap); + } +} diff --git a/neoforge/src/main/resources/ryoamiclights.neoforge.mixins.json b/neoforge/src/main/resources/ryoamiclights.neoforge.mixins.json index a183c5b3..5031c33a 100644 --- a/neoforge/src/main/resources/ryoamiclights.neoforge.mixins.json +++ b/neoforge/src/main/resources/ryoamiclights.neoforge.mixins.json @@ -7,8 +7,9 @@ "ScreenMixin", "VideoOptionsScreenMixin", "fabricapi.AoCalculatorMixin", - "ltr.LilTaterBlockEntityMixin", - "ltr.LilTaterBlocksMixin" + "sodium.ArrayLightDataCacheMixin", + "sodium.FlatLightPipelineMixin", + "sodium.LightDataAccessMixin" ], "injectors": { "defaultRequire": 1