mirror of
https://github.com/CompeyDev/touch-grass-reminder.git
synced 2024-12-13 05:20:40 +00:00
feat: config screen & modmenu & mojmap
This commit is contained in:
parent
d0d2a7cdf2
commit
920efccfcb
10 changed files with 217 additions and 136 deletions
56
build.gradle
56
build.gradle
|
@ -11,45 +11,49 @@
|
||||||
group = project.maven_group
|
group = project.maven_group
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
// Add repositories to retrieve artifacts from in here.
|
mavenCentral()
|
||||||
// You should only use this when depending on other mods because
|
maven {
|
||||||
// Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
|
// For ImageIO
|
||||||
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
|
name "SonaType Maven"
|
||||||
// for more information about repositories.
|
url "https://oss.sonatype.org/content/repositories/snapshots"
|
||||||
|
}
|
||||||
|
|
||||||
|
maven {
|
||||||
|
// For YACL
|
||||||
|
name "Xander Maven"
|
||||||
|
url "https://maven.isxander.dev/releases"
|
||||||
|
}
|
||||||
|
|
||||||
|
maven {
|
||||||
|
// For quilt-parsers
|
||||||
|
name "QuiltMC Maven"
|
||||||
|
url "https://maven.quiltmc.org/repository/release"
|
||||||
|
}
|
||||||
|
|
||||||
|
maven {
|
||||||
|
// For modmenu
|
||||||
|
name "TerraformersMC Maven"
|
||||||
|
url "https://maven.terraformersmc.com/releases"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
// Loom and Loader both use this block in order to gather more information about your mod.
|
|
||||||
mods {
|
mods {
|
||||||
// This should match your mod id.
|
|
||||||
"touch_grass_warning" {
|
"touch_grass_warning" {
|
||||||
// Tell Loom about each source set used by your mod here. This ensures that your mod's classes are properly transformed by Loader.
|
|
||||||
sourceSet("main")
|
sourceSet("main")
|
||||||
// If you shade (directly include classes, not JiJ) a dependency into your mod, include it here using one of these methods:
|
|
||||||
// dependency("com.example.shadowedmod:1.2.3")
|
|
||||||
// configuration("exampleShadedConfigurationName")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// All the dependencies are declared at gradle/libs.version.toml and referenced with "libs.<id>"
|
|
||||||
// See https://docs.gradle.org/current/userguide/platforms.html for information on how version catalogs work.
|
|
||||||
dependencies {
|
dependencies {
|
||||||
minecraft libs.minecraft
|
minecraft libs.minecraft
|
||||||
mappings variantOf(libs.quilt.mappings) { classifier 'intermediary-v2' }
|
|
||||||
// Replace the above line with the block below if you want to use Mojang mappings as your primary mappings, falling back on QM for parameters and Javadocs
|
|
||||||
/*
|
|
||||||
mappings loom.layered {
|
mappings loom.layered {
|
||||||
mappings "org.quiltmc:quilt-mappings:${libs.versions.quilt.mappings.get()}:intermediary-v2"
|
mappings "org.quiltmc:quilt-mappings:${libs.versions.quilt.mappings.get()}:intermediary-v2"
|
||||||
officialMojangMappings()
|
officialMojangMappings()
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
modImplementation libs.quilt.loader
|
modImplementation libs.quilt.loader
|
||||||
|
|
||||||
// QSL is not a complete API; You will need Quilted Fabric API to fill in the gaps.
|
|
||||||
// Quilted Fabric API will automatically pull in the correct QSL version.
|
|
||||||
modImplementation libs.quilted.fabric.api
|
modImplementation libs.quilted.fabric.api
|
||||||
// modImplementation libs.bundles.quilted.fabric.api // If you wish to use Fabric API's deprecated modules, you can replace the above line with this one
|
modImplementation "dev.isxander.yacl:yet-another-config-lib-fabric:3.2.1+1.20"
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
|
@ -62,32 +66,22 @@ mappings variantOf(libs.quilt.mappings) { classifier 'intermediary-v2' }
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
tasks.withType(JavaCompile).configureEach {
|
||||||
it.options.encoding = 'UTF-8'
|
it.options.encoding = 'UTF-8'
|
||||||
// Minecraft 1.18 (1.18-pre2) upwards uses Java 17.
|
|
||||||
it.options.release = 17
|
it.options.release = 17
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
// Still required by IDEs such as Eclipse and Visual Studio Code
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_17
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_17
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
|
||||||
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task if it is present.
|
|
||||||
// If you remove this line, sources will not be generated.
|
|
||||||
withSourcesJar()
|
withSourcesJar()
|
||||||
|
|
||||||
// If this mod is going to be a library, then it should also generate Javadocs in order to aid with development.
|
|
||||||
// Uncomment this line to generate them.
|
|
||||||
// withJavadocJar()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If you plan to use a different file for the license, don't forget to change the file name here!
|
|
||||||
jar {
|
jar {
|
||||||
from('LICENSE') {
|
from('LICENSE') {
|
||||||
rename { "${it}_${base.archivesName.get()}" }
|
rename { "${it}_${base.archivesName.get()}" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure the maven publication
|
|
||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
mavenJava(MavenPublication) {
|
mavenJava(MavenPublication) {
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
[versions]
|
[versions]
|
||||||
# The latest versions are available at https://lambdaurora.dev/tools/import_quilt.html
|
|
||||||
minecraft = "1.20.1"
|
minecraft = "1.20.1"
|
||||||
quilt_mappings = "1.20.1+build.23"
|
quilt_mappings = "1.20.1+build.23"
|
||||||
quilt_loader = "0.22.1-beta.2"
|
quilt_loader = "0.22.1-beta.2"
|
||||||
|
|
||||||
quilted_fabric_api = "7.4.0+0.90.0-1.20.1"
|
quilted_fabric_api = "7.4.0+0.90.0-1.20.1"
|
||||||
|
|
||||||
|
mixin_extras = "0.2.0"
|
||||||
|
# twelvemonkeys_imageio = "3.10.0"
|
||||||
|
quilt_parsers = "0.2.1"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" }
|
minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" }
|
||||||
quilt_mappings = { module = "org.quiltmc:quilt-mappings", version.ref = "quilt_mappings" }
|
quilt_mappings = { module = "org.quiltmc:quilt-mappings", version.ref = "quilt_mappings" }
|
||||||
|
@ -14,7 +17,6 @@ quilt_loader = { module = "org.quiltmc:quilt-loader", version.ref = "quilt_loade
|
||||||
quilted_fabric_api = { module = "org.quiltmc.quilted-fabric-api:quilted-fabric-api", version.ref = "quilted_fabric_api" }
|
quilted_fabric_api = { module = "org.quiltmc.quilted-fabric-api:quilted-fabric-api", version.ref = "quilted_fabric_api" }
|
||||||
quilted_fabric_api_deprecated = { module = "org.quiltmc.quilted-fabric-api:quilted-fabric-api-deprecated", version.ref = "quilted_fabric_api" }
|
quilted_fabric_api_deprecated = { module = "org.quiltmc.quilted-fabric-api:quilted-fabric-api-deprecated", version.ref = "quilted_fabric_api" }
|
||||||
|
|
||||||
# If you have multiple similar dependencies, you can declare a dependency bundle and reference it on the build script with "libs.bundles.example".
|
|
||||||
[bundles]
|
[bundles]
|
||||||
quilted_fabric_api = ["quilted_fabric_api", "quilted_fabric_api_deprecated"]
|
quilted_fabric_api = ["quilted_fabric_api", "quilted_fabric_api_deprecated"]
|
||||||
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
package xyz.devcomp.touch_grass_warning.client;
|
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.toast.SystemToast;
|
|
||||||
import net.minecraft.client.toast.SystemToast.Type;
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
|
|
||||||
public class PlayDurationHandler implements Runnable {
|
|
||||||
MinecraftClient client;
|
|
||||||
SystemToast toast;
|
|
||||||
long startTime;
|
|
||||||
|
|
||||||
public PlayDurationHandler(MinecraftClient client, long startTime) {
|
|
||||||
this.client = client;
|
|
||||||
this.startTime = startTime;
|
|
||||||
|
|
||||||
this.toast = new SystemToast(Type.TUTORIAL_HINT, Text.literal("You've been playing for greater than 24 hours"),
|
|
||||||
Text.literal("Excessive gaming may interfere with normal daily life"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
TouchGrassWarningClient.LOGGER.info("Started playing Minecraft at: {}", this.startTime);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (System.currentTimeMillis() - this.startTime > 24 * 60 * 60 * 1000) {
|
|
||||||
TouchGrassWarningClient.LOGGER
|
|
||||||
.info("Player has spent more than 24 hours in Minecraft. Displaying warning.");
|
|
||||||
|
|
||||||
this.client.getToastManager().add(this.toast);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(10 * 1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -2,48 +2,55 @@
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import xyz.devcomp.touch_grass_warning.config.ConfigModel;
|
||||||
|
import xyz.devcomp.touch_grass_warning.utils.PlayDurationHandler;
|
||||||
|
|
||||||
import org.quiltmc.loader.api.ModContainer;
|
import org.quiltmc.loader.api.ModContainer;
|
||||||
import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer;
|
import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer;
|
||||||
import org.quiltmc.qsl.networking.api.client.ClientPlayConnectionEvents;
|
import org.quiltmc.qsl.networking.api.client.ClientPlayConnectionEvents;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import net.minecraft.client.network.ServerInfo;
|
import net.minecraft.client.multiplayer.ServerData;
|
||||||
|
|
||||||
public class TouchGrassWarningClient implements ClientModInitializer {
|
public class TouchGrassWarningClient implements ClientModInitializer {
|
||||||
public static final Logger LOGGER = LoggerFactory.getLogger("Touch Grass Warning");
|
public static final Logger LOGGER = LoggerFactory.getLogger("Touch Grass Warning");
|
||||||
private Thread t;
|
private ConfigModel config = new ConfigModel();
|
||||||
|
private Thread thread;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitializeClient(ModContainer mod) {
|
public void onInitializeClient(ModContainer mod) {
|
||||||
|
LOGGER.info("Touch Grass Warning init; isEnabled={}, reminderFrequency={}h", config.isEnabled, config.reminderFrequency);
|
||||||
LOGGER.info("Registering JOIN & DISCONNECT events...");
|
LOGGER.info("Registering JOIN & DISCONNECT events...");
|
||||||
|
|
||||||
ClientPlayConnectionEvents.JOIN.register((net, packet, client) -> {
|
if (config.isEnabled) {
|
||||||
UUID sessionId = net.getSessionId();
|
ClientPlayConnectionEvents.JOIN.register((net, packet, client) -> {
|
||||||
ServerInfo serverInfo = net.getServerInfo() == null ? new ServerInfo("Unknown", "Unknown", false)
|
UUID sessionId = net.getId();
|
||||||
: net.getServerInfo();
|
ServerData serverInfo = net.getServerData() == null ? new ServerData("Unknown", "Unknown", false)
|
||||||
|
: net.getServerData();
|
||||||
|
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
"Player initiated connection; sessionId={}, name={}, version={}, protocolVersion={}, isLocal={}, isOnline={}",
|
"Player initiated connection; sessionId={}, name={}, version={}, protocolVersion={}, isLocal={}",
|
||||||
sessionId, serverInfo.name, serverInfo.version, serverInfo.protocolVersion, serverInfo.isLocal(),
|
sessionId, serverInfo.name, serverInfo.version, serverInfo.protocol, serverInfo.isLan());
|
||||||
serverInfo.online);
|
|
||||||
|
|
||||||
PlayDurationHandler worker = new PlayDurationHandler(client, System.currentTimeMillis());
|
PlayDurationHandler worker = new PlayDurationHandler(client, System.currentTimeMillis(),
|
||||||
|
config.reminderFrequency * 60 * 60 * 1000);
|
||||||
|
|
||||||
t = new Thread(worker);
|
thread = new Thread(worker);
|
||||||
t.start();
|
thread.start();
|
||||||
|
|
||||||
LOGGER.info("Successfully started worker thread!");
|
LOGGER.info("Successfully started worker thread!");
|
||||||
});
|
});
|
||||||
|
|
||||||
ClientPlayConnectionEvents.DISCONNECT.register((net, client) -> {
|
ClientPlayConnectionEvents.DISCONNECT.register((net, client) -> {
|
||||||
LOGGER.info("Player initiated disconnection. Resetting grass touching timer.");
|
LOGGER.info("Player initiated disconnection. Resetting grass touching timer.");
|
||||||
|
|
||||||
if (!t.isInterrupted()) {
|
if (!thread.isInterrupted()) {
|
||||||
t.interrupt();
|
thread.interrupt();
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("Thread is already interrupted!");
|
LOGGER.warn("Thread is already interrupted!");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package xyz.devcomp.touch_grass_warning.config;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
||||||
|
import org.quiltmc.loader.api.QuiltLoader;
|
||||||
|
|
||||||
|
import dev.isxander.yacl3.config.v2.api.ConfigClassHandler;
|
||||||
|
import dev.isxander.yacl3.config.v2.api.serializer.GsonConfigSerializerBuilder;
|
||||||
|
|
||||||
|
public class ConfigHandler {
|
||||||
|
public static final ConfigClassHandler<ConfigModel> HANDLER = ConfigClassHandler.createBuilder(ConfigModel.class)
|
||||||
|
.id(new ResourceLocation("touchgrassreminder", "config"))
|
||||||
|
.serializer(config -> GsonConfigSerializerBuilder.create(config)
|
||||||
|
.setPath(QuiltLoader.getConfigDir().resolve("touch-grass-reminder.json"))
|
||||||
|
.setJson5(true)
|
||||||
|
.build())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
public Screen showGui(Screen parent) {
|
||||||
|
return HANDLER.generateGui().generateScreen(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package xyz.devcomp.touch_grass_warning.config;
|
||||||
|
|
||||||
|
import dev.isxander.yacl3.config.v2.api.SerialEntry;
|
||||||
|
import dev.isxander.yacl3.config.v2.api.autogen.*;
|
||||||
|
|
||||||
|
public class ConfigModel {
|
||||||
|
@SerialEntry(comment = "Whether the mod's functionality is enabled")
|
||||||
|
@AutoGen(category = "touch_grass_warning")
|
||||||
|
@TickBox
|
||||||
|
public boolean isEnabled = true;
|
||||||
|
|
||||||
|
@SerialEntry(comment = "Number of hours the warning should be displayed after")
|
||||||
|
@AutoGen(category = "touch_grass_warning")
|
||||||
|
@IntField(min = 1)
|
||||||
|
public int reminderFrequency = 24;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package xyz.devcomp.touch_grass_warning.integrations;
|
||||||
|
|
||||||
|
import org.quiltmc.loader.api.QuiltLoader;
|
||||||
|
|
||||||
|
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
|
||||||
|
import com.terraformersmc.modmenu.api.ModMenuApi;
|
||||||
|
|
||||||
|
import xyz.devcomp.touch_grass_warning.config.ConfigHandler;
|
||||||
|
|
||||||
|
public class ModMenuIntegration implements ModMenuApi {
|
||||||
|
@Override
|
||||||
|
public ConfigScreenFactory<?> getModConfigScreenFactory() {
|
||||||
|
return (parent) -> {
|
||||||
|
if (!QuiltLoader.isModLoaded("yet_another_config_lib_v3"))
|
||||||
|
return parent;
|
||||||
|
return new ConfigHandler().showGui(parent);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package xyz.devcomp.touch_grass_warning.utils;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.components.toasts.SystemToast;
|
||||||
|
import net.minecraft.client.gui.components.toasts.SystemToast.SystemToastIds;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import xyz.devcomp.touch_grass_warning.client.TouchGrassWarningClient;
|
||||||
|
|
||||||
|
public class PlayDurationHandler implements Runnable {
|
||||||
|
Minecraft client;
|
||||||
|
SystemToast toast;
|
||||||
|
long startTime;
|
||||||
|
int reminderFrequency; // In milliseconds, converted in onInitializeClient
|
||||||
|
|
||||||
|
public PlayDurationHandler(Minecraft client, long startTime, int reminderFrequency) {
|
||||||
|
this.client = client;
|
||||||
|
this.startTime = startTime;
|
||||||
|
|
||||||
|
this.toast = new SystemToast(SystemToastIds.TUTORIAL_HINT, Component.literal(String.format("You've been playing for greater than %d hours", reminderFrequency)),
|
||||||
|
Component.literal("Excessive gaming may interfere with normal daily life"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
TouchGrassWarningClient.LOGGER.info("Started playing Minecraft at: {}", this.startTime);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (System.currentTimeMillis() - this.startTime > this.reminderFrequency) {
|
||||||
|
TouchGrassWarningClient.LOGGER
|
||||||
|
.info("Player has spent more than 24 hours in Minecraft. Displaying warning.");
|
||||||
|
|
||||||
|
this.client.getToasts().addToast(toast);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Check every 10 minutes
|
||||||
|
Thread.sleep(10 * 60 * 1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"yacl3.config.touchgrassreminder:config.category.touch_grass_warning": "Touch Grass Reminder",
|
||||||
|
"yacl3.config.touchgrassreminder:config.isEnabled": "Enabled",
|
||||||
|
"yacl3.config.touchgrassreminder:config.isEnabled.desc.1": "Whether most of the mod's functionality is enabled",
|
||||||
|
"yacl3.config.touchgrassreminder:config.isEnabled.desc.2": "Takes effect on restart",
|
||||||
|
"yacl3.config.touchgrassreminder:config.reminderFrequency": "Reminder frequency",
|
||||||
|
"yacl3.config.touchgrassreminder:config.reminderFrequency.desc.1": "After how long the warning should appear (in hours)",
|
||||||
|
"yacl3.config.touchgrassreminder:config.reminderFrequency.desc.2": "Takes effect on restart"
|
||||||
|
}
|
|
@ -1,41 +1,47 @@
|
||||||
{
|
{
|
||||||
"schema_version": 1,
|
"schema_version": 1,
|
||||||
"quilt_loader": {
|
"quilt_loader": {
|
||||||
"group": "xyz.devcomp",
|
"group": "xyz.devcomp",
|
||||||
"id": "touch_grass_warning",
|
"id": "touch_grass_warning",
|
||||||
"version": "${version}",
|
"version": "${version}",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"name": "Touch Grass Warning",
|
"name": "Touch Grass Warning",
|
||||||
"description": "Client-side mod which warns players when they have been excessively playing Minecraft (more than 24 hours at a time).",
|
"description": "Client-side mod which warns players when they have been excessively playing Minecraft (more than 24 hours at a time).",
|
||||||
"contributors": {
|
"contributors": {
|
||||||
"Erica Marigold": "Owner"
|
"Erica Marigold": "Owner"
|
||||||
},
|
},
|
||||||
"contact": {
|
"contact": {
|
||||||
"homepage": "",
|
"homepage": "",
|
||||||
"issues": "https://github.com/CompeyDev/touch-grass-warning/issues",
|
"issues": "https://github.com/CompeyDev/touch-grass-warning/issues",
|
||||||
"sources": "https://github.com/CompeyDev/touch-grass-warning"
|
"sources": "https://github.com/CompeyDev/touch-grass-warning"
|
||||||
},
|
},
|
||||||
"license": "LGPL-3.0-only",
|
"license": "LGPL-3.0-only",
|
||||||
"icon": "assets/touch_grass_warning/icon.png"
|
"icon": "assets/touch_grass_warning/icon.png"
|
||||||
},
|
},
|
||||||
"intermediate_mappings": "net.fabricmc:intermediary",
|
"intermediate_mappings": "net.fabricmc:intermediary",
|
||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
"client_init": "xyz.devcomp.touch_grass_warning.client.TouchGrassWarningClient"
|
"client_init": "xyz.devcomp.touch_grass_warning.client.TouchGrassWarningClient",
|
||||||
},
|
"modmenu": "xyz.devcomp.touch_grass_warning.integrations.ModMenuIntegration"
|
||||||
"depends": [
|
},
|
||||||
{
|
"depends": [
|
||||||
"id": "quilt_loader",
|
{
|
||||||
"versions": ">=0.22.1-"
|
"id": "quilt_loader",
|
||||||
},
|
"versions": ">=0.22.1-"
|
||||||
{
|
},
|
||||||
"id": "quilted_fabric_api",
|
{
|
||||||
"versions": ">=7.4.0+0.90.0-"
|
"id": "quilted_fabric_api",
|
||||||
},
|
"versions": ">=7.4.0+0.90.0-"
|
||||||
{
|
},
|
||||||
"id": "minecraft",
|
{
|
||||||
"versions": "~1.20.1"
|
"id": "minecraft",
|
||||||
}
|
"versions": "~1.20.1"
|
||||||
]
|
},
|
||||||
},
|
|
||||||
"mixin": "touch_grass_warning.mixins.json"
|
{
|
||||||
|
"id": "yet_another_config_lib_v3",
|
||||||
|
"versions": ">=3.2.1+1.20-"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mixin": "touch_grass_warning.mixins.json"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue