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