diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 069f40f0..393b1ad2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,15 +7,19 @@ on: paths-ignore: - '**.md' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: + runs-on: ubuntu-22.04 + env: + CI: "true" strategy: + fail-fast: false matrix: - # Use these Java versions - java: [ - 21, # Current Java LTS - ] - runs-on: ubuntu-22.04 + platform: [fabric, neoforge, forge] steps: - name: Free up disk on GitHub runner run: | @@ -27,20 +31,19 @@ jobs: uses: actions/checkout@v4 - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - - name: setup jdk ${{ matrix.java }} + - name: setup jdk 21 uses: actions/setup-java@v4 with: - java-version: ${{ matrix.java }} - distribution: 'microsoft' + java-version: 21 + distribution: 'temurin' - name: make gradle wrapper executable run: chmod +x ./gradlew - - name: build - run: ./gradlew buildAndCollect+All + - name: Build ${{ matrix.platform }} + run: ./gradlew buildAndCollect+${{ matrix.platform }}+All -Pci_loader=${{ matrix.platform }} - name: capture build artifacts - if: ${{ matrix.java == '21' }} # Only upload artifacts built from latest java uses: actions/upload-artifact@v4 with: name: Artifacts path: | build/libs/ - /build/reports/tests/test/** + /build/reports/tests/test/** \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0bc61c5f..29647352 100644 --- a/.gitignore +++ b/.gitignore @@ -31,8 +31,11 @@ bin/ # mossy runs/ -libs/ +/libs/ +/runs-tests/ personal/ +versions/*/.fabric/ +user-images/ # java diff --git a/CHANGELOG.md b/CHANGELOG.md index d12501b3..18695a2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,4 @@ -# v1.2.3 Update - -## Misc -- Ported to 1.21.9+ - -## Fixes -- Fixed some issues with leashing mobs -- Fixed *wrong* min/max sound pitch id options in custom animations, now you can use both `min_pitch` and `minPitch`. \ No newline at end of file +- Fixed crash on game startup +- Fixes crash after patting any entity on server with NeoForge +- Fixed compatibility with amecs mod +- Fixed patting with "Toggle Shift" option enabled \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4f3940e9..0f05b3cb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,140 +1,227 @@ -import net.lopymine.mossy.MossyPlugin +import net.lopymine.utils.MossyUtils plugins { - id("net.lopymine.mossy-plugin") + id "net.lopymine.mossy-plugin-core" version "$mossy_plugin_version" } mossyDependencies { - def mcVersion = stonecutter.current.version.toString() - minecraft = mcVersion - mappings = prop("build.yarn") + minecraft = stonecutter.current.project.substring(stonecutter.current.project.indexOf("-") + 1) lombok = prop("base.lombok_version") + fabricApi = prop("build.fabric_api") fabricLoader = prop("build.fabric_loader") + forge = prop("build.forge") + + neoForge = prop("build.neoforge") + parchment = prop("build.parchment") + + if (sc.current.project.startsWith("forge-") && sc.current.version.toString() == "1.20.1") { + disableMixinAp = "true" + } + additional { - // - By default, every additional project dependency ("dep.modId" from gradle.properties) will use - // - Modrinth Maven and "modImplementation" configuration name - // - If you want to override mod configuration name, you can do this: - // override("modCompileOnly", "just_mod_id") - // - It will do this: - // - modImplementation("maven.modrinth:modId:version") -> modCompileOnly("maven.modrinth:modId:version") - // - Or if you want to disable it and handle by yourself, just disable it auto handling: - // disable("just_mod_id") - - override("modCompileOnly", "flashback") - override("modCompileOnly", "replaymod") - - // Fabric Permissions Api + override("mossyCompileOnly", "flashback") + override("mossyCompileOnly", "replaymod") + if (sc.current.project.startsWith("fabric-") && sc.current.version.toString() == "1.17") { + disable("iris") + } else { + override("mossyCompileOnly", "iris") + } + override("mossyCompileOnly", "sodium") + override("mossyCompileOnly", "controlling") + override("mossyCompileOnly", "searchables") + override("mossyCompileOnly", "cloth-config") + override("mossyCompileOnly", "geckolib") + + if (sc.current.project == "neoforge-1.20.2" || sc.current.project == "neoforge-1.20.4") { + override("mossyCompileOnly", "yacl") + } + disable("fabric-permissions-api") - // Cloth-Config - disable("cloth-config") - // GeckoLib - disable("geckolib") - // ProxLib - disable("proxlib") - // Replay Mod } } -mossyResources { - //expandFiles = ["custom", "file", "patterns", "here"] -} +def fabric = sc.current.project.contains("fabric") +def forge = sc.current.project.startsWith("forge-") repositories { maven { - name = "Cloth Config" - url = "https://maven.shedaniel.me/" - } // Cloth Config + name = "Sinytra" + url = "https://maven.su5ed.dev/releases" + } + flatDir { + dir 'libs' + } +} - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } // Replay Mod +dependencies { + if (fabric) { + def fpa = prop("build.fabric-permissions-api") + if (fpa != "unknown") { + mossyInclude(mossyImplementation("me.lucko:fabric-permissions-api:${fpa}")){ + exclude(group: "net.fabricmc.fabric-api") + } + } - maven { - name = 'GeckoLib' - url = 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' - content { - includeGroupByRegex("software\\.bernie.*") - includeGroup("com.eliotlash.mclib") - includeGroup("com.eliotlash.molang") + testImplementation("net.fabricmc:fabric-loader-junit:${prop("build.fabric_loader")}") + if (sc.current.project.startsWith("fabric-") && sc.current.version.toString() == "1.17") { + mossyImplementation("iris:iris-mc1.17-1.1.1") + } + } + + if (!fabric) { + testImplementation("org.junit.jupiter:junit-jupiter:5.11.4") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + } + + if (forge) { + annotationProcessor("net.fabricmc:sponge-mixin:0.16.5+mixin.0.8.7") + + if (stonecutter.compare(stonecutter.current.version.toString(), "1.18") < 0) { + compileOnly("org.jetbrains:annotations:23.0.0") } } } -dependencies { - def mcVersion = stonecutter.current.version.toString() - - mappings loom.officialMojangMappings() - - // Fabric permission api - def fpaVersion = prop("build.fabric-permissions-api") - include(modImplementation('me.lucko:fabric-permissions-api:' + fpaVersion)){ - exclude(group: "net.fabricmc.fabric-api") - } - - // Cloth Config - def clothConfigVersion = prop("dep.cloth-config") - modApi("me.shedaniel.cloth:cloth-config-fabric:${stonecutter.compare("1.19", mcVersion) == 1 ? clothConfigVersion : MossyPlugin.substringBefore(clothConfigVersion, "+")}") { - exclude(group: "net.fabricmc.fabric-api") - } - - // GeckoLib - def geckoLibVersion = prop("dep.geckolib") - if (geckoLibVersion != "unknown") { - if (mcVersion == "1.16.5") { - modCompileOnly("software.bernie.geckolib:geckolib-forge-${mcVersion}:${geckoLibVersion}") - } else if (mcVersion == "1.17.1") { - modCompileOnly("software.bernie.geckolib:geckolib-1.17.1-forge:${geckoLibVersion}") - } else if (mcVersion == "1.18.2") { - modCompileOnly("software.bernie.geckolib:geckolib-forge-1.18:${geckoLibVersion}") - } else if (mcVersion == "1.19.1" || mcVersion == "1.19.2") { - modCompileOnly("software.bernie.geckolib:geckolib-fabric-1.19:${geckoLibVersion}") - } else if (mcVersion == "1.20") { - modCompileOnly("software.bernie.geckolib:geckolib-fabric-1.20.1:${geckoLibVersion}") - } else { - modCompileOnly("software.bernie.geckolib:geckolib-fabric-${mcVersion}:${geckoLibVersion}") +test { + failOnNoDiscoveredTests = false + outputs.upToDateWhen { false } + if (!fabric) { + useJUnitPlatform { + excludeTags("gameTest") } } - testImplementation("net.fabricmc:fabric-loader-junit:${prop("build.fabric_loader")}") +} - def proxlibVersion = prop("dep.proxlib") - if (proxlibVersion != "unknown") { - include(modApi("maven.modrinth:proxlib:${proxlibVersion}")) +def registerGameTest = { String taskName, String tag, String taskDescription -> + tasks.register(taskName, Test) { + group = "verification" + description = taskDescription + + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath.filter { file -> !file.name.startsWith("fabric-loader-junit") } + + failOnNoDiscoveredTests = false + outputs.upToDateWhen { false } + useJUnitPlatform { + includeTags(tag) + } + testLogging { + showStandardStreams = true + } } } -// TODO: Добавить тесты на версию раньше, чем 1.18.2 -if (stonecutter.compare(stonecutter.current.version.toString(), "1.18.2") >= 0) { - test { - useJUnitPlatform() +registerGameTest("gameTest", "gameTest", "Runs all PatPat game tests") +registerGameTest("twoPlayersGameTest", "twoPlayersGameTest", "Runs the PatPat two players game test, spawning a dedicated server and two clients") +registerGameTest("singleplayerGameTest", "singleplayerGameTest", "Runs the PatPat singleplayer game test, spawning a single client") +registerGameTest("keybindingGameTest", "keybindingGameTest", "Runs the PatPat keybinding game test, rebinding the keybinding with real input") +registerGameTest("controllingGameTest", "controllingGameTest", "Runs the PatPat keybinding game test, but with Controlling mod, rebinding the keybinding with real input") +registerGameTest("shadersGameTest", "shadersGameTest", "Runs the PatPat shaders game test, launching with the configured mods and shader packs") + +if (project.hasProperty("patpat.test.port")) { + tasks.withType(JavaExec).configureEach { + jvmArgs("-Dpatpat.test.port=${project.property("patpat.test.port")}") + if (project.hasProperty("patpat.test.jvmargs")) { + jvmArgs(project.property("patpat.test.jvmargs").toString().split(" ").findAll { argument -> !argument.isEmpty() }) + } + maxHeapSize = "1g" } } -configurations.configureEach { - resolutionStrategy { - force("net.fabricmc:fabric-loader:${prop("build.fabric_loader")}") +if (fabric) { + if (stonecutter.compare(stonecutter.current.version.toString(), "1.18.2") >= 0) { + test { + useJUnitPlatform { + excludeTags("gameTest") + } + } + } + + loom.runConfigs.configureEach { config -> + if (config.getEnvironment() == "client") { + config.vmArg("-Dpatpat.debug=true") + } + } + + configurations.configureEach { + resolutionStrategy { + force("net.fabricmc:fabric-loader:${prop("build.fabric_loader")}") + } } } stonecutter { var buildTime = (int) (System.currentTimeMillis() / 10000) - 174611089 var buildCodeTime = String.format("%07x", buildTime & 0xFFFFFFF) - swap("build_code_time", "\"${buildCodeTime}\";") + + swaps["build_code_time"] = "\"${buildCodeTime}\";".toString() + dependencies["yacl"] = MossyUtils.substringBefore(prop("dep.yacl"), "+") + + replacements.string(current.parsed < "1.17") { + replace("ControllingOptionsScreenMixin", "ControllingOptionsScreenMixin") + replace("ControlsSettingsGuiNewMixin", "ControlsSettingsGuiNewMixin") + replace("ControllingOptionsScreen", "ControlsSettingsGuiNew") + } + + replacements.string(current.parsed < "1.18") { + replace("net.minecraftforge.network", "net.minecraftforge.fmllegacy.network") + replace("net.minecraftforge.event.server", "net.minecraftforge.fmlserverevents") + replace("net.minecraftforge.client.ClientRegistry", "net.minecraftforge.fmlclient.registry.ClientRegistry") + replace("ServerStartedEvent", "FMLServerStartedEvent") + replace("ServerStoppingEvent", "FMLServerStoppingEvent") + } + + replacements.string(current.parsed >= "1.18") { + replace("KeyBindsScreenAccessor", "KeyBindsScreenAccessor") + replace("KeyBindsScreenMixin", "KeyBindsScreenMixin") + replace("NewKeyBindsScreen", "NewKeyBindsScreen") + replace("ControlsScreen", "KeyBindsScreen") + } + + + replacements.string(current.parsed >= "1.21") { + replace("import net.minecraft.client.gui.screens.controls.*;", "import net.minecraft.client.gui.screens.options.controls.*;") + } + + replacements.string(current.parsed >= "1.21.9") { + replace("int keyCode, int scanCode, int modifiers", "net.minecraft.client.input.KeyEvent event") + replace("double mouseX, double mouseY, int button", "net.minecraft.client.input.MouseButtonEvent event, boolean bl") + } + + replacements.string(current.parsed >= "1.21.11") { + replace("ProxPacketIdentifier", "ProxPacketIdentifier") + replace("ResourceLocation", "Identifier") + replace(".location()", ".identifier()") + replace("RenderType", "RenderTypes") + } + + replacements.string(current.parsed >= "26.1") { + replace("net.minecraft.client.gui.GuiGraphics", "net.minecraft.client.gui.GuiGraphicsExtractor") + replace("GuiGraphics", "GuiGraphicsExtractor") + } } +stonecutter.filters.exclude("**/*.accesswidener") +stonecutter.filters.exclude("**/*.cfg") +stonecutter.filters.exclude("**/*.classTweaker") + +// TODO: Сделать, чтобы таска один раз запускалась, а не на каждую версию +tasks.register("submodulesUpdate", Exec) { + commandLine = ["git", "submodule", "update", "--init", "--force", "--remote"] +} jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } +def modId = prop("data.mod_id") processResources { from("../../patpat-languages-files/lang") { - into "assets/${prop("data.mod_id")}/lang/" + into "assets/${modId}/lang/" eachFile { file -> if (!file.isDirectory()) { - // Client requires lang files in lower case file.name = file.name.toLowerCase() } } @@ -143,4 +230,4 @@ processResources { String prop(String key) { return findProperty(key).toString() -} +} \ No newline at end of file diff --git a/buildSettings/build.gradle b/buildSettings/build.gradle deleted file mode 100644 index b703c9c6..00000000 --- a/buildSettings/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -plugins { - id 'java' - id 'java-gradle-plugin' -} - -def mainModuleId = property("main_module_id").toString() -def pluginMavenPackage = property("plugin_maven_package").toString() -def pluginPackage = property("plugin_package").toString() -def pluginClass = property("plugin_class").toString() -def pluginVersion = property("plugin_version").toString() - -group = pluginPackage -version = pluginVersion - -repositories { - mavenLocal() - mavenCentral() - gradlePluginPortal() - maven { - name "Fabric" - url "https://maven.fabricmc.net/" - } - maven { - name "Kiku Snapshots" - url "https://maven.kikugie.dev/snapshots" - } - maven { - name "Kiku Releases" - url "https://maven.kikugie.dev/releases" - } -} - -dependencies { - compileOnly "org.projectlombok:lombok:${property("lombok_version")}" - annotationProcessor "org.projectlombok:lombok:${property("lombok_version")}" - - implementation "com.google.code.gson:gson:${property("gson_version")}" - - implementation "dev.kikugie.stonecutter:dev.kikugie.stonecutter.gradle.plugin:${property("stonecutter_version")}" -} - -test { - useJUnitPlatform() -} -gradlePlugin { - plugins { - create(mainModuleId) { - id = "${pluginMavenPackage}.${mainModuleId}" - implementationClass = "${pluginPackage}.${pluginClass}" - } - } -} diff --git a/buildSettings/gradle.properties b/buildSettings/gradle.properties deleted file mode 100644 index 939734eb..00000000 --- a/buildSettings/gradle.properties +++ /dev/null @@ -1,13 +0,0 @@ -# Gradle Plugin properties - -# Plugin Properties -main_module_id = mossy-settings-plugin -plugin_maven_package = net.lopymine -plugin_package = net.lopymine.mossy.settings -plugin_class = MossySettingsPlugin -plugin_version = 1.0.0 - -# Dependencies -lombok_version = 1.18.42 -gson_version = 2.13.1 -stonecutter_version = 0.7.1 \ No newline at end of file diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/MossySettingsPlugin.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/MossySettingsPlugin.java deleted file mode 100644 index a4cb657a..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/MossySettingsPlugin.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.lopymine.mossy.settings; - -import java.io.*; -import java.util.*; -import lombok.Getter; -import net.lopymine.mossy.settings.manager.*; -import org.gradle.api.*; - -import org.gradle.api.initialization.Settings; -import org.jetbrains.annotations.NotNull; - -@Getter -public class MossySettingsPlugin implements Plugin { - - @Override - public void apply(@NotNull Settings settings) { - Properties gradleProperties = getGradleProperties(settings.getRootDir()); - - settings.getRootProject().setName(getProperty(gradleProperties, "data.mod_name")); - - List additionalDependencies = getAdditionalDependencies(gradleProperties); - if (additionalDependencies.isEmpty()) { - System.out.println("No additional dependencies!"); - } else { - System.out.println("Found additional dependencies: [%s]".formatted(String.join(", ", additionalDependencies))); - } - - List multiVersions = getMultiVersions(gradleProperties); - - System.out.println("Found MC versions: [%s]".formatted(String.join(", ", multiVersions))); - - StonecutterManager.apply(settings, multiVersions); - AccessWidenerManager.apply(settings, multiVersions); - VersionedGradlePropertiesManager.apply(settings, gradleProperties, multiVersions, additionalDependencies); - } - - public List getAdditionalDependencies(Properties properties) { - List additionalDepends = new ArrayList<>(); - - for (Map.Entry entry : properties.entrySet()) { - String key = entry.getKey().toString(); - if (key.startsWith("dep.")) { - int i = key.indexOf(".") + 1; - String modId = key.substring(i); - additionalDepends.add(modId); - } - } - - return additionalDepends; - } - - public static List getMultiVersions(Properties gradleProperties) { - String multiVersions = getProperty(gradleProperties, "multi_versions"); - - List versions = new ArrayList<>(); - - for (String s : multiVersions.split(" ")) { - int index = s.indexOf("["); - if (index == -1) { - versions.add(s); - } else { - versions.add(s.substring(0, index)); - } - } - - return versions; - } - - public static String getProperty(Properties gradleProperties, String id) { - if (!gradleProperties.containsKey(id)) { - throw new IllegalArgumentException("Missing important property with id \"%s\" !".formatted(id)); - } - return gradleProperties.get(id).toString(); - } - - public static @NotNull Properties getGradleProperties(File project) { - Properties properties = new Properties(); - try (FileReader reader = new FileReader(project.toPath().resolve("gradle.properties").toFile())) { - properties.load(reader); - } catch (Exception e) { - throw new RuntimeException(e); - } - return properties; - } - -} diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/api/FabricDependenciesAPI.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/api/FabricDependenciesAPI.java deleted file mode 100644 index 66cf72ca..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/api/FabricDependenciesAPI.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.lopymine.mossy.settings.api; - -public class FabricDependenciesAPI { - - public static String getYarnVersion(String minecraftVersion) { - try { - return JsonHelper.get("https://meta.fabricmc.net/v2/versions/yarn/%s?limit=1".formatted(minecraftVersion)) - .getAsJsonArray() - .get(0) - .getAsJsonObject() - .get("version") - .getAsString(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - -} diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/api/JsonHelper.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/api/JsonHelper.java deleted file mode 100644 index 2291f5f7..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/api/JsonHelper.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lopymine.mossy.settings.api; - -import com.google.gson.*; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import java.io.*; -import java.net.*; -import java.nio.charset.StandardCharsets; - - -public class JsonHelper { - - public static JsonElement get(String url) throws Exception { - URI uri = URI.create(url); - HttpURLConnection connection = (HttpURLConnection) uri.toURL().openConnection(); - connection.setRequestMethod("GET"); - JsonReader jsonReader = new JsonReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); - return new Gson().fromJson(jsonReader, TypeToken.get(JsonElement.class)); - } - -} diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/api/ModrinthDependenciesAPI.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/api/ModrinthDependenciesAPI.java deleted file mode 100644 index 3e61dc32..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/api/ModrinthDependenciesAPI.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lopymine.mossy.settings.api; - -import com.google.gson.*; -import java.io.*; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import org.jetbrains.annotations.NotNull; - -public class ModrinthDependenciesAPI { - - @NotNull - public static String getVersion(String modId, String minecraftVersion, String loader) { - String encodedLoader = URLEncoder.encode("[\"%s\"]".formatted(loader), StandardCharsets.UTF_8); - String encodedMinecraftVersion = URLEncoder.encode("[\"%s\"]".formatted(minecraftVersion), StandardCharsets.UTF_8); - String url = "https://api.modrinth.com/v2/project/%s/version?loaders=%s&game_versions=%s".formatted(modId, encodedLoader, encodedMinecraftVersion); - JsonElement element; - try { - element = JsonHelper.get(url); - } catch (FileNotFoundException e) { - System.out.printf("\nFailed to find Modrinth project with id \"%s\"%n", modId); - e.printStackTrace(System.out); - return "unknown"; - } catch (Exception e) { - e.printStackTrace(System.out); - return "unknown"; - } - JsonArray array = element.getAsJsonArray(); - if (array.isEmpty()) { - return "unknown"; - } - JsonElement jsonElement = array.get(0); - JsonObject jsonObject = jsonElement.getAsJsonObject(); - - return jsonObject.get("version_number").getAsString(); - } - -} diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/AccessWidenerManager.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/AccessWidenerManager.java deleted file mode 100644 index 8aa33bbf..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/AccessWidenerManager.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.lopymine.mossy.settings.manager; - -import java.io.*; -import java.nio.file.Path; -import java.util.List; -import org.gradle.api.initialization.Settings; -import org.jetbrains.annotations.*; - -public class AccessWidenerManager { - - public static void apply(@NotNull Settings settings, List multiVersions) { - Path path = settings.getRootDir().toPath(); - for (String version : multiVersions) { - createExampleAccessWidener(path, version); - } - } - - public static void createExampleAccessWidener(Path rootProject, String version) { - File awFile = createAWFile(rootProject, version); - if (awFile == null) { - return; - } - - try (FileWriter writer = new FileWriter(awFile)) { - writer.write("accessWidener v2 named\n"); - writer.write("# " + version + " AW\n"); - } catch (Exception e) { - throw new RuntimeException(e); - } - - System.out.println("Successfully created AW for " + version); - } - - @Nullable - private static File createAWFile(Path rootProject, String version) { - Path awsFolder = rootProject.resolve("src/main/resources/aws/"); - File awsFolderFile = awsFolder.toFile(); - if (!awsFolderFile.exists() && !awsFolderFile.mkdirs()) { - System.out.println("Failed to get or create AW folder for " + version); - return null; - } - - File versionedAWFile = awsFolder.resolve(version + ".accesswidener").toFile(); - if (versionedAWFile.exists()) { - return null; - } - - try { - if (!versionedAWFile.createNewFile()) { - System.out.println("Failed to create AW file for " + version); - return null; - } - } catch (Exception e) { - throw new RuntimeException(e); - } - - return versionedAWFile; - } -} diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/StonecutterManager.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/StonecutterManager.java deleted file mode 100644 index 8277af33..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/StonecutterManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.lopymine.mossy.settings.manager; - -import dev.kikugie.stonecutter.settings.StonecutterSettingsExtension; -import java.util.List; -import org.gradle.api.initialization.Settings; -import org.jetbrains.annotations.NotNull; - -public class StonecutterManager { - - public static void apply(@NotNull Settings settings, List versions) { - StonecutterSettingsExtension stonecutter = settings.getExtensions().getByType(StonecutterSettingsExtension.class); - stonecutter.create(settings.getRootProject(), (builder) -> { - builder.versions(versions); - builder.getVcsVersion().set(versions.get(versions.size() - 1)); - }); - } - -} diff --git a/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/VersionedGradlePropertiesManager.java b/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/VersionedGradlePropertiesManager.java deleted file mode 100644 index c3e46f08..00000000 --- a/buildSettings/src/main/java/net/lopymine/mossy/settings/manager/VersionedGradlePropertiesManager.java +++ /dev/null @@ -1,186 +0,0 @@ -package net.lopymine.mossy.settings.manager; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.util.*; -import java.util.function.*; -import net.lopymine.mossy.settings.api.*; -import org.gradle.api.initialization.Settings; -import org.jetbrains.annotations.NotNull; - -public class VersionedGradlePropertiesManager { - - public static void apply(@NotNull Settings settings, Properties gradleProperties, List multiVersions, List additionalDependencies) { - Path path = settings.getRootDir().toPath(); - - for (String version : multiVersions) { - try { - createGradleProperties( - path, - version, - additionalDependencies, - gradleProperties, - (modId, ver) -> ModrinthDependenciesAPI.getVersion(modId, version, "fabric"), - FabricDependenciesAPI::getYarnVersion - ); - } catch (Exception e) { - throw new RuntimeException("Failed to create versioned gradle properties for " + version + ", reason: " + e.getMessage(), e); - } - } - } - - public static void createGradleProperties(Path rootPath, String version, List additionalDependencies, Properties rootGradleProperties, BiFunction dependResolver, Function yarnResolver) throws IOException { - File file = getOrCreateGradlePropertiesFile(rootPath, version); - if (file == null) { - return; - } - - Properties gradleProperties = new Properties(); - try (InputStream in = new FileInputStream(file)) { - gradleProperties.load(in); - } - - String fileText = Files.readString(file.toPath(), StandardCharsets.UTF_8); - boolean isEmpty = fileText.isBlank(); - - List missingDependencies = new ArrayList<>(); - for (String id : additionalDependencies) { - String key = "dep." + id; - String markerVal = rootGradleProperties.getProperty(key); - if (!"[VERSIONED]".equals(markerVal)) { - continue; - } - if (!gradleProperties.containsKey(key)) { - missingDependencies.add(id); - } - } - - List oldDependencies = new ArrayList<>(); - for (String key : gradleProperties.stringPropertyNames()) { - if (!key.startsWith("dep.")) { - continue; - } - String markerVal = rootGradleProperties.getProperty(key); - if (markerVal != null && !"[VERSIONED]".equals(markerVal)) { - oldDependencies.add(key); - continue; - } - String shortId = substringSince(key, "."); - if (!additionalDependencies.contains(shortId)) { - oldDependencies.add(key); - } - } - - boolean update = fileText.replace(" ", "").contains("=[UPDATE]"); - - if (!isEmpty && !update && missingDependencies.isEmpty() && oldDependencies.isEmpty()) { - return; - } - - if (isEmpty) { - StringBuilder builder = new StringBuilder(); - builder.append("# Versioned Properties\n"); - builder.append("# Tip: You can set any dependency value to \"[UPDATE]\"\n"); - builder.append("# and reload Gradle to update only it's value.\n\n"); - builder.append("# Fabric Properties, check https://fabricmc.net/develop/\n"); - builder.append("build.yarn=").append(yarnResolver.apply(version)).append("\n"); - builder.append("build.fabric_api=").append(dependResolver.apply("fabric-api", version)); - if (!additionalDependencies.isEmpty()) { - builder.append("\n\n"); - builder.append("# Additional Dependencies Properties\n"); - for (String depend : additionalDependencies) { - builder.append("# ").append(depend).append(", check https://modrinth.com/mod/").append(depend).append("/versions?g=").append(version).append("&l=fabric\n"); - builder.append("dep.").append(depend).append("=").append(dependResolver.apply(depend, version)).append("\n"); - } - } - Files.writeString(file.toPath(), builder.toString(), StandardCharsets.UTF_8); - System.out.println("Successfully created gradle.properties for " + version); - return; - } - - if (update) { - String text = fileText.replace(" ", "ㅤ").trim(); - for (String key : gradleProperties.stringPropertyNames()) { - String value = gradleProperties.getProperty(key); - if (!"[UPDATE]".equals(value)) { - continue; - } - String oldLine = key + "=[UPDATE]"; - String updatedLine = null; - if (key.startsWith("dep.")) { - String depId = substringSince(key, "."); - updatedLine = key + "=" + dependResolver.apply(depId, version); - } else if (key.startsWith("build.")) { - String buildProp = substringSince(key, "."); - if ("yarn".equals(buildProp)) { - updatedLine = key + "=" + yarnResolver.apply(version); - } else if ("fabric_api".equals(buildProp)) { - updatedLine = key + "=" + dependResolver.apply("fabric-api", version); - } - } - if (updatedLine == null) { - continue; - } - text = text.replace(oldLine, updatedLine); - } - String finalText = text.replace("ㅤ", " "); - Files.writeString(file.toPath(), finalText, StandardCharsets.UTF_8); - System.out.println("Successfully updated gradle.properties for " + version); - } - - if (!missingDependencies.isEmpty()) { - String text = Files.readString(file.toPath(), StandardCharsets.UTF_8); - if (!text.endsWith("\n")) text = text + "\n"; - StringBuilder builder = new StringBuilder(text); - for (String depend : missingDependencies) { - builder.append("# ").append(depend).append(", check https://modrinth.com/mod/").append(depend).append("/versions?g=").append(version).append("&l=fabric\n"); - builder.append("dep.").append(depend).append("=").append(dependResolver.apply(depend, version)).append("\n"); - } - Files.writeString(file.toPath(), builder.toString(), StandardCharsets.UTF_8); - System.out.println("Successfully added new depends " + missingDependencies + " to gradle.properties for " + version); - } - - if (!oldDependencies.isEmpty()) { - String text = Files.readString(file.toPath(), StandardCharsets.UTF_8); - List removed = new ArrayList<>(); - for (String fullKey : oldDependencies) { - String dep = substringSince(fullKey, "."); - String propValue = gradleProperties.getProperty(fullKey); - String block = "# " + dep + ", check https://modrinth.com/mod/" + dep + "/versions?g=" + version + "&l=fabric\n" + "dep." + dep + "=" + propValue + "\n"; - text = text.replace(block, ""); - removed.add(dep); - } - Files.writeString(file.toPath(), text, StandardCharsets.UTF_8); - System.out.println("Successfully removed old depends " + removed + " from gradle.properties for " + version); - } - } - - private static File getOrCreateGradlePropertiesFile(Path path, String version) { - try { - Path folder = path.resolve("versions/" + version); - File folderFile = folder.toFile(); - if (!folderFile.exists() && !folderFile.mkdirs()) { - System.out.println("Failed to get or create folder for " + version); - return null; - } - File gradlePropertiesFile = folder.resolve("gradle.properties").toFile(); - if (!gradlePropertiesFile.exists() && !gradlePropertiesFile.createNewFile()) { - System.out.println("Failed to get or create gradle.properties for " + version); - return null; - } - return gradlePropertiesFile; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @SuppressWarnings("all") - private static String substringSince(String text, String since) { - int index = text.indexOf(since); - if (index == -1) { - return text; - } - return text.substring(index + 1); - } -} diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle deleted file mode 100644 index ece3d838..00000000 --- a/buildSrc/build.gradle +++ /dev/null @@ -1,58 +0,0 @@ -plugins { - id 'java' - id 'java-gradle-plugin' -} - -def mainModuleId = property("main_module_id").toString() -def stonecutterModuleId = property("stonecutter_module_id").toString() -def pluginMavenPackage = property("plugin_maven_package").toString() -def pluginPackage = property("plugin_package").toString() -def pluginClass = property("plugin_class").toString() -def pluginVersion = property("plugin_version").toString() - -group = pluginPackage -version = pluginVersion - -repositories { - mavenLocal() - mavenCentral() - gradlePluginPortal() - maven { - name "Fabric" - url "https://maven.fabricmc.net/" - } - maven { - name "Kiku Snapshots" - url "https://maven.kikugie.dev/snapshots" - } - maven { - name "Kiku Releases" - url "https://maven.kikugie.dev/releases" - } -} - -dependencies { - compileOnly "org.projectlombok:lombok:${property("lombok_version")}" - annotationProcessor "org.projectlombok:lombok:${property("lombok_version")}" - - implementation "me.modmuss50.mod-publish-plugin:me.modmuss50.mod-publish-plugin.gradle.plugin:${property("mod_publish_plugin_version")}" - implementation "dev.kikugie.stonecutter:dev.kikugie.stonecutter.gradle.plugin:${property("stonecutter_version")}" - implementation "dev.kikugie.fletching-table:dev.kikugie.fletching-table.gradle.plugin:${property("fletching_table_version")}" - implementation "fabric-loom:fabric-loom.gradle.plugin:${property("fabric_loom_version")}" -} - -test { - useJUnitPlatform() -} -gradlePlugin { - plugins { - create(mainModuleId) { - id = "${pluginMavenPackage}.${mainModuleId}" - implementationClass = "${pluginPackage}.${pluginClass}" - } - create(stonecutterModuleId) { - id = "${pluginMavenPackage}.${stonecutterModuleId}" - implementationClass = "${pluginPackage}.${pluginClass}Stonecutter" - } - } -} diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties deleted file mode 100644 index 79333b89..00000000 --- a/buildSrc/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -# Gradle Plugin properties - -# Plugin Properties -main_module_id = mossy-plugin -stonecutter_module_id = mossy-plugin-stonecutter -plugin_maven_package = net.lopymine -plugin_package = net.lopymine.mossy -plugin_class = MossyPlugin - -plugin_version = 1.0.0 - -# Dependencies -lombok_version = 1.18.42 -mod_publish_plugin_version = 0.7.4 -stonecutter_version = 0.7.1 -fabric_loom_version = 1.11-SNAPSHOT -fletching_table_version = 0.1.0-alpha.17 \ No newline at end of file diff --git a/buildSrc/src/main/java/net/lopymine/mossy/MossyLogger.java b/buildSrc/src/main/java/net/lopymine/mossy/MossyLogger.java deleted file mode 100644 index 32dd3113..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/MossyLogger.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.lopymine.mossy; - -import org.gradle.api.Project; - -public class MossyLogger { - - private Project project; - - public void setup(Project project) { - this.project = project; - } - - @SuppressWarnings("all") - public void log(String text, Object... objects) { - System.out.println("[Mossy/%s] %s".formatted(this.project.getName(), text.formatted(objects))); - } - - @SuppressWarnings("all") - public void logModule(String module, String text, Object... objects) { - System.out.println("[Mossy/%s/%s] %s".formatted(this.project.getName(), module, text.formatted(objects))); - } - -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/MossyPlugin.java b/buildSrc/src/main/java/net/lopymine/mossy/MossyPlugin.java deleted file mode 100644 index 3e9d27cd..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/MossyPlugin.java +++ /dev/null @@ -1,312 +0,0 @@ -package net.lopymine.mossy; - -import dev.kikugie.stonecutter.build.StonecutterBuildExtension; -import lombok.Getter; -import me.modmuss50.mpp.ModPublishExtension; -import org.gradle.api.*; -import org.gradle.api.plugins.*; -import org.gradle.api.tasks.*; -import org.gradle.jvm.tasks.Jar; - -import net.fabricmc.loom.api.LoomGradleExtensionAPI; -import net.fabricmc.loom.task.RemapJarTask; - -import net.lopymine.mossy.manager.*; -import net.lopymine.mossy.multi.MultiVersion; -import net.lopymine.mossy.tasks.*; - -import java.io.*; -import java.nio.file.Files; -import java.util.*; -import java.util.Map.Entry; -import org.jetbrains.annotations.NotNull; - -@Getter -public class MossyPlugin implements Plugin { - - public static final MossyLogger LOGGER = new MossyLogger(); - - private MultiVersion projectMultiVersion; - private int javaVersionIndex; - private JavaVersion javaVersion; - - @Override - public void apply(@NotNull Project project) { - LOGGER.setup(project); - - // - - PluginContainer plugins = project.getPlugins(); - plugins.apply("dev.kikugie.stonecutter"); - plugins.apply("fabric-loom"); - plugins.apply("me.modmuss50.mod-publish-plugin"); - plugins.apply("dev.kikugie.fletching-table"); - - // - - this.projectMultiVersion = MossyPlugin.getProjectMultiVersion(project); - this.javaVersionIndex = MossyPlugin.getJavaVersion(project); - this.javaVersion = JavaVersion.toVersion(this.javaVersionIndex); - - // - - MossyPlugin.configureProject(project, this); - - MossyJavaManager.apply(project,this); - MossyJ52JManager.apply(project); - MossyProcessResourcesManager.apply(project, this); - - MossyDependenciesManager.apply(project); - MossyStonecutterManager.apply(project, this); - - // - - MossyPlugin.configureExtensions(project, this); - MossyPlugin.configureTasks(project, this); - - LOGGER.log("Project Version: %s", project.getVersion()); - LOGGER.log("Java Version: %s", this.javaVersionIndex); - } - - private static void configureExtensions(@NotNull Project project, MossyPlugin plugin) { - project.getExtensions().configure(LoomGradleExtensionAPI.class, (loom) -> { - MossyLoomManager.apply(project, plugin, loom); - }); - - project.getExtensions().configure(ModPublishExtension.class, (mpe) -> { - MossyModPublishManager.apply(project, plugin, mpe); - }); - } - - private static void configureTasks(@NotNull Project project, MossyPlugin plugin) { - project.getTasks().register("generatePublishWorkflowsForEachVersion", GeneratePublishWorkflowsForEachVersionTask.class, (task) -> { - task.setGroup("mossy"); - }); - project.getTasks().register("generatePersonalProperties", GeneratePersonalPropertiesTask.class, (task) -> { - task.setGroup("mossy"); - }); - project.getTasks().register("regenerateRunConfigurations", Delete.class, (task) -> { - task.setGroup("mossy"); - String version = plugin.getProjectMultiVersion().projectVersion(); - task.delete(getRootFile(project, ".idea/runConfigurations/Minecraft_Client___%s__%s.xml".formatted(version.replace(".", "_"), version))); - task.delete(getRootFile(project, ".idea/runConfigurations/Minecraft_Server___%s__%s.xml".formatted(version.replace(".", "_"), version))); - task.finalizedBy("ideaSyncTask"); - }); - project.getTasks().register("rebuildLibs", Delete.class, task -> { - task.setGroup("build"); - String modName = getProperty(project, "data.mod_name").replace(" ", ""); - String version = project.getVersion().toString(); - - String jarFileName = "libs/%s-%s.jar".formatted(modName, version); - String sourcesJarFileName = "libs/%s-%s-sources.jar".formatted(modName, version); - - task.delete(getRootFile(project, jarFileName)); - task.delete(project.getLayout().getBuildDirectory().file(jarFileName)); - task.delete(project.getLayout().getBuildDirectory().file(sourcesJarFileName)); - }); - project.getTasks().named("build", task -> { - task.mustRunAfter("rebuildLibs"); - }); - project.getTasks().register("buildAndCollect", Copy.class, task -> { - task.setGroup("build"); - task.dependsOn("rebuildLibs", "build"); - task.from(((RemapJarTask) project.getTasks().getByName("remapJar")).getArchiveFile().get()); - task.into(getRootFile(project, "libs/")); - }); - for (String publishTask : List.of("publishModrinth", "publishCurseforge")) { - project.getTasks().named(publishTask).configure((task) -> { - task.doLast((t) -> { - try { - Thread.sleep(1000L); - } catch (Exception e) { - MossyPlugin.LOGGER.log("Failed to wait before publishing!"); - e.printStackTrace(); - } - }); - }); - } - } - - private static void configureProject(@NotNull Project project, MossyPlugin plugin) { - String projectVersion = plugin.getMossyProjectVersion(project); - String mavenGroup = getProperty(project, "data.mod_maven_group"); - project.setVersion(projectVersion); - project.setGroup(mavenGroup); - - BasePluginExtension base = project.getExtensions().getByType(BasePluginExtension.class); - base.getArchivesName().set(getProperty(project, "data.mod_name").replace(" ", "")); - - Jar jar = (Jar) project.getTasks().getByName("jar"); - jar.getArchiveBaseName().set(base.getArchivesName().get()); - jar.from(getRootFile(project, "LICENSE"), (spec) -> { - spec.rename(s -> "%s_%s".formatted(s, base.getArchivesName().get())); - }); - } - - public static int getJavaVersion(Project project) { - String currentMCVersion = getCurrentMCVersion(project); - StonecutterBuildExtension stonecutter = getStonecutter(project); - return stonecutter.compare("1.20.5", currentMCVersion) == 1 ? - stonecutter.compare("1.18", currentMCVersion) == 1 ? - stonecutter.compare("1.16.5", currentMCVersion) == 1 ? - 8 - : - 16 - : - 17 - : - 21; - } - - - public static MultiVersion getProjectMultiVersion(@NotNull Project currentProject) { - String currentMCVersion = getCurrentMCVersion(currentProject); - - String[] versions = getProperty(currentProject, "versions_specifications").split(" "); - for (String version : versions) { - String[] split = (substringBeforeLast(version, ".") + ".").split("\\["); - String project = split[0]; - if (Objects.equals(project, currentMCVersion)) { - String supportedVersionsString = split[1]; - if (supportedVersionsString.contains("-")) { - String[] supportedVersions = supportedVersionsString.split("-"); - return new MultiVersion(currentMCVersion, supportedVersions[0], supportedVersions[1]); - } else if (supportedVersionsString.contains(".")) { - return new MultiVersion(currentMCVersion, currentMCVersion, supportedVersionsString); - } else { - int a = project.indexOf("."); - int i = project.lastIndexOf("."); - if (a == i) { - i = project.length(); - } - String p = project.substring(0, i); - String supportedMaxVersion = "%s.%s".formatted(p, supportedVersionsString); - return new MultiVersion(currentMCVersion, currentMCVersion, supportedMaxVersion); - } - } - } - return new MultiVersion(currentMCVersion, currentMCVersion, currentMCVersion); - } - - public static Properties getPersonalProperties(@NotNull Project project) { - File file = project.getRootProject().file("personal/personal.properties"); - Properties personalProperties = new Properties(); - - if (!file.exists()) { - return personalProperties; - } - - try (InputStream stream = new FileInputStream(file)) { - personalProperties.load(stream); - } catch (IOException e) { - LOGGER.log("Something went wrong when parsing personal properties:"); - LOGGER.log(e.getMessage()); - } - - try { - String mixinPath = "absolute_path_to_sponge_mixin"; - - for (String line : Files.readAllLines(file.toPath())) { - if (!line.startsWith(mixinPath)) { - continue; - } - personalProperties.setProperty(mixinPath, line.substring(mixinPath.length() + 1)); - } - } catch (Exception e) { - LOGGER.log("Something went wrong when parsing personal properties mixin path:"); - LOGGER.log(e.getMessage()); - } - - return personalProperties; - } - - public static Map getMossyProperties(Project project, String prefix) { - HashMap dependencies = new HashMap<>(); - - Map properties = project.getProperties(); - for (Entry entry : properties.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (!key.startsWith(prefix + ".")) { - continue; - } - dependencies.put(substringSince(key, "."), value.toString()); - } - - return dependencies; - } - - public static String getCurrentMCVersion(@NotNull Project project) { - return getStonecutter(project).getCurrent().getProject(); - } - - public static @NotNull StonecutterBuildExtension getStonecutter(@NotNull Project project) { - return (StonecutterBuildExtension) project.getExtensions().getByName("stonecutter"); - } - - public static String getProperty(@NotNull Project project, String id) { - Map properties = project.getProperties(); - if (!properties.containsKey(id)) { - throw new IllegalArgumentException("Missing important property with id \"%s\" !".formatted(id)); - } - return properties.get(id).toString(); - } - - public static String[] getMultiVersions(@NotNull Project project) { - return getProperty(project, "multi_versions").split(" "); - } - - public static List getVersionsSpecifications(@NotNull Project project) { - return Arrays.stream(getProperty(project, "versions_specifications") - .split(" ")) - .map((version) -> substringBefore(version, "[")) - .toList(); - } - - @SuppressWarnings("unused") - public static String substringBeforeLast(String value, String since) { - int i = value.lastIndexOf(since); - if (i == -1) { - return value; - } - return value.substring(0, i); - } - - @SuppressWarnings("unused") - public static String substringSinceLast(String value, String since) { - int i = value.lastIndexOf(since); - if (i == -1) { - return value; - } - return value.substring(i + 1); - } - - @SuppressWarnings("unused") - public static String substringBefore(String value, String since) { - int i = value.indexOf(since); - if (i == -1) { - return value; - } - return value.substring(0, i); - } - - @SuppressWarnings("unused") - public static String substringSince(String value, String since) { - int i = value.indexOf(since); - if (i == -1) { - return value; - } - return value.substring(i + 1); - } - - public String getMossyProjectVersion(Project project) { - String modVersion = getProperty(project, "data.mod_version"); - MultiVersion multiVersion = this.getProjectMultiVersion(); - return "%s+%s".formatted(modVersion, multiVersion.projectVersion()); - } - - public static File getRootFile(@NotNull Project project, String path) { - return project.getRootProject().file(path); - } - -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/MossyPluginStonecutter.java b/buildSrc/src/main/java/net/lopymine/mossy/MossyPluginStonecutter.java deleted file mode 100644 index 497f475c..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/MossyPluginStonecutter.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.lopymine.mossy; - -import dev.kikugie.stonecutter.controller.StonecutterControllerExtension; -import dev.kikugie.stonecutter.data.StonecutterProject; -import java.io.IOException; -import lombok.experimental.ExtensionMethod; -import org.gradle.*; -import org.gradle.api.*; -import org.gradle.api.initialization.Settings; -import org.gradle.api.invocation.Gradle; -import org.gradle.api.tasks.*; - -import java.util.List; -import org.jetbrains.annotations.NotNull; - -@ExtensionMethod(MossyPlugin.class) -public class MossyPluginStonecutter implements Plugin { - - @Override - public void apply(@NotNull Project project) { - TaskContainer tasks = project.getTasks(); - StonecutterControllerExtension controller = project.getExtensions().getByType(StonecutterControllerExtension.class); - - tasks.register("submodulesUpdate", (task) -> { - task.doFirst((a) -> { - try { - Runtime.getRuntime().exec(new String[]{"git", "submodule", "update", "--init", "--force", "--remote"}); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - }); - - for (StonecutterProject version : controller.getVersions()) { - tasks.register("buildAndCollect+%s".formatted(version.getProject()), (task) -> { - task.dependsOn("submodulesUpdate"); - task.dependsOn(":%s:buildAndCollect".formatted(version.getProject())); - task.setGroup("mossy-build"); - }); - } - - for (StonecutterProject version : controller.getVersions()) { - tasks.register("publish+%s".formatted(version.getProject()), (task) -> { - task.dependsOn("submodulesUpdate"); - task.dependsOn(":%s:publishMods".formatted(version.getProject())); - task.setGroup("mossy-publish"); - }); - } - - tasks.register("buildAndCollect+All", (task) -> { - task.dependsOn("submodulesUpdate"); - controller.getVersions().forEach((version) -> { - task.dependsOn(":%s:buildAndCollect".formatted(version.getProject())); - }); - task.setGroup("mossy-build"); - }); - - tasks.register("buildAndCollect+Specified", (task) -> { - task.dependsOn("submodulesUpdate"); - List versionsSpecifications = project.getVersionsSpecifications(); - controller.getVersions().forEach((version) -> { - if (!versionsSpecifications.contains(version.getProject())) { - return; - } - task.dependsOn(":%s:buildAndCollect".formatted(version.getProject())); - }); - task.setGroup("mossy-build"); - }); - - tasks.register("publish+All", (task) -> { - task.dependsOn("submodulesUpdate"); - List versions = controller.getVersions() - .stream() - .sorted((a, b) -> controller.compare(a.getProject(), b.getProject())) - .toList(); - - for (String publishTask : List.of("publishModrinth", "publishCurseforge")) { - for (int i = 1; i < versions.size(); i++) { - StonecutterProject first = versions.get(i - 1); - StonecutterProject second = versions.get(i); - - TaskProvider firstTask = project.getChildProjects().get(first.getProject()).getTasks().named(publishTask); - TaskProvider secondTask = project.getChildProjects().get(second.getProject()).getTasks().named(publishTask); - task.dependsOn(firstTask, secondTask); - - secondTask.configure((t) -> t.setMustRunAfter(List.of(firstTask))); - } - } - - task.setGroup("mossy-publish"); - }); - - tasks.register("publish+Specified", (task) -> { - task.dependsOn("submodulesUpdate"); - List versionsSpecifications = project.getVersionsSpecifications(); - controller.getVersions().forEach((version) -> { - if (!versionsSpecifications.contains(version.getProject())) { - return; - } - task.dependsOn(":%s:publishMods".formatted(version.getProject())); - }); - task.setGroup("mossy-publish"); - }); - - project.getGradle().addBuildListener(new BuildListener() { - @Override - public void settingsEvaluated(@NotNull Settings settings) { - - } - - @Override - public void projectsLoaded(@NotNull Gradle gradle) { - - } - - @Override - public void projectsEvaluated(@NotNull Gradle gradle) { - for (Task task : tasks) { - if (!"stonecutter".equals(task.getGroup())) { - continue; - } - task.setGroup("mossy-stonecutter"); - } - } - - @Override - public void buildFinished(@NotNull BuildResult result) { - - } - }); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyAdditionalDependencies.java b/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyAdditionalDependencies.java deleted file mode 100644 index 1bbd41b7..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyAdditionalDependencies.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.lopymine.mossy.extension; - -import lombok.Getter; - -import java.util.*; - -@Getter -public class MossyAdditionalDependencies { - - private final Map overrides = new HashMap<>(); - private final Set disabled = new HashSet<>(); - - public void override(String configurationName, String modId) { - this.overrides.put(modId, new AdditionalDependencyOverride(modId, configurationName)); - } - - public void disable(String modId) { - this.disabled.add(modId); - } - - public record AdditionalDependencyOverride(String modId, String configurationName) { - - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyDependenciesExtension.java b/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyDependenciesExtension.java deleted file mode 100644 index 2622f704..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyDependenciesExtension.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.lopymine.mossy.extension; - -import lombok.Getter; -import org.gradle.api.Action; -import org.gradle.api.tasks.*; - -@Getter -public class MossyDependenciesExtension { - - @Input - String minecraft; - - @Input - String mappings; - - @Input - String fabricApi; - - @Input - String fabricLoader; - - @Input - String lombok; - - @Nested - MossyAdditionalDependencies additional = new MossyAdditionalDependencies(); - - public void additional(Action action) { - action.execute(this.additional); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyProcessResourcesExtension.java b/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyProcessResourcesExtension.java deleted file mode 100644 index 51a1b191..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/extension/MossyProcessResourcesExtension.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.lopymine.mossy.extension; - -import lombok.Getter; -import org.gradle.api.tasks.Input; - -import java.util.List; -import org.jetbrains.annotations.Nullable; - -@Getter -public class MossyProcessResourcesExtension { - - @Input - @Nullable - List expandFiles; - -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyDependenciesManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyDependenciesManager.java deleted file mode 100644 index 815bc823..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyDependenciesManager.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.lopymine.mossy.manager; - -import lombok.experimental.ExtensionMethod; -import org.gradle.api.*; -import org.gradle.api.artifacts.dsl.DependencyHandler; -import org.gradle.api.artifacts.repositories.MavenArtifactRepository; - -import net.lopymine.mossy.*; -import net.lopymine.mossy.extension.*; -import net.lopymine.mossy.extension.MossyAdditionalDependencies.AdditionalDependencyOverride; - -import java.util.*; -import java.util.function.Consumer; -import org.jetbrains.annotations.NotNull; - -@ExtensionMethod(MossyPlugin.class) -public class MossyDependenciesManager { - - private static void addDependencies(MossyDependenciesExtension extension, Project project) { - String minecraft = extension.getMinecraft(); - String fabricApi = extension.getFabricApi(); - String fabricLoader = extension.getFabricLoader(); - String lombok = extension.getLombok(); - - DependencyHandler dependencies = project.getDependencies(); - dependencies.add("minecraft", "com.mojang:minecraft:%s".formatted(minecraft)); - dependencies.add("modImplementation", "net.fabricmc.fabric-api:fabric-api:%s".formatted(fabricApi)); - dependencies.add("modImplementation", "net.fabricmc:fabric-loader:%s".formatted(fabricLoader)); - dependencies.add("compileOnly", "org.projectlombok:lombok:%s".formatted(lombok)); - dependencies.add("annotationProcessor", "org.projectlombok:lombok:%s".formatted(lombok)); - - Map properties = project.getMossyProperties("dep"); - MossyAdditionalDependencies additional = extension.getAdditional(); - additional.disable("yacl"); - - Map overrides = additional.getOverrides(); - Set disabled = additional.getDisabled(); - properties.forEach((modId, version) -> { - if (disabled.contains(modId)) { - //System.out.println("Disabling auto-dependency for %s !".formatted(modId)); - return; - } - - if (version.equals("unknown")) { - return; - } - - AdditionalDependencyOverride override = overrides.get(modId); - String configurationName = override != null ? override.configurationName() : "modImplementation"; - dependencies.add(configurationName, "maven.modrinth:%s:%s".formatted(modId, version)); - }); - - project.getConfigurations().forEach((configuration) -> { - configuration.resolutionStrategy((strategy) -> { - strategy.force("com.twelvemonkeys.common:common-io:3.10.0"); - strategy.force("com.twelvemonkeys.common:common-lang:3.10.0"); - strategy.force("com.twelvemonkeys.common:common-image:3.10.0"); - strategy.force("com.twelvemonkeys.imageio:imageio-metadata:3.10.0"); - strategy.force("com.twelvemonkeys.imageio:imageio-webp:3.10.0"); - strategy.force("com.twelvemonkeys.imageio:imageio-core:3.10.0"); - }); - }); - - String yaclVersion = properties.get("yacl"); - if (yaclVersion != null && !yaclVersion.equals("unknown")) { - Set oldMavenVersions = Set.of("1.19.4", "1.20", "1.20.2", "1.20.3"); - if (oldMavenVersions.contains(minecraft)) { - dependencies.add("modImplementation", "dev.isxander.yacl:yet-another-config-lib-fabric:%s".formatted(MossyPlugin.substringBeforeLast(yaclVersion, "-"))); - } else { - dependencies.add("modImplementation", "dev.isxander:yet-another-config-lib:%s".formatted(yaclVersion)); - } - } - } - - private static void addRepositories(Project project) { - project.getRepositories().mavenCentral(); - addRepository(project, "Quilt", "https://maven.quiltmc.org/repository/release/"); - addRepository(project, "Sonatype", "https://oss.sonatype.org/content/repositories/snapshots/"); - addRepository(project, "Terraformers", "https://maven.terraformersmc.com/"); - addRepository(project, "YACL", "https://maven.isxander.dev/releases"); - addRepository(project, "Nucleoid", "https://maven.nucleoid.xyz/"); - addRepository(project, "Modrinth", "https://api.modrinth.com/maven", (repository) -> { - repository.content((descriptor) -> { - descriptor.includeGroup("maven.modrinth"); - }); - }); - - } - - private static void addRepository(Project project, String name, String url) { - addRepository(project, name, url, (repository) -> {}); - } - - private static void addRepository(Project project, String name, String url, Consumer consumer) { - project.getRepositories().maven((repository) -> { - repository.setName(name); - repository.setUrl(url); - consumer.accept(repository); - }); - } - - public static void apply(@NotNull Project project) { - project.getExtensions().create("mossyDependencies", MossyDependenciesExtension.class); - - addRepositories(project); - project.getGradle().addProjectEvaluationListener(new ProjectEvaluationListener() { - @Override - public void beforeEvaluate(@NotNull Project project) { - } - - @Override - public void afterEvaluate(@NotNull Project project, @NotNull ProjectState state) { - MossyDependenciesExtension extension = project.getExtensions().getByType(MossyDependenciesExtension.class); - MossyDependenciesManager.addDependencies(extension, project); - project.getGradle().removeProjectEvaluationListener(this); - } - }); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyJ52JManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyJ52JManager.java deleted file mode 100644 index e77e652e..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyJ52JManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.lopymine.mossy.manager; - -import dev.kikugie.fletching_table.extension.FletchingTableExtension; -import lombok.experimental.ExtensionMethod; -import net.lopymine.mossy.MossyPlugin; -import org.gradle.api.Project; - -@ExtensionMethod(MossyPlugin.class) -public class MossyJ52JManager { - - public static void apply(Project project) { - project.getExtensions().configure(FletchingTableExtension.class, (extension) -> { - var main = extension.getJ52j().register("main"); - main.configure((container) -> container.extension("json", "**/*.json5")); - }); - } - -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyJavaManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyJavaManager.java deleted file mode 100644 index da89d8af..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyJavaManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.lopymine.mossy.manager; - -import lombok.experimental.ExtensionMethod; -import org.gradle.api.*; -import org.gradle.api.plugins.*; -import org.gradle.api.tasks.TaskCollection; -import org.gradle.api.tasks.compile.JavaCompile; - -import net.lopymine.mossy.MossyPlugin; - -import org.jetbrains.annotations.NotNull; - -@ExtensionMethod(MossyPlugin.class) -public class MossyJavaManager { - - public static void apply(@NotNull Project project, MossyPlugin mossyPlugin) { - int javaVersionIndex = mossyPlugin.getJavaVersionIndex(); - JavaVersion javaVersion = mossyPlugin.getJavaVersion(); - - TaskCollection collection = project.getTasks().withType(JavaCompile.class); - for (JavaCompile javaCompile : collection) { - javaCompile.getOptions().getRelease().set(javaVersionIndex); - } - - JavaPluginExtension javaExtension = project.getExtensions().getByType(JavaPluginExtension.class); - javaExtension.setSourceCompatibility(javaVersion); - javaExtension.setTargetCompatibility(javaVersion); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyLoomManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyLoomManager.java deleted file mode 100644 index 4f63a656..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyLoomManager.java +++ /dev/null @@ -1,94 +0,0 @@ -package net.lopymine.mossy.manager; - -import lombok.experimental.ExtensionMethod; -import org.gradle.api.*; - -import net.fabricmc.loom.api.LoomGradleExtensionAPI; -import net.fabricmc.loom.configuration.ide.RunConfigSettings; - -import net.lopymine.mossy.MossyPlugin; - -import java.io.File; -import java.util.*; -import java.util.regex.Pattern; -import org.jetbrains.annotations.*; - -@ExtensionMethod(MossyPlugin.class) -public class MossyLoomManager { - - private static final Pattern PLAYER_NICKNAME_PATTERN = Pattern.compile("[a-zA-Z0-9_]{2,16}$"); - - @SuppressWarnings("UnstableApiUsage") - public static void apply(@NotNull Project project, MossyPlugin plugin, LoomGradleExtensionAPI loom) { - String modId = project.getProperty("data.mod_id"); - String currentVersion = plugin.getProjectMultiVersion().projectVersion(); - File file = project.getRootFile("src/main/resources/aws/%s.accesswidener".formatted(currentVersion)); - - // Mixins and AWs - - loom.getMixin().getDefaultRefmapName().set("%s.refmap.json".formatted(modId)); - loom.getAccessWidenerPath().set(file); - - // Run Configs - - Properties personalProperties = project.getPersonalProperties(); - - String playerNickname = getPlayerNickname(personalProperties); - UUID playerUuid = getPlayerUuid(personalProperties); - Object quickPlayWorld = personalProperties.get("quick_play_world"); - Object pathToSpongeMixin = personalProperties.get("absolute_path_to_sponge_mixin"); - - for (RunConfigSettings runConfig : loom.getRunConfigs()) { - runConfig.setIdeConfigGenerated(true); - runConfig.setRunDir("../../runs/" + runConfig.getEnvironment()); - - if (runConfig.getEnvironment().equals("client")) { - addProgramArg(runConfig, "--username", playerNickname); - addProgramArg(runConfig, "--uuid", playerUuid); - addProgramArg(runConfig, "--quickPlaySingleplayer", quickPlayWorld); - addVMArg(runConfig, "-javaagent", pathToSpongeMixin); - } - } - } - - private static String getPlayerNickname(Properties personalProperties) { - Object o = personalProperties.get("player_nickname"); - if (o == null) { - return "Player"; - } - String playerNickname = o.toString(); - if (!PLAYER_NICKNAME_PATTERN.matcher(playerNickname).matches()) { - return "Player"; - } - return playerNickname; - } - - private static @Nullable UUID getPlayerUuid(Properties personalProperties) { - try { - Object o = personalProperties.get("player_uuid"); - if (o == null) { - return null; - } - return UUID.fromString(o.toString()); - } catch (Exception e) { - return null; - } - } - - @SuppressWarnings("all") - private static void addVMArg(RunConfigSettings settings, String propertyKey, @Nullable Object propertyValue) { - if (propertyValue == null || propertyValue.toString().equals("none")) { - return; - } - settings.getVmArgs().add("%s:%s".formatted(propertyKey, propertyValue.toString())); - } - - private static void addProgramArg(RunConfigSettings settings, String propertyKey, @Nullable Object propertyValue) { - if (propertyValue == null || propertyValue.toString().equals("none")) { - return; - } - List programArgs = settings.getProgramArgs(); - programArgs.add(propertyKey); - programArgs.add(propertyValue.toString()); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyModPublishManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyModPublishManager.java deleted file mode 100644 index 72101534..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyModPublishManager.java +++ /dev/null @@ -1,148 +0,0 @@ -package net.lopymine.mossy.manager; - -import lombok.experimental.ExtensionMethod; -import me.modmuss50.mpp.*; -import org.codehaus.groovy.runtime.ResourceGroovyMethods; -import org.gradle.api.*; -import org.gradle.api.file.RegularFile; -import org.gradle.api.provider.Provider; - -import net.fabricmc.loom.task.RemapJarTask; - -import net.lopymine.mossy.MossyPlugin; -import net.lopymine.mossy.multi.MultiVersion; - -import java.io.*; -import java.util.Arrays; -import org.jetbrains.annotations.NotNull; - -@ExtensionMethod(MossyPlugin.class) -public class MossyModPublishManager { - - public static void apply(@NotNull Project project, MossyPlugin mossyPlugin, ModPublishExtension mpe) { - MultiVersion projectMultiVersion = mossyPlugin.getProjectMultiVersion(); - String name = "[%s] %s v%s".formatted(projectMultiVersion.toVersionRange(), project.getProperty("data.mod_name"), project.getProperty("data.mod_version")); - - String[] loaders = project.getProperty("loaders").split(" "); - String modrinthId = project.getProperty("modrinth_id"); - String curseForgeId = project.getProperty("curseforge_id"); - String[] dependsEmbeds = project.getProperty("depends_embeds").split(" "); - String[] dependsRequires = project.getProperty("depends_requires").split(" "); - String[] dependsOptional = project.getProperty("depends_optional").split(" "); - String[] dependsIncompatible = project.getProperty("depends_incompatible").split(" "); - String versionType = project.getProperty("version_type"); - int maxJavaVersion = Integer.parseInt(project.getProperty("max_java_version")); - Boolean isForClient = Boolean.parseBoolean(project.getProperty("is_for_client")); - Boolean isForServer = Boolean.parseBoolean(project.getProperty("is_for_server")); - boolean testPublish = Boolean.parseBoolean(project.getProperty("test_publish")); - - String curseForgeApiKey = project.getProviders().environmentVariable("CURSEFORGE_API_KEY").getOrNull(); - String modrinthApiKey = project.getProviders().environmentVariable("MODRINTH_API_KEY").getOrNull(); - - boolean cannotUpload = testPublish || ((curseForgeApiKey == null && !curseForgeId.equals("none")) || (modrinthApiKey == null && !modrinthId.equals("none"))); - - mpe.getDisplayName().set(name); - mpe.getFile().set(getModFile(project)); - mpe.getChangelog().set(getChangeLog(project)); - mpe.getType().set(getType(versionType)); - mpe.getModLoaders().set(Arrays.asList(loaders)); - mpe.getDryRun().set(cannotUpload); - - if (!curseForgeId.equals("none")) { - mpe.curseforge((curseforge) -> { - curseforge.getProjectId().set(curseForgeId); - curseforge.getAccessToken().set(curseForgeApiKey); - - for (int i = 17; i < maxJavaVersion + 1; i++) { - curseforge.getJavaVersions().add(JavaVersion.values()[i]); - } - - curseforge.getClientRequired().set(isForClient); - curseforge.getServerRequired().set(isForServer); - - if (projectMultiVersion.minIsMax()) { - curseforge.getMinecraftVersions().add(projectMultiVersion.maxVersion()); - } else { - curseforge.minecraftVersionRange((options) -> { - options.getStart().set(projectMultiVersion.minVersion()); - options.getEnd().set(projectMultiVersion.maxVersion()); - }); - } - - if (!dependsEmbeds[0].equals("none")) { - curseforge.embeds(dependsEmbeds); - } - if (!dependsRequires[0].equals("none")) { - curseforge.requires(dependsRequires); - } - if (!dependsOptional[0].equals("none")) { - curseforge.optional(dependsOptional); - } - if (!dependsIncompatible[0].equals("none")) { - curseforge.incompatible(dependsIncompatible); - } - }); - } - - if (!modrinthId.equals("none")) { - mpe.modrinth((modrinth) -> { - modrinth.getProjectId().set(modrinthId); - modrinth.getAccessToken().set(modrinthApiKey); - - if (projectMultiVersion.minIsMax()) { - modrinth.getMinecraftVersions().add(projectMultiVersion.maxVersion()); - } else { - modrinth.minecraftVersionRange((options) -> { - options.getStart().set(projectMultiVersion.minVersion()); - options.getEnd().set(projectMultiVersion.maxVersion()); - }); - } - - if (!dependsEmbeds[0].equals("none")) { - modrinth.embeds(dependsEmbeds); - } - if (!dependsRequires[0].equals("none")) { - modrinth.requires(dependsRequires); - } - if (!dependsOptional[0].equals("none")) { - modrinth.optional(dependsOptional); - } - if (!dependsIncompatible[0].equals("none")) { - modrinth.incompatible(dependsIncompatible); - } - }); - } - - MossyPlugin.LOGGER.logModule("MPP","Configuring \"%s\"", mpe.getDisplayName().get()); - MossyPlugin.LOGGER.logModule("MPP","Dry Run: %s", mpe.getDryRun().get()); - } - - private static Provider getModFile(@NotNull Project project) { - return ((RemapJarTask) project.getTasks().getByName("remapJar")).getArchiveFile(); - } - - private static ReleaseType getType(String versionType) { - return switch (versionType) { - case "RELEASE" -> ReleaseType.STABLE; - case "BETA" -> ReleaseType.BETA; - case "ALPHA" -> ReleaseType.ALPHA; - default -> throw new IllegalArgumentException("Unknown version type!"); - }; - } - - private static String getChangeLog(@NotNull Project project) { - try { - File file = project.getRootFile("CHANGELOG.md"); - if (file.exists()) { - String text = ResourceGroovyMethods.getText(file); - if (!text.isBlank()) { - return text; - } - } - } catch (IOException e) { - throw new RuntimeException("Failed to read changelog:", e); - } - return "No changelog specified."; - } - -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyProcessResourcesManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyProcessResourcesManager.java deleted file mode 100644 index 14a54f4d..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyProcessResourcesManager.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.lopymine.mossy.manager; - -import lombok.experimental.ExtensionMethod; -import org.gradle.api.*; -import org.gradle.api.internal.TaskInputsInternal; -import org.gradle.language.jvm.tasks.ProcessResources; - -import net.lopymine.mossy.MossyPlugin; -import net.lopymine.mossy.extension.*; - -import java.util.*; -import org.jetbrains.annotations.NotNull; - -@ExtensionMethod(MossyPlugin.class) -public class MossyProcessResourcesManager { - - public static void apply(@NotNull Project project, MossyPlugin plugin) { - project.getExtensions().create("mossyResources", MossyProcessResourcesExtension.class); - - project.getGradle().addProjectEvaluationListener(new ProjectEvaluationListener() { - @Override - public void beforeEvaluate(@NotNull Project project) { - } - - @Override - public void afterEvaluate(@NotNull Project project, @NotNull ProjectState state) { - MossyProcessResourcesExtension extension = project.getExtensions().getByType(MossyProcessResourcesExtension.class); - MossyProcessResourcesManager.processResources(project, plugin, extension); - project.getGradle().removeProjectEvaluationListener(this); - } - }); - } - - private static void processResources(Project project, MossyPlugin plugin, MossyProcessResourcesExtension extension) { - ProcessResources processResources = (ProcessResources) project.getTasks().getByName("processResources"); - TaskInputsInternal inputs = processResources.getInputs(); - - String mcVersion = plugin.getProjectMultiVersion().projectVersion(); - String modId = project.getProperty("data.mod_id"); - - Map properties = project.getMossyProperties("data"); - properties.putAll(project.getMossyProperties("build")); - properties.putAll(project.getMossyProperties("dep")); - properties.put("java", String.valueOf(plugin.getJavaVersionIndex())); - properties.put("minecraft", mcVersion); - properties.put("fabric_api_id", project.getStonecutter().compare("1.19.1", mcVersion) >= 0 ? "fabric" : "fabric-api"); - properties.put("mod_version", project.getVersion().toString()); - - properties.forEach(inputs::property); - - List patterns = new ArrayList<>(List.of("*.json5", "*.json", "assets/%s/lang/*.json".formatted(modId))); - List expandFiles = extension.getExpandFiles(); - if (expandFiles != null) { - patterns.addAll(expandFiles); - } - - processResources.filesMatching(patterns, (details) -> { - details.expand(properties); - }); - - processResources.filesMatching("aws/*.accesswidener", (details) -> { - if (!details.getName().startsWith(mcVersion)) { - details.exclude(); - } - }); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyStonecutterManager.java b/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyStonecutterManager.java deleted file mode 100644 index d1cd1106..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/manager/MossyStonecutterManager.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.lopymine.mossy.manager; - -import dev.kikugie.stonecutter.build.StonecutterBuildExtension; -import lombok.experimental.ExtensionMethod; -import org.gradle.api.Project; - -import net.lopymine.mossy.MossyPlugin; - -import java.util.Map; -import org.jetbrains.annotations.NotNull; - -@ExtensionMethod(MossyPlugin.class) -public class MossyStonecutterManager { - - public static void apply(@NotNull Project project, MossyPlugin plugin) { - StonecutterBuildExtension stonecutter = project.getStonecutter(); - - String mcVersion = plugin.getProjectMultiVersion().projectVersion(); - Map properties = project.getMossyProperties("data"); - properties.putAll(project.getMossyProperties("build")); - Map dependencies = project.getMossyProperties("dep"); - properties.putAll(dependencies); - properties.put("java", String.valueOf(plugin.getJavaVersionIndex())); - properties.put("minecraft", mcVersion); - properties.put("fabric_api_id", project.getStonecutter().compare("1.19.1", mcVersion) >= 0 ? "fabric" : "fabric-api"); - properties.put("mod_version", project.getVersion().toString()); - - properties.forEach((key, value) -> { - stonecutter.getSwaps().put(key, getFormatted(value)); - }); - - dependencies.forEach((modId, version) -> { - stonecutter.getConstants().put(modId, !version.equals("unknown")); - stonecutter.getDependencies().put(modId, version); - }); - } - - private static @NotNull String getFormatted(String modVersion) { - return "\"%s\";".formatted(modVersion); - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/multi/MultiVersion.java b/buildSrc/src/main/java/net/lopymine/mossy/multi/MultiVersion.java deleted file mode 100644 index 334a8096..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/multi/MultiVersion.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lopymine.mossy.multi; - -import java.util.Objects; - -public record MultiVersion(String projectVersion, String minVersion, String maxVersion) { - - @Override - public String toString() { - if (!this.minVersion().equals(this.maxVersion())) { - return "%s[%s-%s]".formatted(this.projectVersion(), this.minVersion(), this.maxVersion()); - } - return "%s[%s]".formatted(this.projectVersion(), this.maxVersion()); - } - - public String toVersionRange() { - if (Objects.equals(this.minVersion(), this.maxVersion())) { - return this.maxVersion(); - } - - int aMin = this.minVersion().indexOf("."); - int bMin = this.minVersion().lastIndexOf("."); - if (aMin == bMin) { - bMin = this.minVersion().length(); - } - String minMain = this.minVersion().substring(0, bMin); - - int aMax = this.maxVersion().indexOf("."); - int bMax = this.maxVersion().lastIndexOf("."); - if (aMax == bMax) { - bMax = this.maxVersion().length(); - } - - String maxMain = this.maxVersion().substring(0, bMax); - String maxMinor = this.maxVersion().substring(bMax+1); - if (minMain.equals(maxMain)) { - return "%s-%s".formatted(this.minVersion(), maxMinor); - } - return "%s-%s".formatted(this.minVersion(), this.maxVersion()); - } - - public boolean minIsMax() { - return this.minVersion().equals(this.maxVersion()); - } - -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/tasks/GeneratePersonalPropertiesTask.java b/buildSrc/src/main/java/net/lopymine/mossy/tasks/GeneratePersonalPropertiesTask.java deleted file mode 100644 index c8fdce4f..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/tasks/GeneratePersonalPropertiesTask.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.lopymine.mossy.tasks; - -import lombok.experimental.ExtensionMethod; -import org.gradle.api.*; -import org.gradle.api.tasks.TaskAction; - -import net.lopymine.mossy.MossyPlugin; - -import java.io.*; -import java.nio.file.Files; - -@ExtensionMethod(MossyPlugin.class) -public class GeneratePersonalPropertiesTask extends DefaultTask { - - @TaskAction - public void generate() { - Project project = this.getProject(); - File file = project.getRootFile("personal/"); - if (!file.exists() && !file.mkdirs()) { - return; - } - try { - File personalPropertiesFile = file.toPath().resolve("personal.properties").toFile(); - if (personalPropertiesFile.exists()) { - return; - } - if (!personalPropertiesFile.createNewFile()) { - return; - } - - String strip = """ - # # # # # # # # # # # # # # - # Personal Properties # - # # # # # # # # # # # # # # - - # If you don't want to set up any property, just set it to "none". - # Remember to run "regenerateRunConfigurations" task after changing this file! - - # Player properties - player_nickname=Steve - player_uuid=8667ba71-b85a-4004-af54-457a9734eed7 - - # Hot Swapping - absolute_path_to_sponge_mixin=none - - # Quick Play - quick_play_world=none - """.stripIndent().strip(); - - Files.write(personalPropertiesFile.toPath(), strip.getBytes()); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/buildSrc/src/main/java/net/lopymine/mossy/tasks/GeneratePublishWorkflowsForEachVersionTask.java b/buildSrc/src/main/java/net/lopymine/mossy/tasks/GeneratePublishWorkflowsForEachVersionTask.java deleted file mode 100644 index 9358ece8..00000000 --- a/buildSrc/src/main/java/net/lopymine/mossy/tasks/GeneratePublishWorkflowsForEachVersionTask.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.lopymine.mossy.tasks; - -import lombok.experimental.ExtensionMethod; -import org.gradle.api.*; -import org.gradle.api.tasks.TaskAction; - -import net.lopymine.mossy.MossyPlugin; - -import java.io.*; -import java.nio.file.Files; - -@ExtensionMethod(MossyPlugin.class) -public class GeneratePublishWorkflowsForEachVersionTask extends DefaultTask { - - @TaskAction - public void generate() { - Project project = this.getProject(); - File file = project.getRootFile(".github/workflows/"); - if (!file.exists() && !file.mkdirs()) { - return; - } - String[] multiVersions = project.getMultiVersions(); - for (String multiVersion : multiVersions) { - try { - File workflowFile = file.toPath().resolve("publish_%s.yml".formatted(multiVersion)).toFile(); - if (workflowFile.exists()) { - continue; - } - if (!workflowFile.createNewFile()) { - continue; - } - String strip = """ - # Generated workflow by task - - name: Publish MULTI_VERSION_ID Version - on: [workflow_dispatch] # Manual trigger - - permissions: - contents: write - - jobs: - build: - runs-on: ubuntu-22.04 - container: - image: mcr.microsoft.com/openjdk/jdk:21-ubuntu - options: --user root - steps: - - uses: actions/checkout@v4 - - name: make gradle wrapper executable - run: chmod +x ./gradlew - - name: Publish MULTI_VERSION_ID Mod Version - run: ./gradlew chiseledBuildAndCollect+MULTI_VERSION_ID chiseledPublish+MULTI_VERSION_ID - env: - CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} - MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} - """.replaceAll("MULTI_VERSION_ID", multiVersion).stripIndent().strip(); - Files.write(workflowFile.toPath(), strip.getBytes()); - } catch (Exception ignored) { - } - - } - } - -} diff --git a/buildSrc/src/main/java/net/lopymine/utils/MossyUtils.java b/buildSrc/src/main/java/net/lopymine/utils/MossyUtils.java new file mode 100644 index 00000000..b68db6ca --- /dev/null +++ b/buildSrc/src/main/java/net/lopymine/utils/MossyUtils.java @@ -0,0 +1,57 @@ +package net.lopymine.utils; + +import java.util.*; +import org.gradle.api.Project; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class MossyUtils { + + public static String getProperty(@NotNull Properties properties, String id) { + if (!properties.containsKey(id)) { + throw new IllegalArgumentException("Missing important property with id \"%s\" !".formatted(id)); + } + return properties.get(id).toString(); + } + + public static String getProperty(@NotNull Project project, String id) { + Map properties = project.getProperties(); + if (!properties.containsKey(id)) { + throw new IllegalArgumentException("Missing important property with id \"%s\" !".formatted(id)); + } + return properties.get(id).toString(); + } + + public static String substringBeforeLast(String value, String since) { + int i = value.lastIndexOf(since); + if (i == -1) { + return value; + } + return value.substring(0, i); + } + + public static String substringSinceLast(String value, String since) { + int i = value.lastIndexOf(since); + if (i == -1) { + return value; + } + return value.substring(i + 1); + } + + public static String substringBefore(String value, String since) { + int i = value.indexOf(since); + if (i == -1) { + return value; + } + return value.substring(0, i); + } + + public static String substringSince(String value, String since) { + int i = value.indexOf(since); + if (i == -1) { + return value; + } + return value.substring(i + 1); + } + +} diff --git a/gradle.properties b/gradle.properties index 35b048c5..980dacb0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,35 +2,62 @@ # Gradle Properties # # # # # # # # # # # # # # # -current_mossy_build_version = 1.0.0 - # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx16G -org.gradle.parallel=true +org.gradle.jvmargs = -Xmx12G +org.gradle.parallel = true + +# Mossy Plugin +mossy_plugin_version = 3.21.0 + +# Stonecutter +dev.kikugie.stonecutter.hard_mode = true +special.no_command_replacements = true + +# Tests +tests.parallel_runs = 3 +test.shaders.mods = sodium iris +test.shaders.shaders = complementary-reimagined +test.controlling.mods = controlling searchables +test.commands.mods = luckperms # Mod Properties data.mod_id = patpat data.mod_name = PatPat -data.mod_version = 1.2.3 +data.mod_version = 1.3.1 data.mod_group = net.lopymine.patpat data.mod_maven_group = net.lopymine +data.mixin_configs = controlling geckolib +data.sides = both -data.mod_description = Simple Client and (Optional) Server side Fabric mod for patting any (living) mobs! +data.mod_description = Allows you to pat ANY loved and unloved living mobs in Minecraft! data.mod_authors = LopyMine, nikita51 +data.github_mod_author = LopyMine data.mod_license = LGPL-3.0-only data.server_config_version = 1.0.0 data.client_config_version = 1.0.1 # Main Dependencies base.lombok_version = 1.18.42 +base.mixinextras_version = 0.4.1 +base.mixin_version = 0.8.5 # Multi-Versions Properties -multi_versions = 1.16.5 1.17 1.17.1 1.18 1.18.1 1.18.2 1.19 1.19.1 1.19.2 1.19.3 1.19.4 1.20 1.20.1 1.20.2 1.20.3 1.20.4 1.20.5 1.20.6 1.21 1.21.1 1.21.2 1.21.3 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8 1.21.9 1.21.10 +#fabric.multi_versions = 1.16.5 1.17 1.17.1 1.18 1.18.1 1.18.2 1.19 1.19.1 1.19.2 1.19.3 1.19.4 1.20 1.20.1 1.20.2 1.20.3 1.20.4 1.20.5 1.20.6 1.21 1.21.1 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8 1.21.9 1.21.10 1.21.11 26.1 +#neoforge.multi_versions = 1.20.3 1.20.4 1.20.6 1.21.1 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8 1.21.9 1.21.10 1.21.11 26.1 +#forge.multi_versions = 1.18.2 1.19.2 1.19.3 1.19.4 1.20.1 +fabric.multi_versions = 1.16.5 1.17 1.17.1 1.18 1.18.1 1.18.2 1.19 1.19.1 1.19.2 1.19.3 1.19.4 1.20 1.20.1 1.20.2 1.20.3 1.20.4 1.20.5 1.20.6 1.21 1.21.1 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8 1.21.9 1.21.10 1.21.11 26.1 +neoforge.multi_versions = 1.20.3 1.20.4 1.20.6 1.21.1 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8 1.21.9 1.21.10 1.21.11 26.1 +forge.multi_versions = 1.18.2 1.19.2 1.19.3 1.19.4 1.20.1 + +# Mod Loaders +mod_loaders = fabric neoforge forge -# Build Dependencies -build.yarn = [VERSIONED] -build.fabric_loader = 0.17.2 +# Mod Loader Dependencies +build.fabric_loader = 0.18.4 build.fabric_api = [VERSIONED] +build.neoforge = [VERSIONED] +build.parchment = [VERSIONED] +build.forge = [VERSIONED] build.fabric-permissions-api = [VERSIONED] # Additional Dependencies, "dep." is important @@ -41,15 +68,20 @@ dep.replaymod = [VERSIONED] dep.geckolib = [VERSIONED] dep.flashback = [VERSIONED] dep.proxlib = [VERSIONED] +dep.controlling = [VERSIONED] +dep.searchables = [VERSIONED] +dep.iris = [VERSIONED] +dep.sodium = [VERSIONED] # # # # # # # # # # # # # # # Publication Properties # # # # # # # # # # # # # # # -# Mod Loaders -loaders = fabric # Versions Specifications -versions_specifications = 1.16.5 1.17 1.17.1 1.18 1.18.1 1.18.2 1.19 1.19.1 1.19.2 1.19.3 1.19.4 1.20 1.20.1 1.20.2 1.20.3 1.20.4 1.20.5 1.20.6 1.21 1.21.1 1.21.2 1.21.3 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8 1.21.9 1.21.10 +fabric.versions_specifications = 1.21.10 +neoforge.versions_specifications = 1.21.10 +forge.versions_specifications = 1.21.10 + # Version Type [RELEASE, BETA, ALPHA] version_type = RELEASE @@ -65,8 +97,20 @@ is_for_client = true is_for_server = true max_java_version = 21 -# Mod Depends -depends_requires = fabric-api -depends_optional = modmenu yacl cloth-config -depends_incompatible = none -depends_embeds = none \ No newline at end of file +# Fabric Mod Depends +fabric.depends_requires = fabric-api +fabric.depends_optional = modmenu yacl cloth-config +fabric.depends_incompatible = none +fabric.depends_embeds = none + +# NeoForge Mod Depends +neoforge.depends_requires = none +neoforge.depends_optional = yacl cloth-config +neoforge.depends_incompatible = none +neoforge.depends_embeds = none + +# Forge Mod Depends +forge.depends_requires = none +forge.depends_optional = yacl cloth-config +forge.depends_incompatible = none +forge.depends_embeds = none \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca025c83..dbc3ce4a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/patpat-languages-files b/patpat-languages-files index 5650bf6f..117c1fd4 160000 --- a/patpat-languages-files +++ b/patpat-languages-files @@ -1 +1 @@ -Subproject commit 5650bf6f4877d1288344cfb0675aa5744d509f7c +Subproject commit 117c1fd4e1a37f82df3bbd89777b610ed6f8e202 diff --git a/settings.gradle b/settings.gradle index d42fb72a..47fad9c7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,20 @@ pluginManagement { repositories { - mavenLocal() mavenCentral() gradlePluginPortal() + mavenLocal() + maven { + name "NeoForge Releases" + url "https://maven.neoforged.net/releases" + } + maven { + name "Mossy Projects Releases" + url "https://maven.lopymine.net/releases" + } + maven { + name "Mossy Projects Snapshots" + url "https://maven.lopymine.net/snapshots" + } maven { name "Fabric" url "https://maven.fabricmc.net/" @@ -16,10 +28,9 @@ pluginManagement { url "https://maven.kikugie.dev/releases" } } - includeBuild("buildSettings") } plugins { - id "dev.kikugie.stonecutter" version "0.7.1" - id "net.lopymine.mossy-settings-plugin" + id "dev.kikugie.stonecutter" version "0.9" + id "net.lopymine.mossy-plugin-settings" version "$mossy_plugin_version" } \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/PatPat.java b/src/main/java/net/lopymine/patpat/PatPat.java index fd5f8a0e..0c4482f0 100644 --- a/src/main/java/net/lopymine/patpat/PatPat.java +++ b/src/main/java/net/lopymine/patpat/PatPat.java @@ -1,16 +1,17 @@ package net.lopymine.patpat; -import net.fabricmc.api.ModInitializer; - import net.lopymine.patpat.common.config.PatPatConfigManager; +import net.lopymine.patpat.entrypoint.*; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.server.command.PatPatServerCommandManager; import net.lopymine.patpat.server.event.PatPatServerPlayerEvents; import net.lopymine.patpat.server.packet.PatPatServerPacketManager; +import net.lopymine.patpat.tests.PatPatTestServerAgent; -public class PatPat implements ModInitializer { +public class PatPat { - public static final String MOD_VERSION = /*$ mod_version*/ "1.2.3+1.21.10"; - public static final String BUILD_CODE_TIME = /*$ build_code_time*/ "0159b04"; + public static final String MOD_VERSION = /*$ mod_version*/ "1.3.1+26.1+fabric"; + public static final String BUILD_CODE_TIME = /*$ build_code_time*/ "03c3f6d"; public static final String MOD_NAME = /*$ mod_name*/ "PatPat"; public static final String MOD_ID = /*$ mod_id*/ "patpat"; public static final String SERVER_CONFIG_VERSION = /*$ server_config_version*/ "1.0.0"; @@ -19,15 +20,16 @@ public class PatPat implements ModInitializer { public static final PatLogger LOGGER = new PatLogger(MOD_NAME); - @Override - public void onInitialize() { + public static void onInitialize() { PatPatConfigManager.onInitialize(); PatPatConfigManager.reloadServer(); PatPatServerCommandManager.register(); PatPatServerPlayerEvents.register(); - PatPatServerPacketManager.register(); + ServerMultiLoader.getInstance().registerServerPackets(PatPatServerPacketManager::register); + PatPatTestServerAgent.register(); PatPat.LOGGER.info("PatPat Initialized"); PatPat.LOGGER.debug("Debug Mode Enabled"); } + } \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/client/PatPatClient.java b/src/main/java/net/lopymine/patpat/client/PatPatClient.java index a2eca1d3..cb3111ba 100644 --- a/src/main/java/net/lopymine/patpat/client/PatPatClient.java +++ b/src/main/java/net/lopymine/patpat/client/PatPatClient.java @@ -1,8 +1,5 @@ package net.lopymine.patpat.client; -import net.fabricmc.api.ClientModInitializer; - -import net.lopymine.patpat.PatLogger; import net.lopymine.patpat.client.command.PatPatClientCommandManager; import net.lopymine.patpat.client.config.PatPatClientStatsConfig; import net.lopymine.patpat.client.event.PatPatClientPlayerEvents; @@ -14,21 +11,24 @@ import net.lopymine.patpat.compat.LoadedMods; import java.util.*; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.lopymine.patpat.logger.PatLogger; +import net.lopymine.patpat.tests.PatPatTestClientAgent; -public class PatPatClient implements ClientModInitializer { +public class PatPatClient { public static final PatLogger LOGGER = new PatLogger("PatPat/Client"); public static final Set AUTHORS = Set.of(UUID.fromString("7b829ed5-9b74-428f-9b4d-ede06975fbc1"), UUID.fromString("192e3748-12d5-4573-a8a5-479cd394a1dc")); + public static final UUID SECOND_AUTHOR_UUID = UUID.fromString("192e3748-12d5-4573-a8a5-479cd394a1dc"); public static final String CLIENT_CONFIG_VERSION = /*$ client_config_version*/ "1.0.1"; - @Override - public void onInitializeClient() { + public static void onInitializeClient() { PatPatConfigManager.reloadClient(); LoadedMods.onInitialize(); PatPatClientSoundManager.register(); PatPatClientCommandManager.register(); PatPatClientPlayerEvents.register(); - PatPatClientPacketManager.register(); + ClientMultiLoader.getInstance().registerClientPackets(PatPatClientPacketManager::register); PatPatClientReloadListener.register(); PatPatClientProxLibManager.register(); PatPatClientProxLibPacketRateLimitManager.register(); @@ -36,6 +36,7 @@ public void onInitializeClient() { PatPatClientRenderer.register(); PatPatClientKeybindingManager.register(); PatPatClientStatsConfig.registerSaveHooks(); + PatPatTestClientAgent.register(); LOGGER.info("PatPat Client Initialized"); LOGGER.debug("Debug Mode Enabled"); diff --git a/src/main/java/net/lopymine/patpat/client/command/PatPatClientCommandManager.java b/src/main/java/net/lopymine/patpat/client/command/PatPatClientCommandManager.java index 3270c0c8..94fa0b9d 100644 --- a/src/main/java/net/lopymine/patpat/client/command/PatPatClientCommandManager.java +++ b/src/main/java/net/lopymine/patpat/client/command/PatPatClientCommandManager.java @@ -1,5 +1,9 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.builder.*; import lombok.experimental.ExtensionMethod; import net.lopymine.patpat.*; @@ -7,15 +11,18 @@ import net.lopymine.patpat.client.command.info.PatPatClientInfoCommand; import net.lopymine.patpat.client.command.list.*; import net.lopymine.patpat.client.command.mod.PatPatClientModEnableCommand; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; import net.lopymine.patpat.extension.TextExtension; - -//? >=1.19 { -import net.fabricmc.fabric.api.client.command.v2.*; -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; -//?} else { -/*import net.fabricmc.fabric.api.client.command.v1.*; -import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.literal; -*///?} +import net.lopymine.patpat.logger.PatLogger; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} @ExtensionMethod(TextExtension.class) public class PatPatClientCommandManager { @@ -27,18 +34,22 @@ private PatPatClientCommandManager() { public static final PatLogger LOGGER = PatPat.LOGGER.extend("CommandManager"); public static void register() { - /*? >=1.19 {*/ - ClientCommandRegistrationCallback.EVENT.register(((dispatcher, environment) -> dispatcher - /*?} else {*/ - /*ClientCommandManager.DISPATCHER - *//*?}*/ - .register(literal("patpat-client") - .then(PatPatClientListCommand.get()) - .then(PatPatClientModEnableCommand.getOff()) - .then(PatPatClientModEnableCommand.getOn()) - .then(PatPatClientInfoCommand.get()) - .then(PatPatClientIgnoreCommand.get()) - ) - /*? >=1.19 {*/))/*?}*/; + ClientMultiLoader.getInstance().registerClientCommands((dispatcher) -> { + dispatcher.register(literal("patpat-client") + .then(PatPatClientListCommand.get()) + .then(PatPatClientModEnableCommand.getOff()) + .then(PatPatClientModEnableCommand.getOn()) + .then(PatPatClientInfoCommand.get()) + .then(PatPatClientIgnoreCommand.get()) + ); + }); + } + + public static LiteralArgumentBuilder literal(String name) { + return LiteralArgumentBuilder.literal(name); + } + + public static RequiredArgumentBuilder argument(String name, ArgumentType type) { + return RequiredArgumentBuilder.argument(name, type); } } diff --git a/src/main/java/net/lopymine/patpat/client/command/argument/EntityTypeArgumentType.java b/src/main/java/net/lopymine/patpat/client/command/argument/EntityTypeArgumentType.java index d0f983db..f7d144a6 100644 --- a/src/main/java/net/lopymine/patpat/client/command/argument/EntityTypeArgumentType.java +++ b/src/main/java/net/lopymine/patpat/client/command/argument/EntityTypeArgumentType.java @@ -1,6 +1,6 @@ package net.lopymine.patpat.client.command.argument; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.EntityType; import com.mojang.brigadier.StringReader; @@ -33,7 +33,7 @@ public static EntityType getEntityType(String name, @NotNull CommandConte @Override public EntityType parse(@NotNull StringReader reader) throws CommandSyntaxException { try { - ResourceLocation s = ResourceLocation.read(reader); + Identifier s = Identifier.read(reader); PatPatClientCommandManager.LOGGER.debug("Parsed EntityType from EntityTypeArgumentType: {}", s); EntityType entityType = VersionedThings.ENTITY_TYPE.getOptional(s).orElse(null); if (entityType == null) { diff --git a/src/main/java/net/lopymine/patpat/client/command/ignore/PatPatClientIgnoreCommand.java b/src/main/java/net/lopymine/patpat/client/command/ignore/PatPatClientIgnoreCommand.java index 26c7ca0d..3f1729f1 100644 --- a/src/main/java/net/lopymine/patpat/client/command/ignore/PatPatClientIgnoreCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/ignore/PatPatClientIgnoreCommand.java @@ -1,3 +1,5 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.ignore; import lombok.experimental.ExtensionMethod; @@ -8,7 +10,6 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; import net.lopymine.patpat.client.command.argument.EntityTypeArgumentType; import net.lopymine.patpat.client.config.list.PatPatClientIgnoreMobListConfig; @@ -18,8 +19,17 @@ import java.util.Objects; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.argument; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.argument; @ExtensionMethod(ClientCommandExtension.class) public class PatPatClientIgnoreCommand { diff --git a/src/main/java/net/lopymine/patpat/client/command/info/PatPatClientInfoCommand.java b/src/main/java/net/lopymine/patpat/client/command/info/PatPatClientInfoCommand.java index e708583f..ffc68a05 100644 --- a/src/main/java/net/lopymine/patpat/client/command/info/PatPatClientInfoCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/info/PatPatClientInfoCommand.java @@ -1,3 +1,5 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.info; import lombok.experimental.ExtensionMethod; @@ -5,9 +7,9 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.EarlyCommonMultiLoader; import net.lopymine.patpat.extension.ClientCommandExtension; import net.lopymine.patpat.utils.CommandText; @@ -15,14 +17,22 @@ import net.minecraft.network.chat.*; import net.minecraft.network.chat.ClickEvent.Action; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +//?} +//?} + +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; @ExtensionMethod(ClientCommandExtension.class) public class PatPatClientInfoCommand { - private static PatPatClientInfoCommand instance; - - public static final String PLATFORM = "Fabric/Client"; + private static PatPatClientInfoCommand INSTANCE; private final MutableComponent platformText; private final MutableComponent versionText; @@ -30,33 +40,35 @@ public class PatPatClientInfoCommand { private PatPatClientInfoCommand() { + String platform = EarlyCommonMultiLoader.getInstance().getFullPlatform(); + String version = PatPat.MOD_VERSION + "+" + PatPat.BUILD_CODE_TIME; String minecraftVersion = SharedConstants.getCurrentVersion()./*? if >=1.21.6 {*/name/*?} else {*/ /*getName *//*?}*/(); String debugInformation = "Platform: %s%nMinecraft: %s%nVersion: %s" - .formatted(PLATFORM, minecraftVersion, version); + .formatted(platform, minecraftVersion, version); Style style = Style.EMPTY .withClickEvent(CommandText.getClickEvent(Action.COPY_TO_CLIPBOARD, debugInformation)) .withHoverEvent(CommandText.getHoverEvent(HoverEvent.Action.SHOW_TEXT, CommandText.text("info.copy").finish())); - platformText = CommandText.goldenArgs("info.platform", PLATFORM) + this.platformText = CommandText.goldenArgs("info.platform", platform) .finish() .withStyle(style); - versionText = CommandText.goldenArgs("info.version", version) + this.versionText = CommandText.goldenArgs("info.version", version) .finish() .withStyle(style); - minecraftVersionText = CommandText.goldenArgs("info.minecraft_version", minecraftVersion) + this.minecraftVersionText = CommandText.goldenArgs("info.minecraft_version", minecraftVersion) .finish() .withStyle(style); } public static PatPatClientInfoCommand getInstance() { - if (instance == null) { - instance = new PatPatClientInfoCommand(); + if (INSTANCE == null) { + INSTANCE = new PatPatClientInfoCommand(); } - return instance; + return INSTANCE; } public static LiteralArgumentBuilder get() { @@ -65,9 +77,9 @@ public static LiteralArgumentBuilder get() { } public int version(CommandContext context) { - context.sendMsg(platformText); - context.sendMsg(minecraftVersionText); - context.sendMsg(versionText); + context.sendMsg(this.platformText); + context.sendMsg(this.minecraftVersionText); + context.sendMsg(this.versionText); return Command.SINGLE_SUCCESS; } diff --git a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListChangeCommand.java b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListChangeCommand.java index e0fed19e..4082a6cd 100644 --- a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListChangeCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListChangeCommand.java @@ -1,3 +1,5 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.list; import lombok.experimental.ExtensionMethod; @@ -5,21 +7,29 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; import net.lopymine.patpat.client.command.argument.*; import net.lopymine.patpat.client.command.argument.PlayerInfoArgumentType.PlayerInfo; import net.lopymine.patpat.client.config.list.PatPatClientPlayerListConfig; -import net.lopymine.patpat.common.command.list.PatPatCommonListChangeCommand; +import net.lopymine.patpat.common.command.PatPatCommonListChangeCommand; import net.lopymine.patpat.extension.ClientCommandExtension; import net.lopymine.patpat.utils.*; -import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.*; import java.util.*; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.argument; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.argument; @ExtensionMethod(ClientCommandExtension.class) public class PatPatClientListChangeCommand { @@ -40,7 +50,7 @@ public static LiteralArgumentBuilder getAdd() { public static LiteralArgumentBuilder getRemove() { return literal("remove") .then(argument(PLAYER_ARGUMENT_NAME, PlayerInfoArgumentType.player()) - .suggests((context, builder) -> SharedSuggestionProvider.suggest(ClientNetworkUtils.getOnlinePlayersFromUuids(context.getSource().getClient().getConnection()), builder)) + .suggests((context, builder) -> SharedSuggestionProvider.suggest(ClientNetworkUtils.getOnlinePlayersFromUuids(), builder)) .executes(context -> onListChange(context, false))); } diff --git a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListCommand.java b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListCommand.java index 7508870a..2782377f 100644 --- a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListCommand.java @@ -1,9 +1,18 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.list; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; - -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; public class PatPatClientListCommand { diff --git a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListInfoCommand.java b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListInfoCommand.java index fe0d7ba5..82d084c0 100644 --- a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListInfoCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListInfoCommand.java @@ -1,3 +1,5 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.list; import lombok.experimental.ExtensionMethod; @@ -5,17 +7,25 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; import net.lopymine.patpat.client.config.*; import net.lopymine.patpat.client.config.list.PatPatClientPlayerListConfig; import net.lopymine.patpat.client.config.sub.*; -import net.lopymine.patpat.common.command.list.PatPatCommonListChangeCommand; +import net.lopymine.patpat.common.command.PatPatCommonListChangeCommand; import net.lopymine.patpat.extension.ClientCommandExtension; import java.util.*; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; @ExtensionMethod(ClientCommandExtension.class) public class PatPatClientListInfoCommand { diff --git a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListSetModeCommand.java b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListSetModeCommand.java index d013f384..66365dd6 100644 --- a/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListSetModeCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/list/PatPatClientListSetModeCommand.java @@ -1,10 +1,11 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.list; import lombok.experimental.ExtensionMethod; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; import net.lopymine.patpat.client.command.argument.*; import net.lopymine.patpat.client.config.PatPatClientConfig; @@ -15,8 +16,17 @@ import net.minecraft.network.chat.*; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.argument; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.argument; @ExtensionMethod(ClientCommandExtension.class) public class PatPatClientListSetModeCommand { diff --git a/src/main/java/net/lopymine/patpat/client/command/mod/PatPatClientModEnableCommand.java b/src/main/java/net/lopymine/patpat/client/command/mod/PatPatClientModEnableCommand.java index 50f7aeed..627ccd50 100644 --- a/src/main/java/net/lopymine/patpat/client/command/mod/PatPatClientModEnableCommand.java +++ b/src/main/java/net/lopymine/patpat/client/command/mod/PatPatClientModEnableCommand.java @@ -1,10 +1,11 @@ +//~ client_fabric_commands + package net.lopymine.patpat.client.command.mod; import lombok.experimental.ExtensionMethod; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.extension.ClientCommandExtension; @@ -13,7 +14,16 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.*; -import static net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.ClientCommandManager.literal; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; +*///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; + //?} +//?} +import static net.lopymine.patpat.client.command.PatPatClientCommandManager.literal; @ExtensionMethod(ClientCommandExtension.class) public class PatPatClientModEnableCommand { diff --git a/src/main/java/net/lopymine/patpat/client/config/PatPatClientConfig.java b/src/main/java/net/lopymine/patpat/client/config/PatPatClientConfig.java index 0412f6e1..36488aa8 100644 --- a/src/main/java/net/lopymine/patpat/client/config/PatPatClientConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/PatPatClientConfig.java @@ -10,6 +10,7 @@ import net.lopymine.patpat.client.config.sub.*; import net.lopymine.patpat.common.Version; import net.lopymine.patpat.common.config.PatPatConfigManager; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.utils.CodecUtils; import net.lopymine.patpat.utils.ConfigUtils; diff --git a/src/main/java/net/lopymine/patpat/client/config/PatPatClientStatsConfig.java b/src/main/java/net/lopymine/patpat/client/config/PatPatClientStatsConfig.java index 819d08c6..cc34ce0a 100644 --- a/src/main/java/net/lopymine/patpat/client/config/PatPatClientStatsConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/PatPatClientStatsConfig.java @@ -3,14 +3,14 @@ import java.util.function.Supplier; import lombok.*; import net.lopymine.patpat.*; -import net.minecraft.resources.ResourceLocation; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.lopymine.patpat.logger.PatLogger; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.*; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; - import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.config.PatPatConfigManager; import net.lopymine.patpat.utils.*; @@ -44,7 +44,7 @@ private PatPatClientStatsConfig() { public void count(LivingEntity pattedEntity) { this.totalPatsCounter.totalPats++; - ResourceLocation id = VersionedThings.ENTITY_TYPE.getKey(pattedEntity.getType()); + Identifier id = VersionedThings.ENTITY_TYPE.getKey(pattedEntity.getType()); if (id == null) { return; } @@ -60,7 +60,7 @@ public void count(LivingEntity pattedEntity) { public static void registerSaveHooks() { AutoSaveManager.start(); - ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> { + ClientMultiLoader.getInstance().registerOnClientStop(() -> { PatPatClientStatsConfig.getInstance().save(); }); } diff --git a/src/main/java/net/lopymine/patpat/client/config/PatPatDebugConfig.java b/src/main/java/net/lopymine/patpat/client/config/PatPatDebugConfig.java new file mode 100644 index 00000000..d01d7756 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/client/config/PatPatDebugConfig.java @@ -0,0 +1,63 @@ +package net.lopymine.patpat.client.config; + +import lombok.*; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.lopymine.patpat.logger.PatLogger; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.client.PatPatClient; +import net.lopymine.patpat.common.config.PatPatConfigManager; +import net.lopymine.patpat.utils.CodecUtils; +import net.lopymine.patpat.utils.ConfigUtils; + +import java.io.File; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +import static net.lopymine.patpat.utils.CodecUtils.option; + +@Setter +@Getter +@AllArgsConstructor +public class PatPatDebugConfig { + + public static final boolean DEBUG_ENABLED = Boolean.getBoolean("patpat.debug"); + + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + option("selfPat", false, Codec.BOOL, PatPatDebugConfig::isSelfPat) + ).apply(inst, PatPatDebugConfig::new)); + + private static final PatLogger LOGGER = PatPatClient.LOGGER.extend("Debug-Config"); + private static final File CONFIG_FILE = PatPatConfigManager.CONFIG_PATH.resolve(PatPat.MOD_ID + "-debug.json5").toFile(); + private static PatPatDebugConfig instance; + + private boolean selfPat; + + public static PatPatDebugConfig getInstance() { + return instance == null ? reload() : instance; + } + + public static PatPatDebugConfig reload() { + instance = PatPatDebugConfig.read(); + return instance; + } + + public static Supplier getNewInstance() { + return () -> CodecUtils.parseNewInstanceHacky(CODEC); + } + + private static PatPatDebugConfig read() { + return ConfigUtils.readConfig(CODEC, CONFIG_FILE, LOGGER); + } + + public void saveAsync() { + CompletableFuture.runAsync(this::save); + } + + public void save() { + ConfigUtils.saveConfig(this, CODEC, CONFIG_FILE, LOGGER); + } + +} diff --git a/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientIgnoreMobListConfig.java b/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientIgnoreMobListConfig.java index 79c69b28..6e6b9c7c 100644 --- a/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientIgnoreMobListConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientIgnoreMobListConfig.java @@ -3,10 +3,10 @@ import lombok.Getter; import net.lopymine.patpat.common.config.list.AbstractListConfig; import net.lopymine.patpat.utils.*; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.EntityType; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.config.PatPatConfigManager; @@ -45,7 +45,7 @@ public boolean isIgnored(@NotNull EntityType type) { @Override protected String encode(EntityType element) { - ResourceLocation entityTypeResource = VersionedThings.ENTITY_TYPE.getKey(element); + Identifier entityTypeResource = VersionedThings.ENTITY_TYPE.getKey(element); if (entityTypeResource == null) { return null; } @@ -54,7 +54,7 @@ protected String encode(EntityType element) { @Override protected EntityType decode(String line) { - EntityType entityType = VersionedThings.ENTITY_TYPE.getOptional(ResourceLocationUtils.parse(line)).orElse(null); + EntityType entityType = VersionedThings.ENTITY_TYPE.getOptional(RLUtils.parse(line)).orElse(null); if (entityType == null) { this.getLogger().error("Failed to find entity type from line: \"{}\"", line); return null; diff --git a/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientPlayerListConfig.java b/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientPlayerListConfig.java index e249a026..22ccf585 100644 --- a/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientPlayerListConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientPlayerListConfig.java @@ -2,7 +2,7 @@ import lombok.Getter; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.config.PatPatConfigManager; import net.lopymine.patpat.common.config.list.*; diff --git a/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientProxLibServersWhitelistConfig.java b/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientProxLibServersWhitelistConfig.java index 4ee04c63..846e0117 100644 --- a/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientProxLibServersWhitelistConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/list/PatPatClientProxLibServersWhitelistConfig.java @@ -1,7 +1,7 @@ package net.lopymine.patpat.client.config.list; import lombok.Getter; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.config.PatPatConfigManager; import net.lopymine.patpat.common.config.list.AbstractListConfig; @@ -13,11 +13,12 @@ @Getter public class PatPatClientProxLibServersWhitelistConfig extends AbstractListConfig { + public static final List DEFAULT_VALUES = List.of("127.0.0.1", "localhost"); private static final PatLogger LOGGER = PatPatClient.LOGGER.extend(PatPatClientProxLibServersWhitelistConfig.class.getSimpleName()); private static final File CONFIG_FILE = PatPatConfigManager.CONFIG_PATH.resolve("proximity_packet_servers_whitelist.txt").toFile(); private static final PatPatClientProxLibServersWhitelistConfig INSTANCE = new PatPatClientProxLibServersWhitelistConfig(); - public static final List DEFAULT_VALUES = List.of("127.0.0.1", "localhost"); + private final List values = new ArrayList<>(); diff --git a/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateManager.java b/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateManager.java index 589e1cd3..03c00ca8 100644 --- a/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateManager.java +++ b/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateManager.java @@ -3,7 +3,7 @@ import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.common.Version; -import net.lopymine.patpat.common.migrate.*; +import net.lopymine.patpat.common.config.migrate.*; public class PatPatClientConfigMigrateManager extends AbstractPatPatConfigMigrateManager { diff --git a/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion0.java b/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion0.java index 6aafee11..6bb37dae 100644 --- a/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion0.java +++ b/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion0.java @@ -12,7 +12,7 @@ import net.lopymine.patpat.client.config.resourcepack.ListMode; import net.lopymine.patpat.client.config.sub.*; import net.lopymine.patpat.common.config.vector.Vec3f; -import net.lopymine.patpat.common.migrate.AbstractConfigMigrateHandler; +import net.lopymine.patpat.common.config.migrate.AbstractConfigMigrateHandler; import net.lopymine.patpat.utils.*; import java.io.*; diff --git a/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion100.java b/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion100.java index 393fff3a..2f3fa388 100644 --- a/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion100.java +++ b/src/main/java/net/lopymine/patpat/client/config/migrate/PatPatClientConfigMigrateVersion100.java @@ -7,7 +7,7 @@ import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.common.Version; -import net.lopymine.patpat.common.migrate.AbstractConfigMigrateHandler; +import net.lopymine.patpat.common.config.migrate.AbstractConfigMigrateHandler; import java.io.File; import java.io.FileNotFoundException; diff --git a/src/main/java/net/lopymine/patpat/client/config/resourcepack/CustomAnimationSettingsConfig.java b/src/main/java/net/lopymine/patpat/client/config/resourcepack/CustomAnimationSettingsConfig.java index 3ee847a6..25853264 100644 --- a/src/main/java/net/lopymine/patpat/client/config/resourcepack/CustomAnimationSettingsConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/resourcepack/CustomAnimationSettingsConfig.java @@ -7,9 +7,9 @@ import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.resourcepack.PatPatClientResourcePackManager; -import net.lopymine.patpat.utils.IdentifierUtils; +import net.lopymine.patpat.utils.RLUtils; import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.Resource; import net.minecraft.world.entity.LivingEntity; import java.io.*; @@ -20,20 +20,20 @@ public final class CustomAnimationSettingsConfig { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.STRING.fieldOf("texture").xmap(IdentifierUtils::vanillaId, ResourceLocation::toString).forGetter(CustomAnimationSettingsConfig::getTexture), + Codec.STRING.fieldOf("texture").xmap(RLUtils::vanillaId, Identifier::toString).forGetter(CustomAnimationSettingsConfig::getTexture), Codec.INT.fieldOf("duration").forGetter(CustomAnimationSettingsConfig::getDuration), FrameConfig.CODEC.fieldOf("frame").forGetter(CustomAnimationSettingsConfig::getFrameConfig), SoundConfig.STRINGED_CODEC.optionalFieldOf("sound").forGetter(CustomAnimationSettingsConfig::getOptionalSoundConfig) ).apply(instance, CustomAnimationSettingsConfig::new)); public static final CustomAnimationSettingsConfig DEFAULT_PATPAT_ANIMATION = new CustomAnimationSettingsConfig( - IdentifierUtils.modId("textures/default/patpat.png"), + RLUtils.modId("textures/default/patpat.png"), 240, FrameConfig.DEFAULT_FRAME, Optional.of(SoundConfig.PAT_PAT_SOUND) ); - private final ResourceLocation texture; + private final Identifier texture; private final int duration; private final FrameConfig frameConfig; @Nullable @@ -41,7 +41,7 @@ public final class CustomAnimationSettingsConfig { private int textureWidth; private int textureHeight; - public CustomAnimationSettingsConfig(ResourceLocation texture, int duration, FrameConfig frameConfig, Optional soundConfig) { + public CustomAnimationSettingsConfig(Identifier texture, int duration, FrameConfig frameConfig, Optional soundConfig) { this.texture = texture; this.duration = duration; this.frameConfig = frameConfig; @@ -93,7 +93,7 @@ private void loadSize() { return; } //?} - InputStream inputStream = resource/*? >=1.19 {*/.get().open();/*?} else {*//*.getInputStream()*//*?}*/; + InputStream inputStream = resource/*? if >=1.19 {*/.get().open()/*?} else {*//*.getInputStream()*//*?}*/; NativeImage nativeImage = NativeImage.read(inputStream); this.textureWidth = nativeImage.getWidth(); this.textureHeight = nativeImage.getHeight(); diff --git a/src/main/java/net/lopymine/patpat/client/config/sub/PatPatClientFunConfig.java b/src/main/java/net/lopymine/patpat/client/config/sub/PatPatClientFunConfig.java index 56e9de4e..a4b4b10d 100644 --- a/src/main/java/net/lopymine/patpat/client/config/sub/PatPatClientFunConfig.java +++ b/src/main/java/net/lopymine/patpat/client/config/sub/PatPatClientFunConfig.java @@ -4,7 +4,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.function.Supplier; import lombok.*; -import net.lopymine.patpat.PatTranslation; +import net.lopymine.patpat.translation.PatTranslation; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.config.EnumWithText; import net.lopymine.patpat.utils.CodecUtils; diff --git a/src/main/java/net/lopymine/patpat/client/event/PatPatClientPlayerEvents.java b/src/main/java/net/lopymine/patpat/client/event/PatPatClientPlayerEvents.java index af4be7ba..4c792892 100644 --- a/src/main/java/net/lopymine/patpat/client/event/PatPatClientPlayerEvents.java +++ b/src/main/java/net/lopymine/patpat/client/event/PatPatClientPlayerEvents.java @@ -1,7 +1,6 @@ package net.lopymine.patpat.client.event; -import net.fabricmc.fabric.api.client.networking.v1.*; - +import net.lopymine.patpat.entrypoint.ClientMultiLoader; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.packet.*; import net.lopymine.patpat.common.Version; @@ -13,7 +12,10 @@ private PatPatClientPlayerEvents() { } public static void register() { - ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> { + ClientMultiLoader.getInstance().registerClientPlayerLogListener((loggingIn) -> { + if (loggingIn) { + return; + } PatPatClientPacketManager.setCurrentPatPatServerPacketVersion(Version.PACKET_V1_VERSION); PatPatClient.LOGGER.debug("Disconnected from the server, reset current packets version to V1"); }); diff --git a/src/main/java/net/lopymine/patpat/client/keybinding/PatPatClientKeybindingManager.java b/src/main/java/net/lopymine/patpat/client/keybinding/PatPatClientKeybindingManager.java index c89635b8..e115c018 100644 --- a/src/main/java/net/lopymine/patpat/client/keybinding/PatPatClientKeybindingManager.java +++ b/src/main/java/net/lopymine/patpat/client/keybinding/PatPatClientKeybindingManager.java @@ -1,21 +1,28 @@ package net.lopymine.patpat.client.keybinding; import lombok.Getter; -import net.minecraft.client.KeyMapping; +import com.mojang.blaze3d.platform.InputConstants; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.minecraft.client.gui.screens.options.controls.*; +//? if >=1.19.4 { + +import net.lopymine.patpat.mixin.KeyBindsScreenAccessor; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +//?} +import net.minecraft.client.gui.screens./*? if >=1.21 {*/options./*?}*/controls.*; +import net.minecraft.client.KeyMapping; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.PatPatClientConfig; + //? if >=1.21.9 { -import net.lopymine.patpat.PatPat; -import net.lopymine.patpat.utils.IdentifierUtils; +import net.lopymine.patpat.utils.RLUtils; //?} public class PatPatClientKeybindingManager { //? if >=1.21.9 { - public static net.minecraft.client.KeyMapping.Category CATEGORY = net.minecraft.client.KeyMapping.Category.register(IdentifierUtils.modId(PatPat.MOD_ID)); + public static final net.minecraft.client.KeyMapping.Category CATEGORY = net.minecraft.client.KeyMapping.Category.register(RLUtils.modId("keybinding")); //?} @Getter @@ -35,7 +42,50 @@ public static void register() { } private static void registerKeybinding(KeyMapping keyBinding) { - KeyBindingHelper.registerKeyBinding(keyBinding); + ClientMultiLoader.getInstance().registerKeybinding(keyBinding); + } + + public static void handlePatPatKeybindingOnKeyPressed( + KeyMapping mapping, + /*? if >=1.18 {*/KeyBindsScreen/*?} else {*/ /*KeyBindsScreen *//*?}*/ screen, + int keyCode, + int scanCode, + Runnable cancel + ) { + if (mapping instanceof PatPatKeybinding keybinding) { + boolean bl = keybinding.addBindingKey(getKey(keyCode, scanCode)); + if (bl) { + keybinding.sendBindingKeys(); + screen.selectedKey = null; + } + //? if >=1.19.4 { + ((KeyBindsScreenAccessor) (screen)).getList().refreshEntries(); + //?} + cancel.run(); + } + } + + public static void handlePatPatKeybindingOnMouseClick( + KeyMapping mapping, + /*? if >=1.18 {*/KeyBindsScreen/*?} else {*/ /*KeyBindsScreen *//*?}*/ screen, + int button, + Runnable cancel + ) { + if (mapping instanceof PatPatKeybinding keybinding) { + boolean bl = keybinding.addBindingKey(InputConstants.Type.MOUSE.getOrCreate(button)); + if (bl) { + keybinding.sendBindingKeys(); + screen.selectedKey = null; + } + //? if >=1.19.4 { + ((KeyBindsScreenAccessor) (screen)).getList().refreshEntries(); + //?} + cancel.run(); + } + } + + public static InputConstants.Key getKey(int keyCode, int scanCode) { + return keyCode == -1 ? InputConstants.Type.SCANCODE.getOrCreate(scanCode) : InputConstants.Type.KEYSYM.getOrCreate(keyCode); } } \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/client/keybinding/PatPatKeybinding.java b/src/main/java/net/lopymine/patpat/client/keybinding/PatPatKeybinding.java index c433e757..595d6ab6 100644 --- a/src/main/java/net/lopymine/patpat/client/keybinding/PatPatKeybinding.java +++ b/src/main/java/net/lopymine/patpat/client/keybinding/PatPatKeybinding.java @@ -27,6 +27,7 @@ public class PatPatKeybinding extends KeyMapping { ); } + @Getter private final PressableKeybindingCombination combination = new PressableKeybindingCombination(); @Getter private boolean binding; @@ -34,7 +35,7 @@ public class PatPatKeybinding extends KeyMapping { private boolean canStartBinding = true; public PatPatKeybinding(KeybindingCombination patCombination) { - super("patpat.keybinding.pat", -1, /*? if <1.21.9 {*//*PatPat.MOD_NAME + "." + PatPat.MOD_NAME*//*?} else {*/PatPatClientKeybindingManager.CATEGORY/*?}*/); + super("patpat.keybinding.pat", -1, /*? if <1.21.9 {*//*PatPat.MOD_NAME*//*?} else {*/PatPatClientKeybindingManager.CATEGORY/*?}*/); this.combination.setAttributeKey(patCombination.getAttributeKey()); this.combination.setKey(patCombination.getKey()); } @@ -136,11 +137,15 @@ public Component getTranslatedKeyMessage() { /*if (this.combination.onlyOneKey()) { return this.getFullTranslatedKeyMessage(); } else { - return TextUtils.literal("..."); + return TextUtils.literal(this.isSelected() ? "..." : "< ... >"); } *///?} } + public boolean isSelected() { + return Minecraft.getInstance().screen instanceof net.minecraft.client.gui.screens./*? if >=1.21 {*/options./*?}*/controls.KeyBindsScreen screen && screen.selectedKey == this; + } + @NotNull public Component getFullTranslatedKeyMessage() { return this.combination.getCombinationLocalizedComponent(!this.isBinding()); diff --git a/src/main/java/net/lopymine/patpat/client/keybinding/PressableKeybindingCombination.java b/src/main/java/net/lopymine/patpat/client/keybinding/PressableKeybindingCombination.java index 57f7185a..825b7dfe 100644 --- a/src/main/java/net/lopymine/patpat/client/keybinding/PressableKeybindingCombination.java +++ b/src/main/java/net/lopymine/patpat/client/keybinding/PressableKeybindingCombination.java @@ -3,6 +3,8 @@ import lombok.*; import com.mojang.blaze3d.platform.InputConstants.Key; +import net.lopymine.patpat.mixin.KeyMappingAccessor; +import net.minecraft.client.Minecraft; @Getter(AccessLevel.PRIVATE) public class PressableKeybindingCombination extends KeybindingCombination { @@ -49,24 +51,44 @@ public boolean onlyOneKey() { public boolean allPressed() { if (this.getKey() != null && this.getAttributeKey() != null) { - return this.isKeyPressed() && this.isAttributeKeyPressed(); + return this.isKeyPressed() && this.isSecondKeyPressed(); } if (this.getKey() != null) { return this.isKeyPressed(); } if (this.getAttributeKey() != null) { - return this.isAttributeKeyPressed(); + return this.isSecondKeyPressed(); } return false; } + private boolean isSecondKeyPressed() { + //? if >=1.19 { + if (Minecraft.getInstance().options.toggleCrouch().get() + && Minecraft.getInstance().options.keyShift.isDown() + && ((KeyMappingAccessor) (Minecraft.getInstance().options.keyShift)).getKeyMappingKey().equals(this.getAttributeKey()) + ) { + return Minecraft.getInstance().options.keyShift.isDown(); + } + //?} else { + /*if (Minecraft.getInstance().options.toggleCrouch + && Minecraft.getInstance().options.keyShift.isDown() + && ((KeyMappingAccessor)(Minecraft.getInstance().options.keyShift)).getKeyMappingKey().equals(this.getAttributeKey()) + ) { + return Minecraft.getInstance().options.keyShift.isDown(); + } + *///?} + + return this.isAttributeKeyPressed(); + } + public boolean anyPressed() { boolean bl = false; if (this.getKey() != null) { bl |= this.isKeyPressed(); } if (this.getAttributeKey() != null) { - bl |= this.isAttributeKeyPressed(); + bl |= this.isSecondKeyPressed(); } return bl; } diff --git a/src/main/java/net/lopymine/patpat/client/manager/PatPatClientManager.java b/src/main/java/net/lopymine/patpat/client/manager/PatPatClientManager.java index b7508cb8..3791b42a 100644 --- a/src/main/java/net/lopymine/patpat/client/manager/PatPatClientManager.java +++ b/src/main/java/net/lopymine/patpat/client/manager/PatPatClientManager.java @@ -3,8 +3,9 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.ExtensionMethod; -import net.fabricmc.loader.api.FabricLoader; +import net.lopymine.patpat.client.keybinding.*; import net.lopymine.patpat.extension.*; +import net.lopymine.patpat.tests.PatPatTestMode; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.util.Mth; @@ -12,17 +13,14 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.*; -import com.mojang.authlib.GameProfile; - -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.client.config.list.PatPatClientIgnoreMobListConfig; import net.lopymine.patpat.client.config.resourcepack.CustomAnimationSettingsConfig; import net.lopymine.patpat.client.config.resourcepack.PlayerConfig; -import net.lopymine.patpat.client.keybinding.PatPatClientKeybindingManager; import net.lopymine.patpat.client.render.PatPatClientRenderer; -import net.lopymine.patpat.client.render.PatPatClientRenderer.PatPacket; +import net.lopymine.patpat.client.render.PatPatClientRenderer.PacketPat; import net.lopymine.patpat.entity.PatEntity; import net.lopymine.patpat.utils.ProfilerUtils; import net.lopymine.patpat.utils.VersionedThings; @@ -34,7 +32,8 @@ @ExtensionMethod(value = {EntityExtension.class, GameProfileExtension.class}) public class PatPatClientManager { - private static final Map PAT_ENTITIES = new HashMap<>(); + // TODO: сделать либо отдельный метод с immutable мапой, либо плдучение по UUID для GameTest + public static final Map PAT_ENTITIES = new HashMap<>(); public static final PatLogger LOGGER = PatPatClient.LOGGER.extend("PatManager"); @@ -48,7 +47,7 @@ private PatPatClientManager() { @Nullable public static PatEntity getPatEntity(@NotNull LivingEntity entity) { - return PAT_ENTITIES.get(entity.getUUID()); + return PAT_ENTITIES.getOrDefault(entity.getUUID(), null); } public static void tickEntities() { @@ -81,6 +80,9 @@ public static PatEntity pat(@NotNull LivingEntity entity, @NotNull PlayerConfig } public static boolean expired(PatEntity patEntity, float tickDelta) { + if (PatPatTestMode.isEnabled()) { + return false; + } CustomAnimationSettingsConfig animationConfig = patEntity.getAnimation(); int duration = animationConfig.getDuration(); return patEntity.getProgress(tickDelta) > duration; @@ -111,7 +113,12 @@ public static void requestPat() { return; } - if (!PatPatClientKeybindingManager.getPatKeybinding().isDown()) { + PatPatKeybinding patKeybinding = PatPatClientKeybindingManager.getPatKeybinding(); + if (patKeybinding == null) { + return; + } + + if (!patKeybinding.isDown()) { return; } @@ -139,9 +146,11 @@ public static void requestPat() { return; } - PatPatClientRenderer.registerClientPacket(new PatPacket(pattedEntity, PlayerConfig.currentSession(), player, false)); + PatPatClientRenderer.registerClientPacket(new PacketPat(pattedEntity, PlayerConfig.currentSession(), player, false)); PatPatClientManager.patCooldown = 4; + Minecraft.getInstance().options.keyUse.setDown(false); + Minecraft.getInstance().options.keyUse.clickCount = 0; } public static boolean canPat() { @@ -149,7 +158,11 @@ public static boolean canPat() { if (!config.getMainConfig().isModEnabled()) { return false; } - if (!PatPatClientKeybindingManager.getPatKeybinding().isDown()) { + PatPatKeybinding patKeybinding = PatPatClientKeybindingManager.getPatKeybinding(); + if (patKeybinding == null) { + return false; + } + if (!patKeybinding.isDown()) { return false; } return getPatEntityFromHitResult() != null; @@ -175,10 +188,10 @@ public static LivingEntity getPatEntityFromHitResult() { } ProfilerUtils.push("patpat$pick"); - //? if >=1.20.5 { - double blockInteractionRange = player.blockInteractionRange(); + //? if >=1.20.5 && <=1.21.10 { + /*double blockInteractionRange = player.blockInteractionRange(); double entityInteractionRange = player.entityInteractionRange(); - //?} + *///?} //? if >=1.21.2 { float tickDelta = minecraft.getDeltaTracker().getGameTimeDeltaPartialTick(true); @@ -189,9 +202,11 @@ public static LivingEntity getPatEntityFromHitResult() { *///?} cameraEntity.mark(true); - //? if >=1.20.5 { - HitResult result = minecraft.gameRenderer.pick(cameraEntity, blockInteractionRange, entityInteractionRange, tickDelta); - //?} else { + //? if >=1.21.11 { + HitResult result = player.raycastHitResult(tickDelta, cameraEntity); + //?} elif >=1.20.5 { + /*HitResult result = minecraft.gameRenderer.pick(cameraEntity, blockInteractionRange, entityInteractionRange, tickDelta); + *///?} else { /*HitResult oldResult = minecraft.hitResult; minecraft.gameRenderer.pick(tickDelta); HitResult result = minecraft.hitResult; diff --git a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientNetworkManager.java b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientNetworkManager.java index 85a9748c..e69de29b 100644 --- a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientNetworkManager.java +++ b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientNetworkManager.java @@ -1,50 +0,0 @@ -package net.lopymine.patpat.client.packet; - -/*? if <1.19.4 {*/ -/*import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -*//*?}*/ - -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.*; - -import net.lopymine.patpat.packet.*; - -public class PatPatClientNetworkManager { - - public static > void registerReceiver(PatPatPacketType id, PacketListener listener) { - ClientPlayNetworking.registerGlobalReceiver(/*? if >=1.19.4 {*/ id.getPacketId(), /*?} else {*//*id.getId(),*//*?}*/ - /*? >=1.20.5 {*/(packet, context) -> { PacketSender responseSender = context.responseSender();/*?} elif <=1.20.4 && >=1.19.4 {*//*(packet, player, responseSender) -> {*//*?} else {*//*(client, handler, buf, responseSender) -> { T packet = id.getFactory().apply(buf); *//*?}*/ - if (packet instanceof PingPatPacket pingPacket) { - pingPacket.setPacketSender(responseSender); - } - listener.call(packet); - }); - } - - public static void sendPacketToServer(BasePatPatPacket packet) { - //? if <1.19.4 { - /*ResourceLocation id = packet.getPatPatType().getId(); - FriendlyByteBuf buf = PacketByteBufs.create(); - packet.write(buf); - *///?} - if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { - //? if >=1.19.4 { - pingPong.pong(packet); - //?} else { - /*pingPong.pong(id, buf); - *///?} - } else { - //? if >=1.19.4 { - ClientPlayNetworking.send(packet); - //?} else { - /*ClientPlayNetworking.send(id, buf); - *///?} - } - } - - public interface PacketListener { - void call(T packet); - } - -} diff --git a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientPacketManager.java b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientPacketManager.java index c51c744f..cd6486d9 100644 --- a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientPacketManager.java +++ b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientPacketManager.java @@ -1,7 +1,11 @@ package net.lopymine.patpat.client.packet; import lombok.*; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.lopymine.patpat.logger.PatLogger; +import net.lopymine.patpat.client.config.list.PatPatClientPlayerListConfig; +import net.lopymine.patpat.client.render.PatPatClientRenderer.PacketPat; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader.ClientPacketRegister; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.social.PlayerSocialManager; import net.minecraft.client.multiplayer.ClientLevel; @@ -13,12 +17,8 @@ import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.client.config.resourcepack.*; -import net.lopymine.patpat.client.config.list.PatPatClientPlayerListConfig; import net.lopymine.patpat.client.render.PatPatClientRenderer; -import net.lopymine.patpat.client.render.PatPatClientRenderer.PatPacket; import net.lopymine.patpat.common.Version; -import net.lopymine.patpat.compat.flashback.FlashbackManager; -import net.lopymine.patpat.compat.replaymod.ReplayModManager; import net.lopymine.patpat.packet.*; import net.lopymine.patpat.packet.c2s.*; import net.lopymine.patpat.packet.s2c.*; @@ -32,27 +32,26 @@ private PatPatClientPacketManager() { } public static final PatLogger LOGGER = PatPatClient.LOGGER.extend("PacketManager"); - + @Getter @Setter private static Version currentPatPatServerPacketVersion = Version.PACKET_V1_VERSION; - public static void register() { - PatPatClientNetworkManager.registerReceiver(HelloPatPatPlayerS2CPacket.TYPE, PatPatClientPacketManager::handleHelloPacket); + public static void register(ClientPacketRegister register) { + register.register(HelloPatPatPlayerS2CPacket.TYPE, PatPatClientPacketManager::handleHelloPacket); - PatPatClientNetworkManager.registerReceiver(PatEntityS2CPacket.TYPE, packet -> { + register.register(PatEntityS2CPacket.TYPE, packet -> { PatPatClientProxLibManager.disableIfEnabledBecauseReceivedPacketFromServer(); - handlePatting(packet, FlashbackManager.isInReplay() || ReplayModManager.isInReplay()); + handlePatting(packet, false); }); - PatPatClientNetworkManager.registerReceiver(PatEntityS2CPacketV2.TYPE, packet -> { + register.register(PatEntityS2CPacketV2.TYPE, packet -> { PatPatClientProxLibManager.disableIfEnabledBecauseReceivedPacketFromServer(); - handlePatting(packet, FlashbackManager.isInReplay() || ReplayModManager.isInReplay()); + handlePatting(packet, false); }); - PatPatClientNetworkManager.registerReceiver(SelfPatEntityS2CPacket.TYPE, packet -> handlePatting(packet, true)); - - PatPatClientNetworkManager.registerReceiver(SelfPatEntityS2CPacketV2.TYPE, packet -> handlePatting(packet, true)); + register.register(SelfPatEntityS2CPacket.TYPE, packet -> handlePatting(packet, true)); + register.register(SelfPatEntityS2CPacketV2.TYPE, packet -> handlePatting(packet, true)); } private static void handleHelloPacket(HelloPatPatPlayerS2CPacket packet) { @@ -77,7 +76,7 @@ private static void handleHelloPacket(HelloPatPatPlayerS2CPacket packet) { } HelloPatPatServerC2SPacket pongPacket = packet.getPongPacket(); LOGGER.debug("[PONG] Sending {} packet to the server...", pongPacket.getClass().getSimpleName()); - PatPatClientNetworkManager.sendPacketToServer(pongPacket); + ClientMultiLoader.getInstance().sendPacketToServer(pongPacket); } public static void handlePatting(S2CPatPacket packet, boolean replayModPacket) { @@ -102,8 +101,19 @@ public static void handlePatting(S2CPatPacket packet, boolean replayModPacket } LOGGER.debug("Patted entity with name {} ", pattedEntity.getName().getString()); Entity whoPattedEntity = packet.getWhoPattedEntity(clientWorld); - if(whoPattedEntity == null) { - LOGGER.debug("Packet declined, because who patted entity is null"); + if (whoPattedEntity == null) { + if (!(packet instanceof PatEntityS2CPacketV2 packetV2)) { + LOGGER.debug("Packet declined, because packetV1 and whoPattedEntity is null"); + return; + } + if (packetV2.getWhoPattedId() != Integer.MIN_VALUE) { + LOGGER.debug("Packet declined, because who patted entity is null"); + return; + } + + PacketPat patPacket = new PacketPat(pattedLivingEntity, PlayerConfig.of(null, null), player, replayModPacket); + PatPatClientRenderer.registerServerPacket(patPacket); + LOGGER.debug("Packet handled! (Pat from server) Packet Data: {}", patPacket.toString()); return; } LOGGER.debug("Who patted entity with name {}", whoPattedEntity.getName().getString()); @@ -122,7 +132,7 @@ public static void handlePatting(S2CPatPacket packet, boolean replayModPacket LOGGER.debug("Packet declined, because option 'Pat Me' is disabled"); return; } - PatPacket patPacket = new PatPacket(pattedLivingEntity, PlayerConfig.of(whoPattedEntity.getName().getString(), whoPattedUuid), player, replayModPacket); + PacketPat patPacket = new PacketPat(pattedLivingEntity, PlayerConfig.of(whoPattedEntity.getName().getString(), whoPattedUuid), player, replayModPacket); PatPatClientRenderer.registerServerPacket(patPacket); LOGGER.debug("Packet handled! Packet Data: {}", patPacket.toString()); } @@ -140,7 +150,7 @@ public static boolean isBlocked(UUID playerUuid) { /*? >=1.17 {*/ || socialManager.shouldHideMessageFrom(playerUuid)/*?}*/; } - public static net.lopymine.patpat.packet.PatPacket getPatPacket(Entity pattedEntity) { + public static PatPacket getPatPacket(Entity pattedEntity) { if (PatPatClientPacketManager.getCurrentPatPatServerPacketVersion().isGreaterOrEqualThan(Version.PACKET_V2_VERSION)) { LOGGER.debug("Getting pat packet... Using V2 version"); return new PatEntityC2SPacketV2(pattedEntity); diff --git a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibManager.java b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibManager.java index c27c1135..20e051c7 100644 --- a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibManager.java +++ b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibManager.java @@ -1,14 +1,13 @@ package net.lopymine.patpat.client.packet; -import net.fabricmc.fabric.api.client.networking.v1.*; - -import net.lopymine.patpat.PatLogger; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.client.config.list.PatPatClientProxLibServersWhitelistConfig; import net.lopymine.patpat.compat.LoadedMods; import net.lopymine.patpat.compat.flashback.FlashbackManager; import net.lopymine.patpat.compat.replaymod.ReplayModManager; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.lopymine.patpat.logger.PatLogger; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerData; @@ -24,7 +23,10 @@ private PatPatClientProxLibManager() { public static void register() { PatPatClientProxLibManager.reset(); - ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> { + ClientMultiLoader.getInstance().registerClientPlayerLogListener((loggedIn) -> { + if (loggedIn) { + return; + } if (PatPatClientConfig.getInstance().getProximityPacketsConfig().isProximityPacketsEnabled()) { PatPatClientProxLibManager.reset(); } diff --git a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketManager.java b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketManager.java index 7c7f567f..475359f6 100644 --- a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketManager.java +++ b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketManager.java @@ -1,14 +1,13 @@ package net.lopymine.patpat.client.packet; -import net.lopymine.patpat.PatLogger; -import net.lopymine.patpat.client.PatPatClient; -import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.compat.LoadedMods; -import net.lopymine.patpat.compat.flashback.*; -import net.lopymine.patpat.compat.replaymod.*; +import net.lopymine.patpat.compat.flashback.FlashbackManager; +import net.lopymine.patpat.compat.replaymod.ReplayModManager; +import net.lopymine.patpat.logger.PatLogger; +import net.lopymine.patpat.client.PatPatClient; +import java.io.*; import net.lopymine.patpat.packet.s2c.PatEntityS2CPacketV2; import net.minecraft.client.Minecraft; -import java.io.*; public class PatPatClientProxLibPacketManager { @@ -16,16 +15,12 @@ public class PatPatClientProxLibPacketManager { public static final int PAT_PAT_PACKETS_ID = 2; - //? if proxlib { - public static final me.enderkill98.proxlib.ProxPacketIdentifier PAT_PACKET_IDENTIFIER = me.enderkill98.proxlib.ProxPacketIdentifier.of(PAT_PAT_PACKETS_ID, 0); - //?} - public static void register() { //? if proxlib { - if (!LoadedMods.PROX_LIB_MOD_LOADED) { + /*if (!LoadedMods.PROX_LIB_MOD_LOADED) { return; } - me.enderkill98.proxlib.client.ProxLib.addHandlerFor(PAT_PACKET_IDENTIFIER, (entity, id, data) -> { + me.enderkill98.proxlib.client.ProxLib.addHandlerFor(me.enderkill98.proxlib.ProxPacketIdentifier.of(PAT_PAT_PACKETS_ID, 0), (entity, id, data) -> { LOGGER.debug("Received proximity packet, ProxLib enabled: {}", PatPatClientProxLibManager.isEnabled()); if (!PatPatClientProxLibManager.isEnabled()) { return; @@ -39,12 +34,12 @@ public static void register() { LOGGER.debug("Failed to handle proximity packet from player: {}, packet id: {}, data: {}", entity.getName().getString(), id, data, e); } }); - //?} + *///?} } public static void onPat(int pattedEntityId) { //? if proxlib { - if (!PatPatClientProxLibManager.isEnabled()) { + /*if (!PatPatClientProxLibManager.isEnabled()) { LOGGER.debug("Trying to make proximity pat, but proximity packets disabled!"); return; } @@ -53,13 +48,13 @@ public static void onPat(int pattedEntityId) { return; } try { - int packetsCount = me.enderkill98.proxlib.client.ProxLib.sendPacket(Minecraft.getInstance(), PAT_PACKET_IDENTIFIER, encodeProxyPatPacket(pattedEntityId)); + int packetsCount = me.enderkill98.proxlib.client.ProxLib.sendPacket(Minecraft.getInstance(), me.enderkill98.proxlib.ProxPacketIdentifier.of(PAT_PAT_PACKETS_ID, 0), encodeProxyPatPacket(pattedEntityId)); LOGGER.debug("Sent proximity packets ({}) to pat entity with id {}", packetsCount, pattedEntityId); PatPatClientProxLibPacketRateLimitManager.countPacket(); } catch (Exception e) { LOGGER.debug("Failed to send proximity packet, patted entity: {}, packet id: {}, data: {}", pattedEntityId, PAT_PAT_PACKETS_ID, e); } - //?} + *///?} } private static int decodeProxyPatPacket(byte[] data) throws IOException { diff --git a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketRateLimitManager.java b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketRateLimitManager.java index ff71a9c1..7e3ef66b 100644 --- a/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketRateLimitManager.java +++ b/src/main/java/net/lopymine/patpat/client/packet/PatPatClientProxLibPacketRateLimitManager.java @@ -1,9 +1,8 @@ package net.lopymine.patpat.client.packet; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; import net.minecraft.client.multiplayer.ClientLevel; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; - import net.lopymine.patpat.client.config.PatPatClientConfig; public class PatPatClientProxLibPacketRateLimitManager { @@ -16,7 +15,7 @@ private PatPatClientProxLibPacketRateLimitManager() { private static int packetsSentPerSecond; public static void register() { - ClientTickEvents.END_WORLD_TICK.register(PatPatClientProxLibPacketRateLimitManager::tick); + ClientMultiLoader.getInstance().registerAfterWorldTickListener(PatPatClientProxLibPacketRateLimitManager::tick); } public static void tick(ClientLevel level) { diff --git a/src/main/java/net/lopymine/patpat/client/render/PatPatClientRenderer.java b/src/main/java/net/lopymine/patpat/client/render/PatPatClientRenderer.java index 3b7b8240..7f703004 100644 --- a/src/main/java/net/lopymine/patpat/client/render/PatPatClientRenderer.java +++ b/src/main/java/net/lopymine/patpat/client/render/PatPatClientRenderer.java @@ -1,12 +1,15 @@ package net.lopymine.patpat.client.render; import lombok.experimental.ExtensionMethod; -import net.fabricmc.loader.api.FabricLoader; -import net.lopymine.patpat.client.config.sub.PatPatClientVisualConfig; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; + +import net.lopymine.patpat.client.config.*; +import net.lopymine.patpat.client.config.sub.*; import net.lopymine.patpat.client.render.feature.*; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.network.protocol.game.ServerboundSwingPacket; import net.minecraft.util.Mth; @@ -15,11 +18,8 @@ import net.minecraft.world.entity.LivingEntity; import com.mojang.blaze3d.vertex.PoseStack; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.lopymine.patpat.client.config.PatPatClientConfig; import net.lopymine.patpat.client.config.resourcepack.*; -import net.lopymine.patpat.client.config.PatPatClientStatsConfig; import net.lopymine.patpat.client.manager.PatPatClientManager; import net.lopymine.patpat.client.packet.*; import net.lopymine.patpat.client.resourcepack.PatPatClientSoundManager; @@ -42,26 +42,23 @@ /*import com.mojang.blaze3d.systems.RenderSystem; *//*?}*/ -//? if <=1.21.8 { -/*import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; -*//*?}*/ @ExtensionMethod(VertexConsumerExtension.class) public class PatPatClientRenderer { - private static final Queue serverPats = new ConcurrentLinkedQueue<>(); - private static final Queue clientPats = new ConcurrentLinkedQueue<>(); + private static final Queue serverPats = new ConcurrentLinkedQueue<>(); + private static final Queue clientPats = new ConcurrentLinkedQueue<>(); - public static void registerServerPacket(PatPacket packet) { + public static void registerServerPacket(PacketPat packet) { serverPats.offer(packet); } - public static void registerClientPacket(PatPacket packet) { + public static void registerClientPacket(PacketPat packet) { clientPats.offer(packet); } - public record PatPacket(LivingEntity pattedEntity, PlayerConfig playerConfig, LocalPlayer player, + public record PacketPat(LivingEntity pattedEntity, PlayerConfig playerConfig, LocalPlayer player, boolean replayModPacket) { @Override @@ -77,16 +74,18 @@ public String toString() { public static void register() { //? if <=1.21.8 { - /*WorldRenderEvents.AFTER_ENTITIES.register((__) -> { + /*ClientMultiLoader.getInstance().registerAfterEntitiesRenderer((source, stack) -> { + PatFeatureRenderer.getInstance().setRenderingLevel(true); PatPatClientRenderer.renderPatOnYourself(); - PatFeatureRenderer.getInstance().render(); + PatFeatureRenderer.getInstance().render(source); + PatFeatureRenderer.getInstance().setRenderingLevel(false); }); *///?} - ClientTickEvents.END_WORLD_TICK.register(client -> { - boolean frozen = /*? if >1.20.2 {*/ client.tickRateManager().isFrozen(); /*?} else {*/ /*false; *//*?}*/ + ClientMultiLoader.getInstance().registerAfterWorldTickListener((level) -> { + boolean frozen = /*? if >1.20.2 {*/ level.tickRateManager().isFrozen(); /*?} else {*/ /*false; *//*?}*/ PatPatClientConfig config = PatPatClientConfig.getInstance(); - PatPacket packet; + PacketPat packet; if (!frozen) { while ((packet = serverPats.poll()) != null) { LivingEntity pattedEntity = packet.pattedEntity(); @@ -106,7 +105,7 @@ public static void register() { LivingEntity pattedEntity = packet.pattedEntity(); PlayerConfig playerConfig = packet.playerConfig(); - PatPatClientNetworkManager.sendPacketToServer(PatPatClientPacketManager.getPatPacket(pattedEntity)); + ClientMultiLoader.getInstance().sendPacketToServer(PatPatClientPacketManager.getPatPacket(pattedEntity)); PatEntity patEntity = PatPatClientManager.pat(pattedEntity, playerConfig); PatPatClientStatsConfig statsConfig = PatPatClientStatsConfig.getInstance(); @@ -130,7 +129,7 @@ public static void register() { } LocalPlayer player = Minecraft.getInstance().player; - if (!empty && player != null && FabricLoader.getInstance().isDevelopmentEnvironment()) { + if (!empty && player != null && PatPatDebugConfig.DEBUG_ENABLED && PatPatDebugConfig.getInstance().isSelfPat()) { PatPatClientManager.pat(player, PlayerConfig.currentSession()); ReplayModCompat.onPat(player.getId(), player.getId()); FlashbackCompat.onPat(player.getId(), player.getId()); @@ -173,10 +172,10 @@ public static void renderPatOnYourself() { return; } - PatPatClientRenderer.render(new PoseStack(), camera.rotation(), patEntity, player, new Vec3f(0.0F, Mth.lerp(tickDelta, camera.eyeHeightOld, camera.eyeHeight) - 0.2F, 0.0F), tickDelta, light); + PatPatClientRenderer.render(new PoseStack(), camera.rotation(), patEntity, player, new Vec3f(0.0F, Mth.lerp(tickDelta, camera.eyeHeightOld, camera.eyeHeight) - 0.2F, 0.0F), tickDelta, light, null); } - public static RenderResult render(PoseStack matrices, /*? if >=1.19.3 {*/ Quaternionf /*?} else {*/ /*Quaternion *//*?}*/ cameraRotation, @Nullable PatEntity providedPatEntity, @Nullable Entity entity, @Nullable Vec3f overrideOffset, float tickDelta, int light) { + public static RenderResult render(PoseStack matrices, /*? if >=1.19.3 {*/ Quaternionf /*?} else {*/ /*Quaternion *//*?}*/ cameraRotation, @Nullable PatEntity providedPatEntity, @Nullable Entity entity, @Nullable Vec3f overrideOffset, float tickDelta, int light, @Nullable MultiBufferSource provider) { PatPatClientConfig config = PatPatClientConfig.getInstance(); if (!config.getMainConfig().isModEnabled()) { return RenderResult.FAILED; @@ -235,7 +234,7 @@ public static RenderResult render(PoseStack matrices, /*? if >=1.19.3 {*/ Quater float v1 = 0.0F; float v2 = 1.0F; - PatFeatureRenderer.getInstance().request(animation.getTexture(), matrices.last(), x1, y1, x2, y2, z, u1, v1, u2, v2, light); + PatFeatureRenderer.getInstance().request(animation.getTexture(), matrices.last(), x1, y1, x2, y2, z, u1, v1, u2, v2, light, provider); matrices.popPose(); disableBlend(); diff --git a/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRenderer.java b/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRenderer.java index df1ccab4..bc8eeb68 100644 --- a/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRenderer.java +++ b/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRenderer.java @@ -3,18 +3,28 @@ import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.vertex.PoseStack.Pose; import java.util.*; +import lombok.*; import lombok.experimental.ExtensionMethod; +import net.lopymine.patpat.compat.iris.IrisCompat; import net.lopymine.patpat.extension.*; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource.BufferSource; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; +import org.jetbrains.annotations.Nullable; +//? if >=1.21.11 { +import net.minecraft.client.renderer.rendertype.RenderTypes; +//?} else { +/*import net.minecraft.client.renderer.RenderTypes; +*///?} + +@Setter +@Getter @ExtensionMethod(value = {VertexConsumerExtension.class, PoseExtension.class}) public class PatFeatureRenderer { - private final List requests = new ArrayList<>(); + private boolean renderingLevel = false; + public final List requests = new ArrayList<>(); private static final PatFeatureRenderer INSTANCE = new PatFeatureRenderer(); @@ -22,11 +32,13 @@ public static PatFeatureRenderer getInstance() { return INSTANCE; } - public void render() { - BufferSource source = Minecraft.getInstance().renderBuffers().bufferSource(); + public void render(MultiBufferSource source) { + if (!this.renderingLevel && !IrisCompat.isRenderingShadowPass()) { + return; + } for (PatFeatureRequest request : this.requests) { - VertexConsumer buffer = source.getBuffer(RenderType.entityTranslucent(request.texture())); + VertexConsumer buffer = (request.provider() == null ? source : request.provider()).getBuffer(RenderTypes.entityTranslucent(request.texture())); /*? if >=1.19.3 {*/ org.joml.Matrix4f /*?} else {*/ /*com.mojang.math.Matrix4f*//*?}*/ matrix = request.poseStack().pose(); buffer.withVertex(matrix, request.x1(), request.y1(), request.z()).withColor(255, 255, 255, 255).withUv(request.u1(), request.v1()).withOverlay(OverlayTexture.NO_OVERLAY).withLight(request.light()).withNormal(0, 1, 0).end(); @@ -40,7 +52,7 @@ public void render() { } public void request( - ResourceLocation texture, + Identifier texture, Pose poseStack, float x1, float y1, @@ -51,9 +63,10 @@ public void request( float v1, float u2, float v2, - int light + int light, + @Nullable MultiBufferSource provider ) { - this.requests.add(new PatFeatureRequest(texture, poseStack.copy(), x1, y1, x2, y2, z, u1, v1, u2, v2, light)); + this.requests.add(new PatFeatureRequest(texture, poseStack.copy(), x1, y1, x2, y2, z, u1, v1, u2, v2, light, provider)); } } \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRequest.java b/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRequest.java index beee6ceb..589c8049 100644 --- a/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRequest.java +++ b/src/main/java/net/lopymine/patpat/client/render/feature/PatFeatureRequest.java @@ -1,10 +1,12 @@ package net.lopymine.patpat.client.render.feature; import com.mojang.blaze3d.vertex.PoseStack.Pose; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.resources.Identifier; +import org.jetbrains.annotations.Nullable; public record PatFeatureRequest( - ResourceLocation texture, + Identifier texture, Pose poseStack, float x1, float y1, @@ -15,5 +17,6 @@ public record PatFeatureRequest( float v1, float u2, float v2, - int light + int light, + @Nullable MultiBufferSource provider ) { } diff --git a/src/main/java/net/lopymine/patpat/client/resourcepack/AbstractResourceReloadListener.java b/src/main/java/net/lopymine/patpat/client/resourcepack/AbstractResourceReloadListener.java new file mode 100644 index 00000000..7c400e51 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/client/resourcepack/AbstractResourceReloadListener.java @@ -0,0 +1,61 @@ +package net.lopymine.patpat.client.resourcepack; + +import java.util.concurrent.*; +import net.minecraft.resources.Identifier; +import net.minecraft.server.packs.resources.*; +import net.minecraft.util.Unit; +import net.minecraft.util.profiling.*; + +//? if fabric && <=1.21.8 { +/*import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; + *///?} + +public abstract class AbstractResourceReloadListener implements /*? if >=1.21.9 || forge || neoforge {*/ PreparableReloadListener /*?} else {*/ /*IdentifiableResourceReloadListener *//*?}*/ { + + //? if fabric && <=1.21.8 { + /*@Override + public Identifier getFabricId() { + return this.getId(); + } + *///?} + + public Identifier getId() { + String modId = this.getModId(); + String path = "%s-reload-listener".formatted(modId); + //? if >=1.21 { + return Identifier.fromNamespaceAndPath(modId, path); + //?} elif >=1.19 { + /*return Identifier.tryBuild(modId, path); + *///?} else { + /*return new Identifier(modId, path); + *///?} + } + + public abstract String getModId(); + + //? if >=1.21.9 { + @Override + public CompletableFuture reload(SharedState store, Executor prepareExecutor, PreparationBarrier synchronizer, Executor applyExecutor) { + return synchronizer.wait(Unit.INSTANCE).thenRunAsync(() -> { + ProfilerFiller profiler = Profiler.get(); + profiler.push("%s-reload-listener".formatted(this.getModId())); + this.reloadStuff(synchronizer, store.resourceManager(), prepareExecutor, applyExecutor); + profiler.pop(); + }, applyExecutor); + } + //?} else { + /*@Override + public CompletableFuture reload(PreparationBarrier synchronizer, ResourceManager manager, /^? if <=1.21.1 {^/ /^ProfilerFiller profiler, ProfilerFiller applyProfiler, ^//^?}^/ Executor prepareExecutor, Executor applyExecutor) { + return synchronizer.wait(Unit.INSTANCE).thenRunAsync(() -> { + //? if >=1.21.2 { + ProfilerFiller profiler = Profiler.get(); + //?} + profiler.push("listener"); + this.reloadStuff(synchronizer, manager, prepareExecutor, applyExecutor); + profiler.pop(); + }, applyExecutor); + } + *///?} + + protected abstract void reloadStuff(PreparationBarrier synchronizer, ResourceManager manager, Executor prepareExecutor, Executor applyExecutor); +} diff --git a/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientReloadListener.java b/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientReloadListener.java index 939e7c89..210ac747 100644 --- a/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientReloadListener.java +++ b/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientReloadListener.java @@ -1,39 +1,30 @@ package net.lopymine.patpat.client.resourcepack; +import java.util.concurrent.Executor; import net.lopymine.patpat.PatPat; -import net.minecraft.resources.ResourceLocation; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.minecraft.client.Minecraft; import net.minecraft.server.packs.PackResources; -import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.resources.*; -import net.fabricmc.fabric.api.resource.*; import net.lopymine.patpat.client.config.PatPatClientConfig; -import net.lopymine.patpat.utils.IdentifierUtils; import java.util.*; -//? if >=1.21.9 { -import net.fabricmc.fabric.api.resource.v1.ResourceLoader; -//?} - -public class PatPatClientReloadListener implements /*? if <=1.21.8 {*/ /*SimpleSynchronousResourceReloadListener *//*?} else {*/ ResourceManagerReloadListener /*?}*/ { +public class PatPatClientReloadListener extends AbstractResourceReloadListener { public static void register() { - //? if >=1.21.9 { - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(getFabricId(), new PatPatClientReloadListener()); - //?} else { - /*ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(new PatPatClientReloadListener()); - *///?} + ClientMultiLoader.getInstance().registerResourceReloadListener(new PatPatClientReloadListener()); } - /*? if <=1.21.8 {*//*@Override*//*?}*/ - public /*? if >=1.21.9 {*/ static /*?}*/ ResourceLocation getFabricId() { - return IdentifierUtils.modId("%s-reload-listener".formatted(PatPat.MOD_ID)); + @Override + public String getModId() { + return PatPat.MOD_ID; } @Override - public void onResourceManagerReload(ResourceManager manager) { - List list = manager.listPacks().toList(); + protected void reloadStuff(PreparationBarrier synchronizer, ResourceManager manager, Executor prepareExecutor, Executor applyExecutor) { + List list = Minecraft.getInstance().getResourceManager().listPacks().toList(); if (list.isEmpty()) { return; } diff --git a/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientResourcePackManager.java b/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientResourcePackManager.java index e9cc8864..49b4b256 100644 --- a/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientResourcePackManager.java +++ b/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientResourcePackManager.java @@ -4,7 +4,8 @@ import com.google.gson.*; import lombok.experimental.ExtensionMethod; import net.lopymine.patpat.*; -import net.minecraft.resources.ResourceLocation; +import net.lopymine.patpat.logger.PatLogger; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.resources.ResourceManager; @@ -33,7 +34,7 @@ public class PatPatClientResourcePackManager { private PatPatClientResourcePackManager() { } - public static void parseConfig(String packName, ResourceLocation identifier, Supplier inputStreamInputSupplier, List configs, PatPatClientConfig config) { + public static void parseConfig(String packName, Identifier identifier, Supplier inputStreamInputSupplier, List configs, PatPatClientConfig config) { String path = identifier.getPath(); if (!path.endsWith(".json") && !path.endsWith(".json5")) { return; @@ -92,14 +93,14 @@ public void reload(List reloadPacks, ResourceManager manager) { LOGGER.error("Failed to read custom animation at {} from {}", id.toString(), resourcePackName); } });//?} else { - /*Collection customAnimationIds = pack.getResources(PackType.CLIENT_RESOURCES, PatPat.MOD_ID, "textures", /^? <=1.18.2 {^//^0,^//^?}^/ (identifier) -> { + /*Collection customAnimationIds = pack.getResources(PackType.CLIENT_RESOURCES, PatPat.MOD_ID, "textures", /^? <=1.18.2 {^//^0,^//^?}^/ (identifier) -> { //? >=1.19 { return identifier.getPath().endsWith(".json") || identifier.getPath().endsWith(".json5"); //?} else { /^return identifier.endsWith(".json") || identifier.endsWith(".json5"); ^///?} }); - for (ResourceLocation customAnimationId : customAnimationIds) { + for (Identifier customAnimationId : customAnimationIds) { try (InputStream inputStream = /^? >=1.19 {^/manager.open(customAnimationId)/^?} else {^//^manager.getResource(customAnimationId).getInputStream()^//^?}^/) { PatPatClientResourcePackManager.parseConfig(resourcePackName, customAnimationId, () -> inputStream, animationConfigs, config); } catch (Exception e) { diff --git a/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientSoundManager.java b/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientSoundManager.java index f313cdf8..e7f9a2c8 100644 --- a/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientSoundManager.java +++ b/src/main/java/net/lopymine/patpat/client/resourcepack/PatPatClientSoundManager.java @@ -1,9 +1,9 @@ package net.lopymine.patpat.client.resourcepack; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.entrypoint.ClientMultiLoader; +import net.lopymine.patpat.logger.PatLogger; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.Registry; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; @@ -11,7 +11,6 @@ import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.client.config.resourcepack.SoundConfig; import net.lopymine.patpat.entity.PatEntity; -import net.lopymine.patpat.utils.*; public class PatPatClientSoundManager { @@ -25,32 +24,26 @@ private PatPatClientSoundManager() { private static SoundEvent lopiSoundEvent; public static void register() { - lopiSoundEvent = getLopiSoundEvent(); - patPatSoundEvent = getPatPatSoundEvent(); + ClientMultiLoader.getInstance().registerSounds((register) -> { + lopiSoundEvent = register.registerSound("lopi"); + patPatSoundEvent = register.registerSound("patpat"); + }); } public static SoundEvent getLopiSoundEvent() { if (lopiSoundEvent == null) { - lopiSoundEvent = registerModSound("lopi"); + throw new IllegalStateException(); } return lopiSoundEvent; } public static SoundEvent getPatPatSoundEvent() { if (patPatSoundEvent == null) { - patPatSoundEvent = registerModSound("patpat"); + throw new IllegalStateException(); } return patPatSoundEvent; } - private static SoundEvent registerModSound(String id) { - return Registry.register( - VersionedThings.SOUND_EVENT, - IdentifierUtils.modId(id), - SoundUtils.getSoundEvent(id) - ); - } - public static void playSound(PatEntity whoPatted, Player pattedEntity, double volume) { ClientLevel world = Minecraft.getInstance().level; if (world == null) { @@ -69,7 +62,11 @@ public static void playSound(PatEntity whoPatted, Player pattedEntity, double vo SoundSource.PLAYERS, soundConfig.getVolume() * (float) volume, Mth.nextFloat( - world.random, + //? if >=26.1 { + world.getRandom(), + //?} else { + /*world.random, + *///?} soundConfig.getMinPitch(), soundConfig.getMaxPitch() )); diff --git a/src/main/java/net/lopymine/patpat/common/command/list/PatPatCommonListChangeCommand.java b/src/main/java/net/lopymine/patpat/common/command/PatPatCommonListChangeCommand.java similarity index 97% rename from src/main/java/net/lopymine/patpat/common/command/list/PatPatCommonListChangeCommand.java rename to src/main/java/net/lopymine/patpat/common/command/PatPatCommonListChangeCommand.java index b873e01c..3b2f56c9 100644 --- a/src/main/java/net/lopymine/patpat/common/command/list/PatPatCommonListChangeCommand.java +++ b/src/main/java/net/lopymine/patpat/common/command/PatPatCommonListChangeCommand.java @@ -1,4 +1,4 @@ -package net.lopymine.patpat.common.command.list; +package net.lopymine.patpat.common.command; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.*; diff --git a/src/main/java/net/lopymine/patpat/common/config/PatPatConfigManager.java b/src/main/java/net/lopymine/patpat/common/config/PatPatConfigManager.java index b026fb4c..92279096 100644 --- a/src/main/java/net/lopymine/patpat/common/config/PatPatConfigManager.java +++ b/src/main/java/net/lopymine/patpat/common/config/PatPatConfigManager.java @@ -1,13 +1,11 @@ package net.lopymine.patpat.common.config; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.loader.api.FabricLoader; - -import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.*; import net.lopymine.patpat.client.PatPatClient; -import net.lopymine.patpat.client.config.PatPatClientConfig; +import net.lopymine.patpat.client.config.*; import net.lopymine.patpat.client.config.list.PatPatClientProxLibServersWhitelistConfig; import net.lopymine.patpat.client.config.migrate.PatPatClientConfigMigrateManager; +import net.lopymine.patpat.entrypoint.*; import net.lopymine.patpat.server.config.*; import net.lopymine.patpat.server.config.migrate.PatPatServerConfigMigrateManager; import net.lopymine.patpat.server.config.list.PatPatServerPlayerListConfig; @@ -17,14 +15,14 @@ public class PatPatConfigManager { - public static final Path CONFIG_PATH = FabricLoader.getInstance().getConfigDir().resolve("patpat/"); + public static final Path CONFIG_PATH = EarlyCommonMultiLoader.getInstance().getConfigDir().resolve("%s/".formatted(PatPat.MOD_ID)); private PatPatConfigManager() { throw new IllegalStateException("Manager class"); } public static void onInitialize() { - ServerLifecycleEvents.SERVER_STOPPING.register(s -> PatPatServerConfig.getInstance().saveAsync()); + ServerMultiLoader.getInstance().registerOnServerStop(() -> PatPatServerConfig.getInstance().saveAsync()); File file = PatPatConfigManager.CONFIG_PATH.toFile(); if (!file.exists() && file.mkdirs()) { @@ -44,5 +42,8 @@ public static void reloadClient() { PatPatClientConfig config = PatPatClientConfig.reload(); PatPatClientProxLibServersWhitelistConfig.getInstance().reload(); PatPatClient.LOGGER.setDebugMode(config.getMainConfig().isDebugLogEnabled()); + if(PatPatDebugConfig.DEBUG_ENABLED){ + PatPatDebugConfig.reload(); + } } } diff --git a/src/main/java/net/lopymine/patpat/common/config/list/AbstractListConfig.java b/src/main/java/net/lopymine/patpat/common/config/list/AbstractListConfig.java index ad1a5b8f..219a7043 100644 --- a/src/main/java/net/lopymine/patpat/common/config/list/AbstractListConfig.java +++ b/src/main/java/net/lopymine/patpat/common/config/list/AbstractListConfig.java @@ -5,20 +5,22 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import lombok.*; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; + +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @Getter @Setter public abstract class AbstractListConfig { - private final Collection standardValues; + private final @NotNull Collection standardValues; private final PatLogger logger; private final File configFile; private boolean initialized = false; - public AbstractListConfig(Collection standardValues, PatLogger logger, File configFile) { + protected AbstractListConfig(@NotNull Collection standardValues, PatLogger logger, File configFile) { this.standardValues = standardValues; this.logger = logger; this.configFile = configFile; @@ -29,7 +31,7 @@ public static > B getInitialized(B config) { return config; } config.read(); - config.setInitialized(true);; + config.setInitialized(true); return config; } diff --git a/src/main/java/net/lopymine/patpat/common/config/list/AbstractMapConfig.java b/src/main/java/net/lopymine/patpat/common/config/list/AbstractMapConfig.java index 05b7f3fa..49de9fdd 100644 --- a/src/main/java/net/lopymine/patpat/common/config/list/AbstractMapConfig.java +++ b/src/main/java/net/lopymine/patpat/common/config/list/AbstractMapConfig.java @@ -6,7 +6,7 @@ import java.util.Map.Entry; import java.util.concurrent.CompletableFuture; import lombok.*; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; import org.jetbrains.annotations.Nullable; @Getter diff --git a/src/main/java/net/lopymine/patpat/common/config/list/AbstractPatPatPlayerListConfig.java b/src/main/java/net/lopymine/patpat/common/config/list/AbstractPatPatPlayerListConfig.java index 6fbfb049..442e693d 100644 --- a/src/main/java/net/lopymine/patpat/common/config/list/AbstractPatPatPlayerListConfig.java +++ b/src/main/java/net/lopymine/patpat/common/config/list/AbstractPatPatPlayerListConfig.java @@ -4,9 +4,7 @@ import java.util.*; import java.util.Map.Entry; import lombok.Getter; -import net.lopymine.patpat.PatLogger; -import net.lopymine.patpat.client.PatPatClient; -import net.lopymine.patpat.common.config.PatPatConfigManager; +import net.lopymine.patpat.logger.PatLogger; import org.jetbrains.annotations.Nullable; @Getter diff --git a/src/main/java/net/lopymine/patpat/common/migrate/AbstractConfigMigrateHandler.java b/src/main/java/net/lopymine/patpat/common/config/migrate/AbstractConfigMigrateHandler.java similarity index 95% rename from src/main/java/net/lopymine/patpat/common/migrate/AbstractConfigMigrateHandler.java rename to src/main/java/net/lopymine/patpat/common/config/migrate/AbstractConfigMigrateHandler.java index 29fc9a28..66971349 100644 --- a/src/main/java/net/lopymine/patpat/common/migrate/AbstractConfigMigrateHandler.java +++ b/src/main/java/net/lopymine/patpat/common/config/migrate/AbstractConfigMigrateHandler.java @@ -1,13 +1,13 @@ -package net.lopymine.patpat.common.migrate; +package net.lopymine.patpat.common.config.migrate; import com.google.gson.Gson; import lombok.*; -import net.lopymine.patpat.*; import net.lopymine.patpat.common.config.PatPatConfigManager; import java.io.*; import java.nio.file.*; +import net.lopymine.patpat.logger.PatLogger; @Getter @Setter diff --git a/src/main/java/net/lopymine/patpat/common/migrate/AbstractPatPatConfigMigrateManager.java b/src/main/java/net/lopymine/patpat/common/config/migrate/AbstractPatPatConfigMigrateManager.java similarity index 95% rename from src/main/java/net/lopymine/patpat/common/migrate/AbstractPatPatConfigMigrateManager.java rename to src/main/java/net/lopymine/patpat/common/config/migrate/AbstractPatPatConfigMigrateManager.java index 500b871c..70fab83c 100644 --- a/src/main/java/net/lopymine/patpat/common/migrate/AbstractPatPatConfigMigrateManager.java +++ b/src/main/java/net/lopymine/patpat/common/config/migrate/AbstractPatPatConfigMigrateManager.java @@ -1,10 +1,11 @@ -package net.lopymine.patpat.common.migrate; +package net.lopymine.patpat.common.config.migrate; import net.lopymine.patpat.*; import net.lopymine.patpat.common.Version; import java.util.*; import java.util.function.Supplier; +import net.lopymine.patpat.logger.PatLogger; public abstract class AbstractPatPatConfigMigrateManager { diff --git a/src/main/java/net/lopymine/patpat/common/migrate/MigrateHandler.java b/src/main/java/net/lopymine/patpat/common/config/migrate/MigrateHandler.java similarity index 69% rename from src/main/java/net/lopymine/patpat/common/migrate/MigrateHandler.java rename to src/main/java/net/lopymine/patpat/common/config/migrate/MigrateHandler.java index e45573cd..73cac316 100644 --- a/src/main/java/net/lopymine/patpat/common/migrate/MigrateHandler.java +++ b/src/main/java/net/lopymine/patpat/common/config/migrate/MigrateHandler.java @@ -1,4 +1,4 @@ -package net.lopymine.patpat.common.migrate; +package net.lopymine.patpat.common.config.migrate; public interface MigrateHandler { diff --git a/src/main/java/net/lopymine/patpat/compat/CompatPlugin.java b/src/main/java/net/lopymine/patpat/compat/CompatPlugin.java index 1cac8ccf..3e69d5a9 100644 --- a/src/main/java/net/lopymine/patpat/compat/CompatPlugin.java +++ b/src/main/java/net/lopymine/patpat/compat/CompatPlugin.java @@ -1,10 +1,9 @@ package net.lopymine.patpat.compat; +import net.lopymine.patpat.entrypoint.*; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.*; -import net.fabricmc.loader.api.FabricLoader; - import java.util.*; public abstract class CompatPlugin implements IMixinConfigPlugin { @@ -23,7 +22,7 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - return FabricLoader.getInstance().isModLoaded(getCompatModId()); + return EarlyCommonMultiLoader.getInstance().isModLoaded(this.getCompatModId()); } @Override diff --git a/src/main/java/net/lopymine/patpat/compat/LoadedMods.java b/src/main/java/net/lopymine/patpat/compat/LoadedMods.java index 5113bb6f..1fb1ed62 100644 --- a/src/main/java/net/lopymine/patpat/compat/LoadedMods.java +++ b/src/main/java/net/lopymine/patpat/compat/LoadedMods.java @@ -1,19 +1,20 @@ package net.lopymine.patpat.compat; -import net.fabricmc.loader.api.FabricLoader; - +import net.lopymine.patpat.entrypoint.*; import net.lopymine.patpat.client.PatPatClient; -import net.lopymine.patpat.client.config.PatPatClientConfig; public final class LoadedMods { - public static final boolean REPLAY_MOD_LOADED = FabricLoader.getInstance().isModLoaded("replaymod"); - public static final boolean FLASHBACK_MOD_LOADED = FabricLoader.getInstance().isModLoaded("flashback"); - public static final boolean PROX_LIB_MOD_LOADED = FabricLoader.getInstance().isModLoaded("proxlib"); + + public static final boolean REPLAY_MOD_LOADED = EarlyCommonMultiLoader.getInstance().isModLoaded("replaymod"); + public static final boolean FLASHBACK_MOD_LOADED = EarlyCommonMultiLoader.getInstance().isModLoaded("flashback"); + public static final boolean PROX_LIB_MOD_LOADED = EarlyCommonMultiLoader.getInstance().isModLoaded("proxlib"); + public static final boolean IRIS_LOADED = EarlyCommonMultiLoader.getInstance().isModLoaded("iris"); public static void onInitialize() { sendDebugLog(REPLAY_MOD_LOADED, "Replay Mod"); sendDebugLog(FLASHBACK_MOD_LOADED, "Flashback Mod"); sendDebugLog(PROX_LIB_MOD_LOADED, "ProxLib"); + sendDebugLog(IRIS_LOADED, "Iris"); } private static void sendDebugLog(boolean modLoaded, String modId) { diff --git a/src/main/java/net/lopymine/patpat/compat/PatPatMixinConfigPlugin.java b/src/main/java/net/lopymine/patpat/compat/PatPatMixinConfigPlugin.java index 27a47a14..ea4c6ea1 100644 --- a/src/main/java/net/lopymine/patpat/compat/PatPatMixinConfigPlugin.java +++ b/src/main/java/net/lopymine/patpat/compat/PatPatMixinConfigPlugin.java @@ -1,11 +1,10 @@ package net.lopymine.patpat.compat; +import net.lopymine.patpat.entrypoint.*; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -import net.fabricmc.loader.api.FabricLoader; - import java.util.Collections; import java.util.List; import java.util.Set; @@ -16,7 +15,7 @@ public class PatPatMixinConfigPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String mixinClass, String mixinSource) { - return !mixinSource.equals(MOD_MENU_MIXIN_CLASS) || FabricLoader.getInstance().isModLoaded("modmenu"); + return !mixinSource.equals(MOD_MENU_MIXIN_CLASS) || EarlyCommonMultiLoader.getInstance().isModLoaded("modmenu"); } @Override diff --git a/src/main/java/net/lopymine/patpat/compat/controlling/ControllingCompatPlugin.java b/src/main/java/net/lopymine/patpat/compat/controlling/ControllingCompatPlugin.java new file mode 100644 index 00000000..8da4ab3f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/compat/controlling/ControllingCompatPlugin.java @@ -0,0 +1,11 @@ +package net.lopymine.patpat.compat.controlling; + +import net.lopymine.patpat.compat.CompatPlugin; + +public class ControllingCompatPlugin extends CompatPlugin { + + @Override + protected String getCompatModId() { + return "controlling"; + } +} diff --git a/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackCompat.java b/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackCompat.java index 56b68fff..4e1aea3a 100644 --- a/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackCompat.java +++ b/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackCompat.java @@ -1,7 +1,7 @@ package net.lopymine.patpat.compat.flashback; //? flashback { -import com.moulberry.flashback.Flashback; +/*import com.moulberry.flashback.Flashback; import com.moulberry.flashback.record.Recorder; import net.fabricmc.fabric.api.networking.v1.*; @@ -10,13 +10,13 @@ import net.minecraft.network.ConnectionProtocol; import net.minecraft.network.protocol.Packet; import net.lopymine.patpat.client.packet.PatPatClientPacketManager; -//?} +*///?} public class FlashbackCompat { public static void onPat(int pattedEntityId, int whoPattedId) { //? flashback { - if (!LoadedMods.FLASHBACK_MOD_LOADED) { + /*if (!LoadedMods.FLASHBACK_MOD_LOADED) { return; } @@ -26,17 +26,17 @@ public static void onPat(int pattedEntityId, int whoPattedId) { //? >1.20.1 { Packet packet = ServerPlayNetworking.createS2CPacket(patPacket); //?} else { - /*PacketByteBuf buf = PacketByteBufs.create(); + /^PacketByteBuf buf = PacketByteBufs.create(); patPacket.write(buf); Packet packet = ServerPlayNetworking.createS2CPacket(SelfPatEntityS2CPacket.PACKET_ID, buf); - *///?} + ^///?} recorder.writePacketAsync( packet, - /*? >1.20.4 {*/ConnectionProtocol.PLAY/*?} else {*//*NetworkState.PLAY*//*?}*/ + /^? >1.20.4 {^/ConnectionProtocol.PLAY/^?} else {^//^NetworkState.PLAY^//^?}^/ ); PatPatClientPacketManager.LOGGER.debug("Saved packet to Flashback"); } - //?} + *///?} } diff --git a/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackManager.java b/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackManager.java index 4ef4077b..3aa9a7a2 100644 --- a/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackManager.java +++ b/src/main/java/net/lopymine/patpat/compat/flashback/FlashbackManager.java @@ -1,21 +1,21 @@ package net.lopymine.patpat.compat.flashback; //? flashback { -import com.moulberry.flashback.Flashback; +/*import com.moulberry.flashback.Flashback; import net.lopymine.patpat.compat.LoadedMods; -//?} +*///?} public class FlashbackManager { public static boolean isInReplay() { //? flashback { - if (!LoadedMods.FLASHBACK_MOD_LOADED) { + /*if (!LoadedMods.FLASHBACK_MOD_LOADED) { return false; } return Flashback.isInReplay(); - //?} else { - /*return false; - *///?} + *///?} else { + return false; + //?} } } diff --git a/src/main/java/net/lopymine/patpat/compat/iris/IrisCompat.java b/src/main/java/net/lopymine/patpat/compat/iris/IrisCompat.java new file mode 100644 index 00000000..e480c8f9 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/compat/iris/IrisCompat.java @@ -0,0 +1,38 @@ +package net.lopymine.patpat.compat.iris; + +//? if iris { + +//? if >=1.18.1 { +import net.irisshaders.iris.api.v0.IrisApi; +//?} else { +/*import net.coderbot.iris.shadows.ShadowRenderingState; +*///?} + +import net.lopymine.patpat.compat.LoadedMods; + +public class IrisCompat { + + public static boolean isRenderingShadowPass() { + if (!LoadedMods.IRIS_LOADED) { + return false; + } + //? if >=1.18.1 { + return IrisApi.getInstance().isRenderingShadowPass(); + //?} else { + /*return ShadowRenderingState.areShadowsCurrentlyBeingRendered(); + *///?} + } + +} + +//?} else { +/*import net.lopymine.patpat.compat.LoadedMods; + +public class IrisCompat { + + public static boolean isRenderingShadowPass() { + return false; + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/compat/iris/IrisShaderController.java b/src/main/java/net/lopymine/patpat/compat/iris/IrisShaderController.java new file mode 100644 index 00000000..a28dd30c --- /dev/null +++ b/src/main/java/net/lopymine/patpat/compat/iris/IrisShaderController.java @@ -0,0 +1,93 @@ +package net.lopymine.patpat.compat.iris; + +import java.lang.reflect.Method; +import java.nio.file.*; +import java.util.stream.Stream; +import net.lopymine.patpat.compat.LoadedMods; + +public class IrisShaderController { + + private static final String[] IRIS_CLASSES = {"net.irisshaders.iris.Iris", "net.coderbot.iris.Iris"}; + + private IrisShaderController() { + throw new IllegalStateException("Controller class"); + } + + public static String enableFirstShaderPack() { + if (!LoadedMods.IRIS_LOADED) { + return "none"; + } + Class irisClass = findIrisClass(); + if (irisClass == null) { + return "unsupported"; + } + try { + Path directory = (Path) irisClass.getMethod("getShaderpacksDirectory").invoke(null); + Method isValid = irisClass.getMethod("isValidShaderpack", Path.class); + + String pack; + try (Stream stream = Files.list(directory)) { + pack = stream.filter(path -> isValidShaderpack(isValid, path)).map(path -> path.getFileName().toString()).findFirst().orElse(null); + } + if (pack == null) { + return "no-packs"; + } + + boolean bl = testGetAPI(); + + Method getConfig = irisClass.getMethod("getIrisConfig"); + Object config = getConfig.invoke(null); + Class configClass = getConfig.getReturnType(); + configClass.getMethod("setShaderPackName", String.class).invoke(config, pack); + if (!bl) { + configClass.getMethod("setShadersEnabled", boolean.class).invoke(config, true); + } + configClass.getMethod("save").invoke(config); + if (!bl) { + irisClass.getMethod("reload").invoke(null); + } + + if (bl) { + setShadersEnabled(); + } + return pack; + } catch (Exception e) { + throw new IllegalStateException("Failed to enable a shader pack", e); + } + } + + private static Class findIrisClass() { + for (String name : IRIS_CLASSES) { + try { + return Class.forName(name); + } catch (ClassNotFoundException ignored) { + // try the next known package + } + } + return null; + } + + private static boolean isValidShaderpack(Method isValid, Path path) { + try { + return (boolean) isValid.invoke(null, path); + } catch (Exception e) { + return false; + } + } + + private static void setShadersEnabled() throws Exception { + Class apiClass = Class.forName("net.irisshaders.iris.api.v0.IrisApi"); + Object api = apiClass.getMethod("getInstance").invoke(null); + Object config = apiClass.getMethod("getConfig").invoke(api); + Class.forName("net.irisshaders.iris.api.v0.IrisApiConfig").getMethod("setShadersEnabledAndApply", boolean.class).invoke(config, true); + } + + private static boolean testGetAPI() { + try { + Class.forName("net.irisshaders.iris.api.v0.IrisApi"); + return true; + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModCompat.java b/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModCompat.java index a6196abe..d92a64c8 100644 --- a/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModCompat.java +++ b/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModCompat.java @@ -1,6 +1,8 @@ package net.lopymine.patpat.compat.replaymod; +//? if fabric { import net.fabricmc.fabric.api.networking.v1.*; +//?} import net.lopymine.patpat.client.packet.PatPatClientPacketManager; import net.lopymine.patpat.compat.LoadedMods; @@ -14,18 +16,18 @@ public class ReplayModCompat { public static void onPat(int pattedEntityId, int whoPattedId) { //? if replaymod { - if (!LoadedMods.REPLAY_MOD_LOADED) { + /*if (!LoadedMods.REPLAY_MOD_LOADED) { return; } SelfPatEntityS2CPacketV2 packet = new SelfPatEntityS2CPacketV2(pattedEntityId, whoPattedId); //? >=1.20.2 { ReplayModManager.sendDummyPacket(ServerPlayNetworking.createS2CPacket(packet)); //?} else { - /*FriendlyByteBuf buf = PacketByteBufs.create(); + /^FriendlyByteBuf buf = PacketByteBufs.create(); packet.write(buf); ReplayModManager.sendDummyPacket(ServerPlayNetworking.createS2CPacket(packet.getPatPatType().getId(), buf)); - *///?} + ^///?} PatPatClientPacketManager.LOGGER.debug("Saved packet to ReplayMod"); - //?} + *///?} } } diff --git a/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModManager.java b/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModManager.java index 1da30c89..3fcc90ee 100644 --- a/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModManager.java +++ b/src/main/java/net/lopymine/patpat/compat/replaymod/ReplayModManager.java @@ -5,16 +5,16 @@ import net.lopymine.patpat.compat.LoadedMods; //? replaymod { -import com.replaymod.recording.ReplayModRecording; +/*import com.replaymod.recording.ReplayModRecording; import com.replaymod.recording.packet.PacketListener; import com.replaymod.replay.ReplayModReplay; -//?} +*///?} public class ReplayModManager { public static void sendDummyPacket(Packet packet) { //? replaymod { - if (!LoadedMods.REPLAY_MOD_LOADED) { + /*if (!LoadedMods.REPLAY_MOD_LOADED) { return; } if (ReplayModRecording.instance.getConnectionEventHandler() != null) { @@ -24,12 +24,12 @@ public static void sendDummyPacket(Packet packet) { packetListener.save(packet); } } - //?} + *///?} } public static boolean isInReplay() { //? replaymod { - if (!LoadedMods.REPLAY_MOD_LOADED) { + /*if (!LoadedMods.REPLAY_MOD_LOADED) { return false; } ReplayModReplay instance = ReplayModReplay.instance; @@ -37,8 +37,8 @@ public static boolean isInReplay() { return false; } return instance.getReplayHandler() != null; - //?} else { - /*return false; - *///?} + *///?} else { + return false; + //?} } } diff --git a/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServer.java b/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServer.java index 8b70474a..18f06a31 100644 --- a/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServer.java +++ b/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServer.java @@ -1,14 +1,12 @@ package net.lopymine.patpat.dedicated; -import net.fabricmc.api.DedicatedServerModInitializer; -import net.lopymine.patpat.*; +import net.lopymine.patpat.logger.PatLogger; -public class PatPatDedicatedServer implements DedicatedServerModInitializer { +public class PatPatDedicatedServer { public static final PatLogger LOGGER = new PatLogger("PatPat/Dedicated"); - @Override - public void onInitializeServer() { + public static void onInitializeServer() { PatPatDedicatedServerTranslationManager.reload(); } } diff --git a/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServerTranslationManager.java b/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServerTranslationManager.java index 324627d6..38b9da78 100644 --- a/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServerTranslationManager.java +++ b/src/main/java/net/lopymine/patpat/dedicated/PatPatDedicatedServerTranslationManager.java @@ -1,10 +1,9 @@ package net.lopymine.patpat.dedicated; import java.io.*; -import java.nio.file.*; import java.util.*; -import net.fabricmc.loader.api.*; import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.*; import net.minecraft.locale.Language; public class PatPatDedicatedServerTranslationManager { @@ -18,18 +17,10 @@ private PatPatDedicatedServerTranslationManager() { public static void reload() { EN_US.clear(); - ModContainer modContainer = FabricLoader.getInstance().getModContainer(PatPat.MOD_ID).orElse(null); - if (modContainer == null) { - PatPatDedicatedServer.LOGGER.error("Failed to get PatPat language files for server-side, because PatPat mod container doesn't exits!"); - return; - } - Optional optional = modContainer.findPath("assets/%s/lang/en_us.json".formatted(PatPat.MOD_ID)); - if (optional.isEmpty()) { - PatPatDedicatedServer.LOGGER.error("Failed to find PatPat language files for server-side!"); - return; - } - - try (InputStream stream = Files.newInputStream(optional.get())){ + try (InputStream stream = EarlyCommonMultiLoader.getInstance().loadModFile(PatPat.MOD_ID, "assets/%s/lang/en_us.json".formatted(PatPat.MOD_ID))) { + if (stream == null) { + throw new IllegalArgumentException("Failed to load dedicated server language file"); + } Language.loadFromJson(stream, EN_US::put); } catch (Exception e) { PatPatDedicatedServer.LOGGER.error("Unexpected error when parsing PatPat language file: ", e); diff --git a/src/main/java/net/lopymine/patpat/entity/PatEntity.java b/src/main/java/net/lopymine/patpat/entity/PatEntity.java index 1973a87a..ede4c3fa 100644 --- a/src/main/java/net/lopymine/patpat/entity/PatEntity.java +++ b/src/main/java/net/lopymine/patpat/entity/PatEntity.java @@ -2,6 +2,7 @@ import lombok.*; import net.lopymine.patpat.client.config.resourcepack.*; +import net.lopymine.patpat.tests.PatPatTestMode; import net.minecraft.world.entity.LivingEntity; import java.util.*; @@ -28,6 +29,9 @@ public void resetAnimation() { } public void tick() { + if (PatPatTestMode.isEnabled() && PatPatTestMode.isFrozen(this.getProgress(0.0F), this.animation.getDuration())) { + return; + } this.tickProgress += 1; if (this.tickProgress == Integer.MAX_VALUE) { this.tickProgress = 0; diff --git a/src/main/java/net/lopymine/patpat/entrypoint/ClientMultiLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/ClientMultiLoader.java new file mode 100644 index 00000000..4ed34fbc --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/ClientMultiLoader.java @@ -0,0 +1,26 @@ +package net.lopymine.patpat.entrypoint; + +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader; + +//? if fabric { +import net.lopymine.patpat.entrypoint.impl.fabric.loader.FabricClientModLoader; +//?} elif neoforge { +/*import net.lopymine.patpat.entrypoint.impl.neoforge.loader.NeoForgeClientModLoader; + *///?} elif forge { +/*import net.lopymine.patpat.entrypoint.impl.forge.loader.ForgeClientModLoader; + *///?} + +public class ClientMultiLoader { + + //? if fabric { + private static final IClientModLoader LOADER = new FabricClientModLoader(); + //?} elif neoforge { + /*private static final IClientModLoader LOADER = new NeoForgeClientModLoader(); + *///?} elif forge { + /*private static final IClientModLoader LOADER = new ForgeClientModLoader(); + *///?} + + public static IClientModLoader getInstance() { + return LOADER; + } +} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/EarlyCommonMultiLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/EarlyCommonMultiLoader.java new file mode 100644 index 00000000..ca71ad1a --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/EarlyCommonMultiLoader.java @@ -0,0 +1,26 @@ +package net.lopymine.patpat.entrypoint; + +import net.lopymine.patpat.entrypoint.loader.IEarlyCommonModLoader; + +//? if fabric { +import net.lopymine.patpat.entrypoint.impl.fabric.loader.FabricEarlyModLoader; +//?} elif neoforge { +/*import net.lopymine.patpat.entrypoint.impl.neoforge.loader.NeoForgeEarlyModLoader; +*///?} elif forge { +/*import net.lopymine.patpat.entrypoint.impl.forge.loader.ForgeEarlyCommonModLoader; +*///?} + +public class EarlyCommonMultiLoader { + + //? if fabric { + private static final IEarlyCommonModLoader LOADER = new FabricEarlyModLoader(); + //?} elif neoforge { + /*private static final IEarlyCommonModLoader LOADER = new NeoForgeEarlyModLoader(); + *///?} elif forge { + /*private static final IEarlyCommonModLoader LOADER = new ForgeEarlyCommonModLoader(); + *///?} + + public static IEarlyCommonModLoader getInstance() { + return LOADER; + } +} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/ServerMultiLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/ServerMultiLoader.java new file mode 100644 index 00000000..5ae3c8da --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/ServerMultiLoader.java @@ -0,0 +1,26 @@ +package net.lopymine.patpat.entrypoint; + +import net.lopymine.patpat.entrypoint.loader.server.IServerModLoader; + +//? if fabric { +import net.lopymine.patpat.entrypoint.impl.fabric.loader.FabricServerModLoader; +//?} elif neoforge { +/*import net.lopymine.patpat.entrypoint.impl.neoforge.loader.NeoForgeServerModLoader; + *///?} elif forge { +/*import net.lopymine.patpat.entrypoint.impl.forge.loader.ForgeServerModLoader; + *///?} + +public class ServerMultiLoader { + + //? if fabric { + private static final IServerModLoader LOADER = new FabricServerModLoader(); + //?} elif neoforge { + /*private static final IServerModLoader LOADER = new NeoForgeServerModLoader(); + *///?} elif forge { + /*private static final IServerModLoader LOADER = new ForgeServerModLoader(); + *///?} + + public static IServerModLoader getInstance() { + return LOADER; + } +} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricClientEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricClientEntrypoint.java new file mode 100644 index 00000000..a3e97bf3 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricClientEntrypoint.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.entrypoint.impl.fabric; + +//? if fabric { + +import net.fabricmc.api.ClientModInitializer; +import net.lopymine.patpat.client.PatPatClient; + +public class FabricClientEntrypoint implements ClientModInitializer { + + @Override + public void onInitializeClient() { + PatPatClient.onInitializeClient(); + } + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricCommonEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricCommonEntrypoint.java new file mode 100644 index 00000000..b92bf089 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricCommonEntrypoint.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.entrypoint.impl.fabric; + +//? if fabric { + +import net.fabricmc.api.ModInitializer; +import net.lopymine.patpat.PatPat; + +public class FabricCommonEntrypoint implements ModInitializer { + + @Override + public void onInitialize() { + PatPat.onInitialize(); + } + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricDedicatedEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricDedicatedEntrypoint.java new file mode 100644 index 00000000..daccb125 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/FabricDedicatedEntrypoint.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.entrypoint.impl.fabric; + +//? if fabric { + +import net.fabricmc.api.DedicatedServerModInitializer; +import net.lopymine.patpat.dedicated.PatPatDedicatedServer; + +public class FabricDedicatedEntrypoint implements DedicatedServerModInitializer { + + @Override + public void onInitializeServer() { + PatPatDedicatedServer.onInitializeServer(); + } + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricClientModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricClientModLoader.java new file mode 100644 index 00000000..426a9d33 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricClientModLoader.java @@ -0,0 +1,182 @@ +//~ client_fabric_commands + +package net.lopymine.patpat.entrypoint.impl.fabric.loader; + +//? if fabric { + +import com.mojang.brigadier.CommandDispatcher; +import java.util.function.Consumer; +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.*; +*///?} else { +import net.fabricmc.fabric.api.client.command.v2.*; + //?} +import net.fabricmc.fabric.api.client.event.lifecycle.v1.*; +import net.fabricmc.fabric.api.client.networking.v1.*; +import net.fabricmc.fabric.api.networking.v1.*; +import net.lopymine.patpat.client.resourcepack.*; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.*; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.Registry; +import net.minecraft.server.packs.PackType; +import net.minecraft.sounds.SoundEvent; + +//? if >=1.21.9 { +import net.fabricmc.fabric.api.resource.v1.ResourceLoader; +//?} + +//? if <=1.21.8 { +/*import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +*///?} + +//? if <=1.19.3 { +/*import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.Identifier; +*///?} + +//? if >=26.1 { +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +//?} else { +/*import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; + *///?} + +public class FabricClientModLoader implements IClientModLoader { + + @Override + public void registerClientCommands(Consumer> consumer) { + //? if >=1.19 { + ClientCommandRegistrationCallback.EVENT.register( + (dispatcher, environment) -> consumer.accept(dispatcher) + ); + //?} else { + /*consumer.accept(ClientCommandManager.DISPATCHER); + *///?} + } + + @Override + public void registerAfterEntitiesRenderer(CustomRenderer renderer) { + //? if <=1.21.8 { + /*WorldRenderEvents.AFTER_ENTITIES.register((context) -> renderer.render(context.consumers(), context.matrixStack())); + *///?} + } + + @Override + public void registerAfterWorldTickListener(Consumer consumer) { + //? if >=26.1 { + ClientTickEvents.END_LEVEL_TICK.register(consumer::accept); + //?} else { + /*ClientTickEvents.END_WORLD_TICK.register(consumer::accept); + *///?} + } + + @Override + public void registerResourceReloadListener(AbstractResourceReloadListener listener) { + //? if >=26.1 { + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(listener.getId(), listener); + //?} elif >=1.21.9 { + /*ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(listener.getId(), listener); + *///?} else { + /*ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(listener); + *///?} + } + + @Override + public void registerKeybinding(KeyMapping keybinding) { + //? if >=26.1 { + KeyMappingHelper.registerKeyMapping(keybinding); + //?} else { + /*KeyBindingHelper.registerKeyBinding(keybinding); + *///?} + } + + @Override + public void registerSounds(Consumer consumer) { + consumer.accept(new FabricSoundRegister()); + } + + private static class FabricSoundRegister implements SoundRegister { + + @Override + public SoundEvent registerSound(String id) { + return Registry.register( + VersionedThings.SOUND_EVENT, + RLUtils.modId(id), + SoundUtils.getSoundEvent(id) + ); + } + + @Override + public void finish() { + // NO-OP + } + } + + @Override + public void registerClientPlayerLogListener(ClientPlayerLogListener consumer) { + ClientPlayConnectionEvents.INIT.register((handler, client) -> { + consumer.onLog(true); + }); + ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> { + consumer.onLog(false); + }); + } + + @Override + public void registerOnClientStop(Runnable runnable) { + ClientLifecycleEvents.CLIENT_STOPPING.register((client) -> runnable.run()); + } + + @Override + public void registerClientPackets(Consumer consumer) { + consumer.accept(new FabricClientPacketRegister()); + } + + public static class FabricClientPacketRegister implements ClientPacketRegister { + + @Override + public

> void register(PatPatPacketType

type, PatPatClientPacketHandler

handler) { + ClientPlayNetworking.registerGlobalReceiver(/*? if >=1.19.4 {*/ type.getPacketId(), /*?} else {*//*type.getId(),*//*?}*/ + //? if >=1.20.5 { + (packet, context) -> { PacketSender responseSender = context.responseSender(); + //?} elif <=1.20.4 && >=1.19.4 { + /*(packet, player, responseSender) -> { + *///?} else { + /*(client, listener, buf, responseSender) -> { P packet = type.getFactory().apply(buf); + *///?} + if (packet instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply(responseSender::sendPacket); + } + handler.handle(packet); + }); + } + } + + @Override + public void sendPacketToServer(BasePatPatPacket packet) { + //? if <1.19.4 { + /*Identifier id = packet.getPatPatType().getId(); + FriendlyByteBuf buf = PacketByteBufs.create(); + packet.write(buf); + *///?} + if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { + //? if >=1.19.4 { + pingPong.pong(packet); + //?} else { + /*pingPong.pong(id, buf); + *///?} + } else { + //? if >=1.19.4 { + ClientPlayNetworking.send(packet); + //?} else { + /*ClientPlayNetworking.send(id, buf); + *///?} + } + } + +} + +//?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricEarlyModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricEarlyModLoader.java new file mode 100644 index 00000000..3892719e --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricEarlyModLoader.java @@ -0,0 +1,63 @@ +package net.lopymine.patpat.entrypoint.impl.fabric.loader; + +//? if fabric { + +import java.io.InputStream; +import java.nio.file.*; +import java.util.Optional; +import net.fabricmc.loader.api.*; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.loader.IEarlyCommonModLoader; +import org.jetbrains.annotations.Nullable; + +public class FabricEarlyModLoader implements IEarlyCommonModLoader { + + @Override + public String getPlatform() { + return "Fabric"; + } + + @Override + public Path getConfigDir() { + return FabricLoader.getInstance().getConfigDir(); + } + + @Override + public boolean isDevelopmentEnvironment() { + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } + + @Override + public boolean isModLoaded(String modId) { + return FabricLoader.getInstance().isModLoaded(modId); + } + + @Override + public @Nullable InputStream loadModFile(String modId, String path) { + ModContainer modContainer = FabricLoader.getInstance().getModContainer(modId).orElse(null); + if (modContainer == null) { + PatPat.LOGGER.error("Failed to load file at \"{}\", because \"{}\" mod container doesn't exits!", path, modId); + return null; + } + Optional optional = modContainer.findPath(path); + return optional.map((p) -> { + try { + return Files.newInputStream(p); + } catch (Exception e) { + PatPat.LOGGER.error("Failed to open file at \"{}\", reason:", path, e); + } + return null; + }).orElse(null); + } + + @Override + public ModEnvironment getEnvironment() { + return switch (FabricLoader.getInstance().getEnvironmentType()) { + case CLIENT -> ModEnvironment.CLIENT; + case SERVER -> ModEnvironment.SERVER; + }; + } + +} + +//?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricServerModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricServerModLoader.java new file mode 100644 index 00000000..c9c0257f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/fabric/loader/FabricServerModLoader.java @@ -0,0 +1,165 @@ +package net.lopymine.patpat.entrypoint.impl.fabric.loader; + +//? if fabric { +import com.mojang.brigadier.CommandDispatcher; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import me.lucko.fabric.api.permissions.v0.Permissions; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.*; +import net.fabricmc.fabric.api.client.networking.v1.*; +//? if <1.19 { +/*import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; +*///?} else { +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; + //?} +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.networking.v1.*; +import net.lopymine.patpat.entrypoint.loader.server.IServerModLoader; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.*; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; + +//? if >=1.21.9 { +import net.minecraft.server.players.NameAndId; + //?} else { +/*import com.mojang.authlib.GameProfile; +*///?} + +//? if <=1.19.3 { +/*import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.Identifier; +*///?} + +public class FabricServerModLoader implements IServerModLoader { + + @Override + public void registerServerCommands(Consumer> consumer) { + //? if >=1.19 { + CommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess, environment) -> { + consumer.accept(dispatcher); + })); + //?} else { + /*CommandRegistrationCallback.EVENT.register(((dispatcher, dedicated) -> { + consumer.accept(dispatcher); + })); + *///?} + } + + @Override + public void registerServerPlayerLogListener(ServerPlayerLogListener consumer) { + ServerPlayConnectionEvents.INIT.register((handler, server) -> { ServerPlayer player = /*? if >=1.21 {*/ handler.getPlayer() /*?} else {*/ /*handler.player *//*?}*/; + consumer.onLog(true, player); + }); + ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { ServerPlayer player = /*? if >=1.21 {*/ handler.getPlayer() /*?} else {*/ /*handler.player *//*?}*/; + consumer.onLog(false, player); + }); + } + + @Override + public void registerOnServerStart(Runnable runnable) { + ServerLifecycleEvents.SERVER_STARTED.register((server) -> runnable.run()); + } + + @Override + public void registerOnServerStop(Runnable runnable) { + ServerLifecycleEvents.SERVER_STOPPING.register((server) -> runnable.run()); + } + + @Override + public void registerServerPackets(Consumer consumer) { + consumer.accept(new FabricServerPacketRegister()); + } + + public static class FabricServerPacketRegister implements ServerPacketRegister { + + @Override + public

> void register(PatPatPacketType

type, PacketRegistrationSide registrationSide, PatPatServerPacketHandler

handler) { + //? if >=1.20.5 { + if (registrationSide == PacketRegistrationSide.C2S || registrationSide == PacketRegistrationSide.BOTH) { + //? if >=26.1 { + var play = PayloadTypeRegistry.serverboundPlay(); + //?} else { + /*var play = PayloadTypeRegistry.playC2S(); + *///?} + play.register(type.getPacketId(), type.getCodec()); + } + if (registrationSide == PacketRegistrationSide.S2C || registrationSide == PacketRegistrationSide.BOTH) { + //? if >=26.1 { + var play = PayloadTypeRegistry.clientboundPlay(); + //?} else { + /*var play = PayloadTypeRegistry.playS2C(); + *///?} + play.register(type.getPacketId(), type.getCodec()); + } + //?} + + if (registrationSide != PacketRegistrationSide.C2S && registrationSide != PacketRegistrationSide.BOTH) { + return; + } + + ServerPlayNetworking.registerGlobalReceiver(/*? if >=1.19.4 {*/ type.getPacketId(), /*?} else {*/ /*type.getId(), *//*?}*/ + //? if >=1.20.5 { + (packet, context) -> { ServerPlayer sender = context.player(); PacketSender responseSender = context.responseSender(); + //?} elif >=1.19.4 && <=1.20.4 { + /*(packet, sender, responseSender) -> { + *///?} else { + /*(server, sender, networkHandler, buf, responseSender) -> { P packet = type.getFactory().apply(buf); + *///?} + if (packet instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply(responseSender::sendPacket); + } + handler.handle(sender, packet); + }); + } + } + + @Override + public void sendPacketToPlayer(ServerPlayer player, BasePatPatPacket packet) { + //? if <1.19.4 { + /*Identifier id = packet.getPatPatType().getId(); + FriendlyByteBuf buf = PacketByteBufs.create(); + packet.write(buf); + *///?} + if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { + //? if >=1.19.4 { + pingPong.pong(packet); + //?} else { + /*pingPong.pong(id, buf); + *///?} + } else { + //? if >=1.19.4 { + ServerPlayNetworking.send(player, packet); + //?} else { + /*ServerPlayNetworking.send(player, id, buf); + *///?} + } + } + + @Override + public boolean hasPermission(ServerPlayer player, String permission) { + if (player == null) { + return false; + } + return Permissions.check(player, permission, 2); + } + + @Override + public CompletableFuture hasOfflinePermission( + /*? if >=1.21.9 {*/ NameAndId /*?} else {*/ /*GameProfile *//*?}*/ profile, + MinecraftServer server, + String permission + ) { + return Permissions.check(profile, permission, 2, server); + } + + @Override + public void registerPermission(String permission) { + // NO-OP + } + +} + +//?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeClientEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeClientEntrypoint.java new file mode 100644 index 00000000..f9d337bf --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeClientEntrypoint.java @@ -0,0 +1,19 @@ +package net.lopymine.patpat.entrypoint.impl.forge; + +//? if forge { + +/*import net.lopymine.patpat.client.PatPatClient; +import net.lopymine.patpat.modmenu.integration.PatPatModMenuIntegration; +import net.minecraftforge.fml.ModLoadingContext; + +public class ForgeClientEntrypoint { + + public static void onInitializeClient() { + PatPatClient.onInitializeClient(); + + PatPatModMenuIntegration integration = new PatPatModMenuIntegration(); + integration.register(ModLoadingContext.get().getActiveContainer()); + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeCommonEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeCommonEntrypoint.java new file mode 100644 index 00000000..392b5527 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeCommonEntrypoint.java @@ -0,0 +1,21 @@ +package net.lopymine.patpat.entrypoint.impl.forge; + +//? if forge { + +/*import net.lopymine.patpat.PatPat; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.common.Mod; + +@Mod(PatPat.MOD_ID) +public class ForgeCommonEntrypoint { + + public ForgeCommonEntrypoint() { + PatPat.onInitialize(); + + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ForgeClientEntrypoint::onInitializeClient); + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> ForgeDedicatedEntrypoint::onInitializeServer); + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeDedicatedEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeDedicatedEntrypoint.java new file mode 100644 index 00000000..2b5b5967 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/ForgeDedicatedEntrypoint.java @@ -0,0 +1,14 @@ +package net.lopymine.patpat.entrypoint.impl.forge; + +//? if forge { + +/*import net.lopymine.patpat.dedicated.PatPatDedicatedServer; + +public class ForgeDedicatedEntrypoint { + + public static void onInitializeServer() { + PatPatDedicatedServer.onInitializeServer(); + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/event/PatPatForgeClientStoppingEvent.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/event/PatPatForgeClientStoppingEvent.java new file mode 100644 index 00000000..c43662e0 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/event/PatPatForgeClientStoppingEvent.java @@ -0,0 +1,13 @@ +package net.lopymine.patpat.entrypoint.impl.forge.event; + +//? if forge { + +/*import net.minecraftforge.eventbus.api.Event; + +public class PatPatForgeClientStoppingEvent extends Event { + + public PatPatForgeClientStoppingEvent() { + } + +} +*///?} \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeClientModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeClientModLoader.java new file mode 100644 index 00000000..2eb7fe65 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeClientModLoader.java @@ -0,0 +1,193 @@ +package net.lopymine.patpat.entrypoint.impl.forge.loader; + +//? if forge { + +/*import com.mojang.brigadier.CommandDispatcher; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.*; +import lombok.Getter; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.client.resourcepack.AbstractResourceReloadListener; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; +import net.lopymine.patpat.entrypoint.impl.forge.event.PatPatForgeClientStoppingEvent; +import net.lopymine.patpat.entrypoint.impl.forge.loader.ForgeServerModLoader.*; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader.ClientPacketRegister.PatPatClientPacketHandler; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.*; +import net.minecraft.client.*; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvent; +import net.minecraftforge.client.event.*; +//? if >=1.18.2 { +import net.minecraftforge.client.event.RenderLevelStageEvent.Stage; +//?} +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent.*; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.network.*; +import net.minecraftforge.network.simple.SimpleChannel; +import net.minecraftforge.registries.DeferredRegister; + +public class ForgeClientModLoader implements IClientModLoader { + + @Override + public void registerClientCommands(Consumer> consumer) { + //? if >=1.18 { + MinecraftForge.EVENT_BUS.addListener((event) -> { + consumer.accept(event.getDispatcher()); + }); + //?} + } + + @Override + public void registerAfterEntitiesRenderer(CustomRenderer renderer) { + //? if >=1.18.2 { + MinecraftForge.EVENT_BUS.addListener((event) -> { + //? if >=1.19.3 { + if (event.getStage() != Stage.AFTER_ENTITIES) { + //?} else { + /^if (event.getStage() != Stage.AFTER_TRANSLUCENT_BLOCKS) { + ^///?} + return; + } + renderer.render(Minecraft.getInstance().renderBuffers().bufferSource(), event.getPoseStack()); + }); + //?} else { + /^MinecraftForge.EVENT_BUS.addListener((event) -> { + renderer.render(Minecraft.getInstance().renderBuffers().bufferSource(), event.getMatrixStack()); + }); + ^///?} + } + + @Override + public void registerAfterWorldTickListener(Consumer consumer) { + //? if >=1.19 { + MinecraftForge.EVENT_BUS.addListener((event) -> { + if (event.side != LogicalSide.CLIENT || event.phase != Phase.END || !(event.level instanceof ClientLevel clientLevel)) { + return; + } + consumer.accept(clientLevel); + }); + //?} else { + /^MinecraftForge.EVENT_BUS.addListener((event) -> { + if (event.side != LogicalSide.CLIENT || event.phase != Phase.END || !(event.world instanceof ClientLevel clientLevel)) { + return; + } + consumer.accept(clientLevel); + }); + ^///?} + } + + @Override + public void registerResourceReloadListener(AbstractResourceReloadListener listener) { + FMLJavaModLoadingContext.get().getModEventBus().addListener((event) -> { + event.registerReloadListener(listener); + }); + } + + @Override + public void registerKeybinding(KeyMapping keybinding) { + //? if >=1.19 { + FMLJavaModLoadingContext.get().getModEventBus().addListener((event) -> { + event.register(keybinding); + }); + //?} else { + /^FMLJavaModLoadingContext.get().getModEventBus().addListener((event) -> { + net.minecraftforge.client.ClientRegistry.registerKeyBinding(keybinding); + }); + ^///?} + } + + @Override + public void registerSounds(Consumer consumer) { + ForgeSoundRegister register = new ForgeSoundRegister(); + consumer.accept(register); + register.finish(); + } + + public static class ForgeSoundRegister implements SoundRegister { + + private final DeferredRegister register; + + public ForgeSoundRegister() { + //? if >=1.18.2 { + this.register = DeferredRegister.create(VersionedThings.SOUND_EVENT.key(), PatPat.MOD_ID); + //?} else { + /^this.register = DeferredRegister.create(net.minecraftforge.registries.ForgeRegistries.SOUND_EVENTS, PatPat.MOD_ID); + ^///?} + } + + public SoundEvent registerSound(String id) { + SoundEvent event = SoundUtils.getSoundEvent(id); + this.register.register(id, () -> event); + return event; + } + + public void finish() { + this.register.register(FMLJavaModLoadingContext.get().getModEventBus()); + } + + } + + @Override + public void registerClientPlayerLogListener(ClientPlayerLogListener consumer) { + //? if >=1.19 { + MinecraftForge.EVENT_BUS.addListener((e) -> consumer.onLog(false)); + MinecraftForge.EVENT_BUS.addListener((e) -> consumer.onLog(true)); + //?} else { + /^MinecraftForge.EVENT_BUS.addListener((e) -> consumer.onLog(false)); + MinecraftForge.EVENT_BUS.addListener((e) -> consumer.onLog(true)); + ^///?} + } + + @Override + public void registerOnClientStop(Runnable runnable) { + MinecraftForge.EVENT_BUS.addListener((event) -> runnable.run()); + } + + @Override + public void registerClientPackets(Consumer consumer) { + if (!(ServerMultiLoader.getInstance() instanceof ForgeServerModLoader serverModLoader)) { + return; + } + + ForgeLazyClientPacketHandler packetHandler = serverModLoader.getForgeLazyClientPacketHandler(); + if (packetHandler == null) { + return; + } + + ClientPacketRegister register = new ClientPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PatPatClientPacketHandler

handler) { + Map> lazyListeners = packetHandler.getLazyListeners(); + lazyListeners.put(type.getId(), handler); + } + }; + + consumer.accept(register); + } + + @Override + public void sendPacketToServer(BasePatPatPacket packet) { + if (!(ServerMultiLoader.getInstance() instanceof ForgeServerModLoader serverModLoader)) { + return; + } + + ForgeServerModLoader.ForgePackerHandler packerHandler = serverModLoader.getPackerHandler(); + if (packerHandler == null) { + return; + } + + if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { + pingPong.pong(packet); + } else { + packerHandler.getPacketsChannel().sendToServer(packet); + } + } +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeEarlyCommonModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeEarlyCommonModLoader.java new file mode 100644 index 00000000..382dde00 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeEarlyCommonModLoader.java @@ -0,0 +1,64 @@ +package net.lopymine.patpat.entrypoint.impl.forge.loader; + +//? if forge { + +/*import java.io.*; +import java.nio.file.*; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.loader.IEarlyCommonModLoader; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.*; +import net.minecraftforge.forgespi.language.IModFileInfo; +import org.jetbrains.annotations.Nullable; + +public class ForgeEarlyCommonModLoader implements IEarlyCommonModLoader { + + @Override + public String getPlatform() { + return "Forge"; + } + + @Override + public Path getConfigDir() { + return FMLPaths.CONFIGDIR.get(); + } + + @Override + public boolean isDevelopmentEnvironment() { + return !FMLLoader.isProduction(); + } + + @Override + public boolean isModLoaded(String modId) { + ModList list = ModList.get(); + if (list == null) { + return FMLLoader.getLoadingModList().getModFileById(modId) != null; + } else { + return list.isLoaded(modId); + } + } + + @Override + public @Nullable InputStream loadModFile(String modId, String path) { + IModFileInfo file = ModList.get().getModFileById(modId); + if (file == null) { + PatPat.LOGGER.error("Failed to load file at \"{}\", because \"{}\" mod container doesn't exits!", path, modId); + return null; + } + try { + return Files.newInputStream(file.getFile().findResource(path)); + } catch (IOException e) { + PatPat.LOGGER.error("Failed to open file at \"{}\", reason:", path, e); + return null; + } + } + + @Override + public ModEnvironment getEnvironment() { + return switch (FMLEnvironment.dist) { + case CLIENT -> ModEnvironment.CLIENT; + case DEDICATED_SERVER -> ModEnvironment.SERVER; + }; + } +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeServerModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeServerModLoader.java new file mode 100644 index 00000000..92abed3f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/forge/loader/ForgeServerModLoader.java @@ -0,0 +1,239 @@ +package net.lopymine.patpat.entrypoint.impl.forge.loader; + +//? if forge { + +/*import com.mojang.authlib.GameProfile; +import com.mojang.brigadier.CommandDispatcher; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.*; +import lombok.Getter; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader.ClientPacketRegister.PatPatClientPacketHandler; +import net.lopymine.patpat.entrypoint.loader.server.IServerModLoader; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.*; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.resources.Identifier; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.*; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.server.*; +import net.minecraftforge.network.*; +import net.minecraftforge.network.simple.SimpleChannel; +import net.minecraftforge.server.permission.PermissionAPI; +//? if >=1.18 { +import net.minecraftforge.server.permission.events.PermissionGatherEvent.Nodes; +import net.minecraftforge.server.permission.nodes.*; +//?} else { +/^import net.minecraftforge.server.permission.DefaultPermissionLevel; +^///?} +import org.jetbrains.annotations.Nullable; + +@Getter +public class ForgeServerModLoader implements IServerModLoader { + + //? if >=1.18 { + private final Map> permissionNodes = new HashMap<>(); + private final List> registrationNodes = new ArrayList<>(); + //?} else { + /^private final Set permissionNodes = new HashSet<>(); + ^///?} + + @Nullable + private ForgePackerHandler packerHandler; + @Nullable + private ForgeServerModLoader.ForgeLazyClientPacketHandler forgeLazyClientPacketHandler; + + @Override + public void registerServerCommands(Consumer> consumer) { + MinecraftForge.EVENT_BUS.addListener((event) -> { + consumer.accept(event.getDispatcher()); + }); + //? if >=1.18 { + MinecraftForge.EVENT_BUS.addListener((nodes) -> { + nodes.addNodes(this.registrationNodes); + }); + //?} + } + + @Override + public void registerServerPlayerLogListener(ServerPlayerLogListener consumer) { + //? if >=1.19 { + MinecraftForge.EVENT_BUS.addListener((event) -> consumer.onLog(false, event.getEntity())); + MinecraftForge.EVENT_BUS.addListener((event) -> consumer.onLog(true, event.getEntity())); + //?} else { + /^MinecraftForge.EVENT_BUS.addListener((event) -> consumer.onLog(false, event.getPlayer())); + MinecraftForge.EVENT_BUS.addListener((event) -> consumer.onLog(true, event.getPlayer())); + ^///?} + } + + @Override + public void registerOnServerStart(Runnable runnable) { + MinecraftForge.EVENT_BUS.addListener((event) -> runnable.run()); + } + + @Override + public void registerOnServerStop(Runnable runnable) { + MinecraftForge.EVENT_BUS.addListener((event) -> runnable.run()); + } + + @Override + public void registerServerPackets(Consumer consumer) { + if (this.packerHandler == null) { + this.packerHandler = new ForgePackerHandler("1", "patpat_packets_channel"); + } + if (this.forgeLazyClientPacketHandler == null) { + this.forgeLazyClientPacketHandler = new ForgeLazyClientPacketHandler(); + } + + SimpleChannel channel = this.packerHandler.packetsChannel; + ServerPacketRegister register = new ServerPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PacketRegistrationSide registrationSide, PatPatServerPacketHandler

handler) { + BiConsumer> handle = (p, context) -> { + context.get().enqueueWork(() -> { + if (p instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply((packet) -> { + channel.reply(packet, context.get()); + }); + } + + if (registrationSide == PacketRegistrationSide.S2C || registrationSide == PacketRegistrationSide.BOTH) { + Map> lazyListeners = ForgeServerModLoader.this.forgeLazyClientPacketHandler.lazyListeners; + @SuppressWarnings("unchecked") + PatPatClientPacketHandler

packetHandler = (PatPatClientPacketHandler

) lazyListeners.get(p.getPatPatType().getId()); + if (packetHandler != null) { + packetHandler.handle(p); + } + } + if (registrationSide == PacketRegistrationSide.C2S || registrationSide == PacketRegistrationSide.BOTH) { + ServerPlayer sender = context.get().getSender(); + if (sender != null) { + handler.handle(sender, p); + } + } + }); + context.get().setPacketHandled(true); + }; + + channel.registerMessage(ForgeServerModLoader.this.packerHandler.latestPacketId.getAndIncrement(), type.getClazz(), BasePatPatPacket::write, type.getFactory(), handle); + } + }; + + consumer.accept(register); + } + + @Override + public void sendPacketToPlayer(ServerPlayer player, BasePatPatPacket packet) { + if (this.packerHandler == null) { + return; + } + + if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { + pingPong.pong(packet); + } else { + this.packerHandler.getPacketsChannel().send(PacketDistributor.PLAYER.with(() -> player), packet); + } + } + + @Override + public void registerPermission(String name) { + String permission = name.startsWith(PatPat.MOD_ID) ? name.replaceFirst(PatPat.MOD_ID + "\\.", "") : name; + if (permission.isEmpty()) { + return; + } + + String permissionId = "%s.%s".formatted(PatPat.MOD_ID, permission); + //? if >=1.18 { + if (this.permissionNodes.get(permissionId) != null) { + return; + } + + PermissionNode node = new PermissionNode<>( + PatPat.MOD_ID, + permission, + PermissionTypes.BOOLEAN, + (serverPlayer, uuid, something) -> + serverPlayer != null && serverPlayer.hasPermissions(2) + ); + + this.permissionNodes.put(permissionId, node); + this.registrationNodes.add(node); + //?} else { + /^if (!this.permissionNodes.add(permissionId)) { + return; + } + + PermissionAPI.registerNode(permissionId, DefaultPermissionLevel.OP, permission); + ^///?} + } + + @Override + public boolean hasPermission(ServerPlayer player, String permission) { + //? if >=1.18 { + PermissionNode node = this.permissionNodes.get(permission); + if (node == null) { + return false; + } + return PermissionAPI.getPermission(player, node); + //?} else { + /^if (!this.permissionNodes.contains(permission)) { + return false; + } + return PermissionAPI.hasPermission(player, permission); + ^///?} + } + + @Override + public CompletableFuture hasOfflinePermission( + GameProfile profile, + MinecraftServer server, + String permission + ) { + UUID uuid = profile.getId(); + return CompletableFuture.supplyAsync(() -> { + //? if >=1.18 { + PermissionNode node = this.permissionNodes.get(permission); + if (node == null) { + return false; + } + return PermissionAPI.getOfflinePermission(uuid, node); + //?} else { + /^if (!this.permissionNodes.contains(permission)) { + return false; + } + return PermissionAPI.hasPermission(profile, permission, null); + ^///?} + }); + } + + @Getter + public static class ForgeLazyClientPacketHandler { + + private final Map> lazyListeners = new HashMap<>(); + + } + + @Getter + public static class ForgePackerHandler { + + private final String packetVersion; + private final SimpleChannel packetsChannel; + private final AtomicInteger latestPacketId = new AtomicInteger(0); + + public ForgePackerHandler(String packetVersion, String channelName) { + this.packetVersion = packetVersion; + this.packetsChannel = NetworkRegistry.newSimpleChannel( + RLUtils.modId(channelName), + () -> packetVersion, + NetworkRegistry.acceptMissingOr(packetVersion), + NetworkRegistry.acceptMissingOr(packetVersion) + ); + } + } +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeClientEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeClientEntrypoint.java new file mode 100644 index 00000000..9dd3a6ee --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeClientEntrypoint.java @@ -0,0 +1,35 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge; + +//? if neoforge { +/*import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.client.PatPatClient; +import net.lopymine.patpat.modmenu.integration.PatPatModMenuIntegration; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; + +//? if >=1.20.5 { +@Mod(value = PatPat.MOD_ID, dist = Dist.CLIENT) +//?} +public class NeoForgeClientEntrypoint { + + private static IEventBus INITIALIZATION_EVENT_BUS; + + public NeoForgeClientEntrypoint(ModContainer container, IEventBus bus) { + INITIALIZATION_EVENT_BUS = bus; + PatPatClient.onInitializeClient(); + + PatPatModMenuIntegration modMenuIntegration = new PatPatModMenuIntegration(); + modMenuIntegration.register(container); + + INITIALIZATION_EVENT_BUS = null; + } + + public static IEventBus getEventBus() { + return INITIALIZATION_EVENT_BUS == null ? NeoForge.EVENT_BUS : INITIALIZATION_EVENT_BUS; + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeCommonEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeCommonEntrypoint.java new file mode 100644 index 00000000..3d3abfc7 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeCommonEntrypoint.java @@ -0,0 +1,42 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge; + +//? if neoforge { +/*import net.lopymine.patpat.*; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; + +//? if <=1.20.4 { +/^import net.lopymine.patpat.entrypoint.impl.neoforge.loader.*; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.DistExecutor; +import net.neoforged.fml.ModContainer; +^///?} + +@Mod(PatPat.MOD_ID) +public class NeoForgeCommonEntrypoint { + + private static IEventBus INITIALIZATION_EVENT_BUS; + + //? if >=1.20.5 { + public NeoForgeCommonEntrypoint(IEventBus bus) { + INITIALIZATION_EVENT_BUS = bus; + PatPat.onInitialize(); + INITIALIZATION_EVENT_BUS = null; + } + //?} else { + /^public NeoForgeCommonEntrypoint(ModContainer container, IEventBus bus) { + INITIALIZATION_EVENT_BUS = bus; + PatPat.onInitialize(); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> new NeoForgeClientEntrypoint(container, bus)); + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> new NeoForgeDedicatedEntrypoint(bus)); + INITIALIZATION_EVENT_BUS = null; + } + ^///?} + + public static IEventBus getEventBus() { + return INITIALIZATION_EVENT_BUS == null ? NeoForge.EVENT_BUS : INITIALIZATION_EVENT_BUS; + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeDedicatedEntrypoint.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeDedicatedEntrypoint.java new file mode 100644 index 00000000..ce5fcd26 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/NeoForgeDedicatedEntrypoint.java @@ -0,0 +1,29 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge; + +//? if neoforge { +/*import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.dedicated.PatPatDedicatedServer; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; + +//? if >=1.20.5 { +@Mod(value = PatPat.MOD_ID, dist = Dist.DEDICATED_SERVER) +//?} +public class NeoForgeDedicatedEntrypoint { + + private static IEventBus INITIALIZATION_EVENT_BUS; + + public NeoForgeDedicatedEntrypoint(IEventBus bus) { + INITIALIZATION_EVENT_BUS = bus; + PatPatDedicatedServer.onInitializeServer(); + INITIALIZATION_EVENT_BUS = null; + } + + public static IEventBus getEventBus() { + return INITIALIZATION_EVENT_BUS == null ? NeoForge.EVENT_BUS : INITIALIZATION_EVENT_BUS; + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/event/PatPatNeoForgeClientStoppingEvent.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/event/PatPatNeoForgeClientStoppingEvent.java new file mode 100644 index 00000000..b8398301 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/event/PatPatNeoForgeClientStoppingEvent.java @@ -0,0 +1,13 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge.event; + +//? if neoforge { + +/*import net.neoforged.bus.api.Event; + +public class PatPatNeoForgeClientStoppingEvent extends Event { + + public PatPatNeoForgeClientStoppingEvent() { + } + +} +*///?} \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeClientModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeClientModLoader.java new file mode 100644 index 00000000..c664b43f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeClientModLoader.java @@ -0,0 +1,205 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge.loader; + +//? if neoforge { +/*import com.mojang.brigadier.CommandDispatcher; + +import java.util.function.Consumer; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.client.resourcepack.AbstractResourceReloadListener; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader; +import net.lopymine.patpat.entrypoint.impl.neoforge.*; +import net.lopymine.patpat.entrypoint.impl.neoforge.event.*; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.*; +import net.minecraft.client.*; +import net.minecraft.client.multiplayer.*; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.sounds.SoundEvent; +import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.network.PacketDistributor; +//? if =1.20.4 { +/^import net.neoforged.neoforge.network.registration.NetworkRegistry; +^///?} +import net.neoforged.neoforge.registries.DeferredRegister; + +//? if >=1.21.7 { + +import net.neoforged.neoforge.client.network.ClientPacketDistributor; +import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent; +import net.neoforged.neoforge.network.handling.IPayloadHandler; + +//?} + +public class NeoForgeClientModLoader implements IClientModLoader { + + @Override + public void registerOnClientStop(Runnable runnable) { + NeoForge.EVENT_BUS.addListener(PatPatNeoForgeClientStoppingEvent.class, event -> runnable.run()); + } + + @Override + public void registerClientCommands(Consumer> consumer) { + NeoForge.EVENT_BUS.addListener(RegisterClientCommandsEvent.class, (event) -> consumer.accept(event.getDispatcher())); + } + + @Override + public void registerAfterEntitiesRenderer(CustomRenderer renderer) { + //? if >=1.21.6 && <=1.21.8 { + /^NeoForge.EVENT_BUS.addListener(RenderLevelStageEvent.AfterEntities.class, (p) -> { + renderer.render(Minecraft.getInstance().renderBuffers().bufferSource(), p.getPoseStack()); + }); + ^///?} + + //? if <=1.21.5 { + /^NeoForge.EVENT_BUS.addListener(RenderLevelStageEvent.class, (p) -> { + if (p.getStage() != RenderLevelStageEvent.Stage.AFTER_ENTITIES) { + return; + } + renderer.render(Minecraft.getInstance().renderBuffers().bufferSource(), p.getPoseStack()); + }); + ^///?} + } + + @Override + public void registerAfterWorldTickListener(Consumer runnable) { + //? if >=1.20.5 { + NeoForge.EVENT_BUS.addListener(ClientTickEvent.Post.class, (p) -> { + ClientLevel level = Minecraft.getInstance().level; + if (level == null) { + return; + } + runnable.accept(level); + }); + //?} else { + /^NeoForge.EVENT_BUS.addListener(net.neoforged.neoforge.event.TickEvent.ClientTickEvent.class, (p) -> { + if (p.phase != net.neoforged.neoforge.event.TickEvent.Phase.END) { + return; + } + ClientLevel level = Minecraft.getInstance().level; + if (level == null) { + return; + } + runnable.accept(level); + }); + ^///?} + } + + @Override + public void registerResourceReloadListener(AbstractResourceReloadListener listener) { + //? if >=1.21.4 { + NeoForgeClientEntrypoint.getEventBus().addListener(AddClientReloadListenersEvent.class, (e) -> e.addListener(listener.getId(), listener)); + //?} + + //? if <=1.21.1 { + /^NeoForgeClientEntrypoint.getEventBus().addListener(RegisterClientReloadListenersEvent.class, (e) -> e.registerReloadListener(listener)); + ^///?} + } + + @Override + public void registerKeybinding(KeyMapping keybinding) { + NeoForgeClientEntrypoint.getEventBus().addListener(RegisterKeyMappingsEvent.class, (event) -> event.register(keybinding)); + } + + @Override + public void registerSounds(Consumer consumer) { + NeoForgeSoundRegister register = new NeoForgeSoundRegister(); + consumer.accept(register); + register.finish(); + } + + public static class NeoForgeSoundRegister implements SoundRegister { + + private final DeferredRegister register; + + public NeoForgeSoundRegister() { + this.register = DeferredRegister.create(VersionedThings.SOUND_EVENT.key(), PatPat.MOD_ID); + } + + public SoundEvent registerSound(String id) { + SoundEvent event = SoundUtils.getSoundEvent(id); + this.register.register(id, () -> event); + return event; + } + + public void finish() { + this.register.register(NeoForgeClientEntrypoint.getEventBus()); + } + + } + + @Override + public void registerClientPlayerLogListener(ClientPlayerLogListener consumer) { + NeoForge.EVENT_BUS.addListener(ClientPlayerNetworkEvent.LoggingOut.class, (e) -> consumer.onLog(false)); + NeoForge.EVENT_BUS.addListener(ClientPlayerNetworkEvent.LoggingIn.class, (e) -> consumer.onLog(true)); + } + + @Override + public void registerClientPackets(Consumer consumer) { + //? if <=1.21.6 { + /^ClientPacketRegister register = new ClientPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PatPatClientPacketHandler

handler) { + if (!(ServerMultiLoader.getInstance() instanceof NeoForgeServerModLoader serverLoader)) { + return; + } + serverLoader.getClientHandlers().put(type.getId(), handler); + } + }; + consumer.accept(register); + ^///?} + + //? if >=1.21.7 { + NeoForgeClientEntrypoint.getEventBus().addListener(RegisterClientPayloadHandlersEvent.class, (event) -> { + ClientPacketRegister register = new ClientPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PatPatClientPacketHandler

handler) { + IPayloadHandler

payloadHandler = (packet, context) -> { + if (packet instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply(context::reply); + } + handler.handle(packet); + }; + event.register(type.getPacketId(), payloadHandler); + } + }; + consumer.accept(register); + }); + //?} + } + + @Override + public void sendPacketToServer(BasePatPatPacket packet) { + ClientPacketListener connection = Minecraft.getInstance().getConnection(); + if (connection == null) { + return; + } + //? if >=1.20.5 { + if (!connection.hasChannel(packet.type())) { + return; + } + //?} elif >=1.20.4 { + /^if (!NetworkRegistry.getInstance().isConnected(connection, packet.getPatPatType().getId())) { + return; + } + ^///?} + if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { + pingPong.pong(packet); + } else { + //? if >=1.21.7 { + ClientPacketDistributor.sendToServer(packet); + //?} elif >=1.20.5 { + /^PacketDistributor.sendToServer(packet); + ^///?} elif >=1.20.4 { + /^PacketDistributor.SERVER.noArg().send(packet); + ^///?} else { + /^if (ServerMultiLoader.getInstance() instanceof NeoForgeServerModLoader serverLoader && serverLoader.getNeoForgeChannelHandler() != null) { + serverLoader.getNeoForgeChannelHandler().getChannel().sendToServer(packet); + } + ^///?} + } + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeEarlyModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeEarlyModLoader.java new file mode 100644 index 00000000..72e3ed3c --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeEarlyModLoader.java @@ -0,0 +1,91 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge.loader; + +//? if neoforge { + + +/*import java.io.*; +import java.nio.file.*; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.loader.IEarlyCommonModLoader; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.*; +import net.neoforged.neoforgespi.language.IModFileInfo; + +public class NeoForgeEarlyModLoader implements IEarlyCommonModLoader { + + @Override + public String getPlatform() { + return "NeoForge"; + } + + @Override + public boolean isDevelopmentEnvironment() { + //? if >=1.21.9 { + return !FMLEnvironment.isProduction(); + //?} + + //? if <=1.21.8 { + /^return !FMLEnvironment.production; + ^///?} + } + + @Override + public Path getConfigDir() { + return FMLPaths.CONFIGDIR.get().resolve("%s/".formatted(PatPat.MOD_ID)); + } + + @Override + public boolean isModLoaded(String modId) { + ModList list = ModList.get(); + if (list == null) { + //? if >=1.21.9 { + return FMLLoader.getCurrent().getLoadingModList().getModFileById(modId) != null; + //?} + + //? if <=1.21.8 { + /^return FMLLoader.getLoadingModList().getModFileById(modId) != null; + ^///?} + } + return list.isLoaded(modId); + } + + @Override + public InputStream loadModFile(String modId, String path) { + IModFileInfo file = ModList.get().getModFileById(modId); + if (file == null) { + PatPat.LOGGER.error("Failed to load file at \"{}\", because \"{}\" mod container doesn't exits!", path, modId); + return null; + } + try { + //? if >=1.21.9 { + return file.getFile().getContents().openFile(path); + //?} + + //? if <=1.21.8 { + /^return Files.newInputStream(file.getFile().findResource(path)); + ^///?} + } catch (IOException e) { + PatPat.LOGGER.error("Failed to open file at \"{}\", reason:", path, e); + return null; + } + } + + @Override + public ModEnvironment getEnvironment() { + //? if >=1.21.9 { + return switch (FMLEnvironment.getDist()) { + case CLIENT -> ModEnvironment.CLIENT; + case DEDICATED_SERVER -> ModEnvironment.SERVER; + }; + //?} + + //? if <=1.21.8 { + /^return switch (FMLEnvironment.dist) { + case CLIENT -> ModEnvironment.CLIENT; + case DEDICATED_SERVER -> ModEnvironment.SERVER; + }; + ^///?} + } +} + +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeServerModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeServerModLoader.java new file mode 100644 index 00000000..00d728c5 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/impl/neoforge/loader/NeoForgeServerModLoader.java @@ -0,0 +1,319 @@ +package net.lopymine.patpat.entrypoint.impl.neoforge.loader; + +//? if neoforge { +/*import com.mojang.brigadier.CommandDispatcher; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import lombok.Getter; +import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.impl.neoforge.NeoForgeCommonEntrypoint; +import net.lopymine.patpat.entrypoint.loader.client.IClientModLoader.ClientPacketRegister.PatPatClientPacketHandler; +import net.lopymine.patpat.entrypoint.loader.server.IServerModLoader; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.*; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.resources.Identifier; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.server.*; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.server.permission.PermissionAPI; + +//? if >=1.20.5 { +import net.neoforged.neoforge.network.handling.IPayloadHandler; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; +//?} elif >=1.20.4 { +/^import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +import net.neoforged.neoforge.network.registration.IPayloadRegistrar; +import net.neoforged.neoforge.network.registration.NetworkRegistry; +^///?} else { +/^import java.util.concurrent.atomic.AtomicInteger; +import net.neoforged.neoforge.network.NetworkEvent; +import net.neoforged.neoforge.network.NetworkRegistry; +import net.neoforged.neoforge.network.simple.SimpleChannel; +^///?} + +import net.neoforged.neoforge.server.permission.nodes.*; +import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; +import net.neoforged.neoforge.server.permission.events.PermissionGatherEvent.Nodes; + +//? if >=1.21.11 { +import net.minecraft.server.permissions.*; +import net.minecraft.server.permissions.Permission.HasCommandLevel; +//?} + +//? if >=1.21.9 { +import net.minecraft.server.players.NameAndId; +//?} else { + +/^import com.mojang.authlib.GameProfile; + +^///?} + +@Getter +public class NeoForgeServerModLoader implements IServerModLoader { + + private final Map> permissionNodes = new HashMap<>(); + private final List> registrationNodes = new ArrayList<>(); + + private final Map> clientHandlers = new HashMap<>(); + + //? if <=1.20.3 { + /^private NeoForgeChannelHandler neoForgeChannelHandler; + ^///?} + + @Override + public void registerServerCommands(Consumer> consumer) { + NeoForge.EVENT_BUS.addListener(RegisterCommandsEvent.class, (event) -> consumer.accept(event.getDispatcher())); + NeoForge.EVENT_BUS.addListener(Nodes.class, (nodes) -> nodes.addNodes(this.registrationNodes)); + } + + @Override + public void registerServerPlayerLogListener(ServerPlayerLogListener consumer) { + NeoForge.EVENT_BUS.addListener(PlayerEvent.PlayerLoggedOutEvent.class, event -> consumer.onLog(false, event.getEntity())); + NeoForge.EVENT_BUS.addListener(PlayerEvent.PlayerLoggedInEvent.class, event -> consumer.onLog(true, event.getEntity())); + } + + @Override + public void registerOnServerStart(Runnable runnable) { + NeoForge.EVENT_BUS.addListener(ServerStartedEvent.class, (s) -> runnable.run()); + } + + @Override + public void registerOnServerStop(Runnable runnable) { + NeoForge.EVENT_BUS.addListener(ServerStoppingEvent.class, (s) -> runnable.run()); + } + + //? if <=1.21.6 { + /^@SuppressWarnings("unchecked") + ^///?} + @Override + public void registerServerPackets(Consumer consumer) { + //? if >=1.20.5 { + NeoForgeCommonEntrypoint.getEventBus().addListener(RegisterPayloadHandlersEvent.class, (e) -> { + PayloadRegistrar registrar = e.registrar("1").optional(); + + ServerPacketRegister register = new ServerPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PacketRegistrationSide registrationSide, PatPatServerPacketHandler

handler) { + IPayloadHandler

payloadHandler = (packet, context) -> { + Player player = context.player(); + if (!(player instanceof ServerPlayer serverPlayer)) { + return; + } + handler.handle(serverPlayer, packet); + }; + + //? if <=1.21.6 { + /^IPayloadHandler

clientPayloadHandler = (packet, context) -> { + PatPatClientPacketHandler

clientHandler = (PatPatClientPacketHandler

) NeoForgeServerModLoader.this.clientHandlers.get(packet.getPatPatType().getId()); + if (clientHandler == null) { + return; + } + + clientHandler.handle(packet); + }; + ^///?} + + switch (registrationSide) { + case C2S -> registrar.playToServer(type.getPacketId(), type.getCodec(), payloadHandler); + case S2C -> registrar.playToClient(type.getPacketId(), type.getCodec() + //? if <=1.21.6 { + /^, clientPayloadHandler + ^///?} + ); + case BOTH -> { + registrar.playToServer(type.getPacketId(), type.getCodec(), payloadHandler); + registrar.playToClient(type.getPacketId(), type.getCodec(), payloadHandler); + } + } + } + }; + consumer.accept(register); + }); + //?} elif >=1.20.4 { + /^NeoForgeCommonEntrypoint.getEventBus().addListener(RegisterPayloadHandlerEvent.class, (e) -> { + IPayloadRegistrar registrar = e.registrar(PatPat.MOD_ID).optional(); + + ServerPacketRegister register = new ServerPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PacketRegistrationSide registrationSide, PatPatServerPacketHandler

handler) { + net.neoforged.neoforge.network.handling.IPlayPayloadHandler

payloadHandler = (packet, context) -> { + Player player = context.player().orElse(null); + if (!(player instanceof ServerPlayer serverPlayer)) { + return; + } + if (packet instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply(context.replyHandler()::send); + } + handler.handle(serverPlayer, packet); + }; + + net.neoforged.neoforge.network.handling.IPlayPayloadHandler

clientPayloadHandler = (packet, context) -> { + PatPatClientPacketHandler

clientHandler = (PatPatClientPacketHandler

) NeoForgeServerModLoader.this.clientHandlers.get(packet.getPatPatType().getId()); + if (clientHandler == null) { + return; + } + if (packet instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply(context.replyHandler()::send); + } + clientHandler.handle(packet); + }; + + net.minecraft.network.FriendlyByteBuf.Reader

reader = type.getFactory()::apply; + switch (registrationSide) { + case C2S -> registrar.play(type.getId(), reader, payloadHandler); + case S2C -> registrar.play(type.getId(), reader, (builder) -> builder.client(clientPayloadHandler)); + case BOTH -> registrar.play(type.getId(), reader, (builder) -> builder.server(payloadHandler).client(payloadHandler)); + } + } + }; + consumer.accept(register); + }); + ^///?} else { + /^if (this.neoForgeChannelHandler == null) { + this.neoForgeChannelHandler = new NeoForgeChannelHandler("1", "patpat_packets_channel"); + } + + SimpleChannel channel = this.neoForgeChannelHandler.channel; + ServerPacketRegister register = new ServerPacketRegister() { + @Override + public

> void register(PatPatPacketType

type, PacketRegistrationSide registrationSide, PatPatServerPacketHandler

handler) { + net.neoforged.neoforge.network.simple.MessageFunctions.MessageConsumer

handle = (p, context) -> { + context.enqueueWork(() -> { + if (p instanceof PingPatPacket pingPacket) { + pingPacket.setPacketReply((packet) -> channel.reply(packet, context)); + } + if (registrationSide == PacketRegistrationSide.S2C || registrationSide == PacketRegistrationSide.BOTH) { + PatPatClientPacketHandler

clientHandler = (PatPatClientPacketHandler

) NeoForgeServerModLoader.this.clientHandlers.get(p.getPatPatType().getId()); + if (clientHandler != null) { + clientHandler.handle(p); + } + } + if (registrationSide == PacketRegistrationSide.C2S || registrationSide == PacketRegistrationSide.BOTH) { + ServerPlayer sender = context.getSender(); + if (sender != null) { + handler.handle(sender, p); + } + } + }); + context.setPacketHandled(true); + }; + + channel.registerMessage(NeoForgeServerModLoader.this.neoForgeChannelHandler.latestPacketId.getAndIncrement(), type.getClazz(), BasePatPatPacket::write, type.getFactory()::apply, handle); + } + }; + consumer.accept(register); + ^///?} + } + + @Override + public void sendPacketToPlayer(ServerPlayer player, BasePatPatPacket packet) { + //? if >=1.20.5 { + if (!player.connection.hasChannel(packet.getPatPatType().getId())) { + return; + } + //?} elif >=1.20.4 { + /^if (!NetworkRegistry.getInstance().isConnected(player.connection, packet.getPatPatType().getId())) { + return; + } + ^///?} else { + /^if (this.neoForgeChannelHandler == null) { + return; + } + ^///?} + if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { + pingPong.pong(packet); + } else { + //? if >=1.20.5 { + PacketDistributor.sendToPlayer(player, packet); + //?} elif >=1.20.4 { + /^PacketDistributor.PLAYER.with(player).send(packet); + ^///?} else { + /^this.neoForgeChannelHandler.channel.send(PacketDistributor.PLAYER.with(() -> player), packet); + ^///?} + } + } + + @Override + public void registerPermission(String name) { + String permission = name.startsWith(PatPat.MOD_ID) ? name.replaceFirst(PatPat.MOD_ID + "\\.", "") : name; + if (permission.isEmpty()) { + return; + } + + String permissionId = "%s.%s".formatted(PatPat.MOD_ID, permission); + if (this.permissionNodes.get(permissionId) != null) { + return; + } + + PermissionNode node = new PermissionNode<>( + PatPat.MOD_ID, + permission, + PermissionTypes.BOOLEAN, + (serverPlayer, uuid, something) -> serverPlayer != null && + //? if >=1.21.11 { + serverPlayer.permissions().hasPermission(new HasCommandLevel(PermissionLevel.GAMEMASTERS)) + //?} else { + /^serverPlayer.hasPermissions(2) + ^///?} + ); + + this.permissionNodes.put(permissionId, node); + this.registrationNodes.add(node); + } + + @Override + public boolean hasPermission(ServerPlayer player, String permission) { + PermissionNode node = this.permissionNodes.get(permission); + if (node == null) { + return false; + } + return PermissionAPI.getPermission(player, node); + } + + @Override + public CompletableFuture hasOfflinePermission( + /^? if >=1.21.9 {^/ NameAndId /^?} else {^/ /^GameProfile ^//^?}^/ profile, + MinecraftServer server, + String permission + ) { + return CompletableFuture.supplyAsync(() -> { + PermissionNode node = this.permissionNodes.get(permission); + if (node == null) { + return false; + } + return PermissionAPI.getOfflinePermission( + /^? if >=1.21.9 {^/ profile.id() /^?} else {^/ /^profile.getId() ^//^?}^/, + node + ); + }); + } + + //? if <=1.20.3 { + /^@Getter + public static class NeoForgeChannelHandler { + + private final SimpleChannel channel; + private final AtomicInteger latestPacketId = new AtomicInteger(0); + + public NeoForgeChannelHandler(String packetVersion, String channelName) { + this.channel = NetworkRegistry.newSimpleChannel( + RLUtils.modId(channelName), + () -> packetVersion, + NetworkRegistry.acceptMissingOr(packetVersion), + NetworkRegistry.acceptMissingOr(packetVersion) + ); + } + } + ^///?} + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/loader/IEarlyCommonModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/loader/IEarlyCommonModLoader.java new file mode 100644 index 00000000..26ac237f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/loader/IEarlyCommonModLoader.java @@ -0,0 +1,36 @@ +package net.lopymine.patpat.entrypoint.loader; + +import java.io.InputStream; +import java.nio.file.Path; +import java.util.Locale; +import org.jetbrains.annotations.Nullable; + +public interface IEarlyCommonModLoader { + + default String getFullPlatform() { + ModEnvironment env = this.getEnvironment(); + String environment = env.name().substring(0, 1).toUpperCase(Locale.ROOT) + env.name().substring(1).toLowerCase(Locale.ROOT); + return "%s/%s".formatted(this.getPlatform(), environment); + } + + String getPlatform(); + + Path getConfigDir(); + + boolean isDevelopmentEnvironment(); + + boolean isModLoaded(String modId); + + @Nullable + InputStream loadModFile(String modId, String path); + + ModEnvironment getEnvironment(); + + enum ModEnvironment { + + SERVER, + CLIENT + + } + +} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/loader/client/IClientModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/loader/client/IClientModLoader.java new file mode 100644 index 00000000..57a81195 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/loader/client/IClientModLoader.java @@ -0,0 +1,78 @@ +//~ client_fabric_commands + +package net.lopymine.patpat.entrypoint.loader.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.brigadier.CommandDispatcher; +import java.util.function.Consumer; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; + *///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; + *///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +//?} +//?} +import net.lopymine.patpat.client.resourcepack.AbstractResourceReloadListener; +import net.lopymine.patpat.packet.*; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.sounds.SoundEvent; + +public interface IClientModLoader { + + void registerClientCommands(Consumer> consumer); + + void registerAfterEntitiesRenderer(CustomRenderer renderer); + + void registerAfterWorldTickListener(Consumer consumer); + + void registerResourceReloadListener(AbstractResourceReloadListener listener); + + void registerKeybinding(KeyMapping keybinding); + + void registerSounds(Consumer consumer); + + void registerClientPlayerLogListener(ClientPlayerLogListener consumer); + + void registerOnClientStop(Runnable runnable); + + void registerClientPackets(Consumer consumer); + + void sendPacketToServer(BasePatPatPacket packet); + + interface ClientPacketRegister { + +

> void register(PatPatPacketType

type, PatPatClientPacketHandler

handler); + + interface PatPatClientPacketHandler> { + + void handle(T packet); + + } + + } + + interface ClientPlayerLogListener { + + void onLog(boolean loggedIn); + + } + + interface CustomRenderer { + + void render(MultiBufferSource source, PoseStack stack); + + } + + interface SoundRegister { + + SoundEvent registerSound(String id); + + void finish(); + + } + +} diff --git a/src/main/java/net/lopymine/patpat/entrypoint/loader/server/IServerModLoader.java b/src/main/java/net/lopymine/patpat/entrypoint/loader/server/IServerModLoader.java new file mode 100644 index 00000000..2b070f84 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/entrypoint/loader/server/IServerModLoader.java @@ -0,0 +1,70 @@ +package net.lopymine.patpat.entrypoint.loader.server; + +import com.mojang.authlib.GameProfile; +import com.mojang.brigadier.CommandDispatcher; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import net.lopymine.patpat.packet.*; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +//? if >=1.21.9 { +import net.minecraft.server.players.NameAndId; + //?} else { +/*import com.mojang.authlib.GameProfile; +*///?} + +public interface IServerModLoader { + + void registerServerCommands(Consumer> consumer); + + void registerServerPlayerLogListener(ServerPlayerLogListener consumer); + + void registerOnServerStart(Runnable runnable); + + void registerOnServerStop(Runnable runnable); + + void registerServerPackets(Consumer consumer); + + void sendPacketToPlayer(ServerPlayer player, BasePatPatPacket packet); + + boolean hasPermission(ServerPlayer player, String permission); + + CompletableFuture hasOfflinePermission( + /*? if >=1.21.9 {*/ NameAndId /*?} else {*/ /*GameProfile *//*?}*/ profile, + MinecraftServer server, + String permission + ); + + void registerPermission(String permission); + + interface ServerPacketRegister { + +

> void register(PatPatPacketType

type, PacketRegistrationSide registrationSide, PatPatServerPacketHandler

handler); + + enum PacketRegistrationSide { + + C2S, + S2C, + BOTH + + } + + interface PatPatServerPacketHandler> { + + void handle(ServerPlayer player, T packet); + + } + + } + + interface ServerPlayerLogListener { + + void onLog(boolean loggedIn, Player player); + + } + +} diff --git a/src/main/java/net/lopymine/patpat/extension/ClientCommandExtension.java b/src/main/java/net/lopymine/patpat/extension/ClientCommandExtension.java index bb6c7df1..33d1982d 100644 --- a/src/main/java/net/lopymine/patpat/extension/ClientCommandExtension.java +++ b/src/main/java/net/lopymine/patpat/extension/ClientCommandExtension.java @@ -1,16 +1,26 @@ -package net.lopymine.patpat.extension; +//~ client_fabric_commands -import net.fabricmc.fabric.api.client.command./*? if >=1.19 {*/ v2 /*?} else {*/ /*v1 *//*?}*/.FabricClientCommandSource; +package net.lopymine.patpat.extension; +import net.lopymine.patpat.PatPat; import net.lopymine.patpat.utils.TextUtils; +//? if forge || neoforge { +/*import net.minecraft.commands.FabricClientCommandSource; + *///?} else { +//? if <1.19 { +/*import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; + *///?} else { +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +//?} +//?} import net.minecraft.network.chat.*; import com.mojang.brigadier.context.CommandContext; public class ClientCommandExtension { - public static final MutableComponent PATPAT_ID = TextUtils.literal("[§aPatPat/Client§f] "); + public static final MutableComponent PATPAT_ID = TextUtils.literal("[§a%s/Client§f] ".formatted(PatPat.MOD_NAME)); private ClientCommandExtension() { throw new IllegalStateException("Extension class"); @@ -22,7 +32,13 @@ public static void sendMsg(CommandContext context, St } public static void sendMsg(CommandContext context, Component text) { + //? if fabric { context.getSource().sendFeedback(PATPAT_ID.copy().append(text)); + //?} elif >=1.19 { + /*context.getSource().sendSystemMessage(PATPAT_ID.copy().append(text)); + *///?} else { + /*context.getSource().sendSuccess(PATPAT_ID.copy().append(text), false); + *///?} } } diff --git a/src/main/java/net/lopymine/patpat/extension/CommandExtension.java b/src/main/java/net/lopymine/patpat/extension/CommandExtension.java index e5a7d08e..14ae011d 100644 --- a/src/main/java/net/lopymine/patpat/extension/CommandExtension.java +++ b/src/main/java/net/lopymine/patpat/extension/CommandExtension.java @@ -1,13 +1,15 @@ package net.lopymine.patpat.extension; -import me.lucko.fabric.api.permissions.v0.Permissions; +//import me.lucko.fabric.api.permissions.v0.Permissions; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; import net.lopymine.patpat.server.command.PatPatServerCommandManager; -import net.lopymine.patpat.utils.TextUtils; +import net.lopymine.patpat.utils.*; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; import com.mojang.brigadier.context.CommandContext; +import net.minecraft.server.level.ServerPlayer; public class CommandExtension { @@ -32,23 +34,14 @@ public static void sendMsg(CommandContext source, Component } public static boolean hasPatPatPermission(CommandSourceStack context, String permission) { - return hasPermission(context, PatPatServerCommandManager.getPermission(permission)); - } - - public static boolean hasPermission(CommandSourceStack context, String permission) { - return hasPermission(context, permission, 2); - } - - public static boolean hasPatPatPermission(CommandSourceStack context, String permission, int defaultLevel) { - return hasPermission(context, PatPatServerCommandManager.getPermission(permission), defaultLevel); - } - - public static boolean hasPermission(CommandSourceStack context, String permission, int defaultLevel) { - //? if <1.17.1 { - /*return context./^? if >=1.17.1 {^/hasPermissionLevel/^?} else {^//^hasPermission^//^?}^/(defaultLevel); - *///?} else { - return Permissions.check(context, permission, defaultLevel); - //?} + return ServerMultiLoader.getInstance().hasPermission( + //? if >=1.19 { + context.getPlayer(), + //?} else { + /*context.getEntity() instanceof ServerPlayer player ? player : null, + *///?} + permission + ); } } diff --git a/src/main/java/net/lopymine/patpat/extension/EntityExtension.java b/src/main/java/net/lopymine/patpat/extension/EntityExtension.java index 63e0b19d..d67ad170 100644 --- a/src/main/java/net/lopymine/patpat/extension/EntityExtension.java +++ b/src/main/java/net/lopymine/patpat/extension/EntityExtension.java @@ -1,6 +1,6 @@ package net.lopymine.patpat.extension; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.lopymine.patpat.client.PatPatClient; @@ -18,7 +18,7 @@ public static String getTypeId(Entity entity) { } public static String getId(EntityType entityType) { - ResourceLocation id = VersionedThings.ENTITY_TYPE.getKey(entityType); + Identifier id = VersionedThings.ENTITY_TYPE.getKey(entityType); if (id == null) { PatPatClient.LOGGER.warn("Failed to find entity type {}", entityType.getDescription()); return "null"; diff --git a/src/main/java/net/lopymine/patpat/extension/PlayerExtension.java b/src/main/java/net/lopymine/patpat/extension/PlayerExtension.java index 938f5970..ae4d8ce4 100644 --- a/src/main/java/net/lopymine/patpat/extension/PlayerExtension.java +++ b/src/main/java/net/lopymine/patpat/extension/PlayerExtension.java @@ -1,16 +1,16 @@ package net.lopymine.patpat.extension; -import me.lucko.fabric.api.permissions.v0.Permissions; -import net.minecraft.commands.CommandSourceStack; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; -import com.mojang.authlib.GameProfile; -import com.mojang.brigadier.context.CommandContext; import java.util.concurrent.CompletableFuture; -/*? if >=1.21.9*/ +//? if >=1.21.9 { import net.minecraft.server.players.NameAndId; +//?} else { +/*import com.mojang.authlib.GameProfile; + *///?} public class PlayerExtension { @@ -19,38 +19,15 @@ private PlayerExtension() { } public static boolean hasPermission(ServerPlayer player, String permission) { - return hasPermission(player, permission, 2); + return ServerMultiLoader.getInstance().hasPermission(player, permission); } - public static boolean hasPermission(ServerPlayer player, String permission, int defaultLevel) { - //? if <1.17.1 { - /*return player./^? if >=1.17.1 {^/hasPermissionLevel/^?} else {^//^hasPermissions^//^?}^/(defaultLevel); - *///?} else { - return Permissions.check(player, permission, defaultLevel); - //?} + public static CompletableFuture hasPermission( + /*? if >=1.21.9 {*/ NameAndId /*?} else {*/ /*GameProfile *//*?}*/ profile, + MinecraftServer server, + String permission + ) { + return ServerMultiLoader.getInstance().hasOfflinePermission(profile, server, permission); } - public static CompletableFuture hasPermission(GameProfile profile, String permission, CommandContext context) { - return hasPermission(profile, permission, 2, context); - } - - public static CompletableFuture hasPermission(GameProfile profile, String permission, int defaultLevel, CommandContext context) { - //? if <1.17.1 { - /*return CompletableFuture.completedFuture(context.getSource()./^? if >=1.17.1 {^/getMinecraftServer().getPermissionLevel(profile)/^?} else {^/ /^getServer().getProfilePermissions(profile) ^//^?}^/ >= defaultLevel); - *///?} else { - MinecraftServer server = context.getSource().getServer(); - return Permissions.check(profile, permission, defaultLevel, server); - //?} - } - - /*? if >=1.21.9 {*/ - public static CompletableFuture hasPermission(NameAndId nameAndId, String permission, CommandContext context) { - return hasPermission(nameAndId, permission, 2, context); - } - - public static CompletableFuture hasPermission(NameAndId nameAndId, String permission, int defaultLevel, CommandContext context) { - MinecraftServer server = context.getSource().getServer(); - return Permissions.check(nameAndId, permission, defaultLevel, server); - } - /*?}*/ } diff --git a/src/main/java/net/lopymine/patpat/extension/PoseExtension.java b/src/main/java/net/lopymine/patpat/extension/PoseExtension.java index 5569bdfb..429fdff3 100644 --- a/src/main/java/net/lopymine/patpat/extension/PoseExtension.java +++ b/src/main/java/net/lopymine/patpat/extension/PoseExtension.java @@ -12,9 +12,9 @@ public static Pose copy(Pose entry) { /*PoseStack poseStack = new PoseStack(); Pose copy = poseStack.last(); //? if >=1.19.3 { - /^copy.pose().set(entry.pose()); + copy.pose().set(entry.pose()); copy.normal().set(entry.normal()); - ^///?} elif >=1.17 { + //?} elif >=1.17 { /^copy.pose().load(entry.pose()); copy.normal().load(entry.normal()); ^///?} diff --git a/src/main/java/net/lopymine/patpat/PatLogger.java b/src/main/java/net/lopymine/patpat/logger/PatLogger.java similarity index 97% rename from src/main/java/net/lopymine/patpat/PatLogger.java rename to src/main/java/net/lopymine/patpat/logger/PatLogger.java index 19680fed..8d937180 100644 --- a/src/main/java/net/lopymine/patpat/PatLogger.java +++ b/src/main/java/net/lopymine/patpat/logger/PatLogger.java @@ -1,4 +1,4 @@ -package net.lopymine.patpat; +package net.lopymine.patpat.logger; import org.jetbrains.annotations.Nullable; import lombok.*; diff --git a/src/main/java/net/lopymine/patpat/mixin/AbstractClientPlayerEntityMixin.java b/src/main/java/net/lopymine/patpat/mixin/AbstractClientPlayerEntityMixin.java index 12c3606f..5c26f781 100644 --- a/src/main/java/net/lopymine/patpat/mixin/AbstractClientPlayerEntityMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/AbstractClientPlayerEntityMixin.java @@ -2,7 +2,7 @@ import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; @@ -20,20 +20,20 @@ *///?} import net.lopymine.patpat.client.PatPatClient; -import net.lopymine.patpat.utils.IdentifierUtils; +import net.lopymine.patpat.utils.RLUtils; @Mixin(AbstractClientPlayer.class) public abstract class AbstractClientPlayerEntityMixin { @Unique - private static final ResourceLocation PATPAT_CAPE_ID = IdentifierUtils.modId("textures/cape/patpat_cape_hand.png"); + private static final Identifier PATPAT_CAPE_ID = RLUtils.modId("textures/cape/patpat_cape_hand.png"); //? if >=1.21.9 { @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/PlayerInfo;getSkin()Lnet/minecraft/world/entity/player/PlayerSkin;"), method = "getSkin") private PlayerSkin customCape(PlayerInfo instance, Operation original) { PlayerSkin call = original.call(instance); ClientAsset.Texture capeTexture = call.cape(); - if (capeTexture != null || !PatPatClient.AUTHORS.contains(instance.getProfile().id())) { + if (!PatPatClient.SECOND_AUTHOR_UUID.equals(instance.getProfile().id()) && (capeTexture != null || !PatPatClient.AUTHORS.contains(instance.getProfile().id()))) { return call; } return new PlayerSkin(call.body(), new ResourceTexture(PATPAT_CAPE_ID, PATPAT_CAPE_ID), call.elytra(), call.model(), call.secure()); @@ -42,8 +42,9 @@ private PlayerSkin customCape(PlayerInfo instance, Operation origina /*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/PlayerInfo;getSkin()Lnet/minecraft/client/resources/PlayerSkin;"), method = "getSkin") private PlayerSkin customCape(PlayerInfo instance, Operation original) { PlayerSkin call = original.call(instance); - ResourceLocation capeTexture = call.capeTexture(); - if (capeTexture != null || !PatPatClient.AUTHORS.contains(instance.getProfile().getId())) { + Identifier capeTexture = call.capeTexture(); + + if (!PatPatClient.SECOND_AUTHOR_UUID.equals(instance.getProfile().getId()) && (capeTexture != null || !PatPatClient.AUTHORS.contains(instance.getProfile().getId()))) { return call; } return new PlayerSkin(call.texture(), call.textureUrl(), PATPAT_CAPE_ID, call.elytraTexture(), call.model(), call.secure()); @@ -54,15 +55,21 @@ private PlayerSkin customCape(PlayerInfo instance, Operation origina /*@Shadow @Nullable protected abstract PlayerInfo getPlayerInfo(); @Inject(method = "getCloakTextureLocation", at = @At("RETURN"), cancellable = true) - private void customCape(CallbackInfoReturnable cir) { - ResourceLocation original = cir.getReturnValue(); - if (original != null) { - return; - } + private void customCape(CallbackInfoReturnable cir) { PlayerInfo playerListEntry = this.getPlayerInfo(); if (playerListEntry == null) { return; } + + if (PatPatClient.SECOND_AUTHOR_UUID.equals(playerListEntry.getProfile().getId())) { + cir.setReturnValue(PATPAT_CAPE_ID); + } + + Identifier original = cir.getReturnValue(); + if (original != null) { + return; + } + if (PatPatClient.AUTHORS.contains(playerListEntry.getProfile().getId())) { cir.setReturnValue(PATPAT_CAPE_ID); } diff --git a/src/main/java/net/lopymine/patpat/mixin/CameraMixin.java b/src/main/java/net/lopymine/patpat/mixin/CameraMixin.java index 7e6706b2..0655942d 100644 --- a/src/main/java/net/lopymine/patpat/mixin/CameraMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/CameraMixin.java @@ -1,7 +1,7 @@ package net.lopymine.patpat.mixin; import com.llamalad7.mixinextras.injector.wrapoperation.*; -import net.minecraft.client.Camera; +import net.minecraft.client.*; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.BlockGetter; @@ -13,12 +13,12 @@ import net.lopymine.patpat.client.manager.PatPatClientManager; @Mixin(Camera.class) -public class CameraMixin { +public abstract class CameraMixin { - /*? >1.20.2 {*/ - @Shadow + /*? >1.20.2 && <=1.21.11 {*/ + /*@Shadow private float partialTickTime; - //?} else { + *///?} elif <=1.21.11 { /*@Unique private float partialTickTime = 0; @@ -26,7 +26,9 @@ public class CameraMixin { private void onUpdate(BlockGetter area, Entity focusedEntity, boolean thirdPerson, boolean inverseView, float tickDelta, org.spongepowered.asm.mixin.injection.callback.CallbackInfo ci) { this.partialTickTime = tickDelta; } - *///?} + *///?} else { + @Shadow public abstract float getCameraEntityPartialTicks(DeltaTracker deltaTracker); + //?} @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;getEyeHeight()F"), method = "tick") private float applyPattingEffect(Entity entity, Operation original) { @@ -45,12 +47,16 @@ private float applyPattingEffect(Entity entity, Operation original) { return originalHeight; } - if (PatPatClientManager.expired(patEntity, this.partialTickTime)) { + //? if >=26.1 { + float partialTickTime = this.getCameraEntityPartialTicks(Minecraft.getInstance().getDeltaTracker()); + //?} + + if (PatPatClientManager.expired(patEntity, partialTickTime)) { PatPatClientManager.removePatEntity(patEntity); return originalHeight; } - return originalHeight * PatPatClientManager.getAnimationProgress(patEntity, this.partialTickTime); + return originalHeight * PatPatClientManager.getAnimationProgress(patEntity, partialTickTime); } } diff --git a/src/main/java/net/lopymine/patpat/mixin/EnderDragonRendererMixin.java b/src/main/java/net/lopymine/patpat/mixin/EnderDragonRendererMixin.java index ec742cfb..2d201638 100644 --- a/src/main/java/net/lopymine/patpat/mixin/EnderDragonRendererMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/EnderDragonRendererMixin.java @@ -17,18 +17,32 @@ import net.minecraft.world.entity.LivingEntity; //?} +//? if >=26.1 { + +import net.minecraft.client.renderer.entity.state.EnderDragonRenderState; + +//?} + @Mixin(EnderDragonRenderer.class) public class EnderDragonRendererMixin { - //? if >=1.21.9 { - @Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V"), method = "submit(Lnet/minecraft/client/renderer/entity/state/EnderDragonRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V") + //? if >=26.1 { + @Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V"), method = "submit(Lnet/minecraft/client/renderer/entity/state/EnderDragonRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V") + private void makeDragonPattableBecauseWhyNot(EnderDragonRenderState enderDragonRenderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, net.minecraft.client.renderer.state.level.CameraRenderState cameraRenderState, CallbackInfo ci) { + Entity entity = ((EntityRenderStateWithParent) enderDragonRenderState).patPat$getEntity(); + float tickDelta = ((EntityRenderStateWithParent) enderDragonRenderState).patPat$getTickDelta(); + if (!(entity instanceof LivingEntity livingEntity)) { + return; + } + //?} elif >=1.21.9 { + /*@Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V"), method = "submit(Lnet/minecraft/client/renderer/entity/state/EnderDragonRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V") private void makeDragonPattableBecauseWhyNot(net.minecraft.client.renderer.entity.state.EnderDragonRenderState enderDragonRenderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, net.minecraft.client.renderer.state.CameraRenderState cameraRenderState, CallbackInfo ci) { Entity entity = ((EntityRenderStateWithParent) enderDragonRenderState).patPat$getEntity(); float tickDelta = ((EntityRenderStateWithParent) enderDragonRenderState).patPat$getTickDelta(); if (!(entity instanceof LivingEntity livingEntity)) { return; } - //?} elif >=1.21.2 { + *///?} elif >=1.21.2 { /*@Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V"), method = "render(Lnet/minecraft/client/renderer/entity/state/EnderDragonRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V") private void makeDragonPattableBecauseWhyNot(net.minecraft.client.renderer.entity.state.EnderDragonRenderState enderDragonRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci) { Entity entity = ((EntityRenderStateWithParent) enderDragonRenderState).patPat$getEntity(); diff --git a/src/main/java/net/lopymine/patpat/mixin/EntityMixin.java b/src/main/java/net/lopymine/patpat/mixin/EntityMixin.java index ba64610c..0f5e2390 100644 --- a/src/main/java/net/lopymine/patpat/mixin/EntityMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/EntityMixin.java @@ -9,15 +9,15 @@ public class EntityMixin implements MarkedEntity { @Unique - private boolean marked; + private boolean patPat$marked; @Override public void patPat$mark(boolean marked) { - this.marked = marked; + this.patPat$marked = marked; } @Override public boolean patPat$isMarked() { - return this.marked; + return this.patPat$marked; } } diff --git a/src/main/java/net/lopymine/patpat/mixin/EntityRenderStateMixin.java b/src/main/java/net/lopymine/patpat/mixin/EntityRenderStateMixin.java index fea5effd..80e2c1c6 100644 --- a/src/main/java/net/lopymine/patpat/mixin/EntityRenderStateMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/EntityRenderStateMixin.java @@ -11,29 +11,29 @@ public class EntityRenderStateMixin implements EntityRenderStateWithParent { @Unique - private Entity entity; + private Entity patPat$entity; @Unique - private float tickDelta; + private float patPat$tickDelta; @Override public void patPat$setEntity(Entity entity) { - this.entity = entity; + this.patPat$entity = entity; } @Override public Entity patPat$getEntity() { - return this.entity; + return this.patPat$entity; } @Override public void patPat$setTickDelta(float tickDelta) { - this.tickDelta = tickDelta; + this.patPat$tickDelta = tickDelta; } @Override public float patPat$getTickDelta() { - return this.tickDelta; + return this.patPat$tickDelta; } } //?} \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/mixin/EntityRendererMixin.java b/src/main/java/net/lopymine/patpat/mixin/EntityRendererMixin.java index f79b5080..52ca1023 100644 --- a/src/main/java/net/lopymine/patpat/mixin/EntityRendererMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/EntityRendererMixin.java @@ -27,6 +27,12 @@ import net.minecraft.client.renderer.entity.state.*; //?} +//? if >=26.1 { +import net.minecraft.client.renderer.state.level.CameraRenderState; +//?} elif >=1.21.9 { +/*import net.minecraft.client.renderer.state.CameraRenderState; + *///?} + @Mixin(EntityRenderer.class) public class EntityRendererMixin { @@ -34,39 +40,63 @@ public class EntityRendererMixin { @Final protected EntityRenderDispatcher entityRenderDispatcher; - /*? if <1.21.2 {*/ - /*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;shouldShowName(Lnet/minecraft/world/entity/Entity;)Z"), method = "render") - private boolean render(EntityRenderer instance, Entity entity, Operation original, @Local(argsOnly = true) PoseStack matrices, @Local(argsOnly = true) MultiBufferSource provider, @Local(argsOnly = true) int light, @Local(argsOnly = true, ordinal = 1) float tickDelta) { - boolean bl = original.call(instance, entity); - *//*?} elif <1.21.9 {*/ - /*@WrapOperation(at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/EntityRenderState;nameTag:Lnet/minecraft/network/chat/Component;"), method = "render") - private Component render(EntityRenderState state, Operation original, @Local(argsOnly = true) PoseStack matrices, @Local(argsOnly = true) MultiBufferSource provider, @Local(argsOnly = true) int light) { - *///?} else { - @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;submitNameTag(Lnet/minecraft/client/renderer/entity/state/EntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V"), method = "submit") - private void render(EntityRenderer instance, EntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, net.minecraft.client.renderer.state.CameraRenderState cameraRenderState, Operation original, @Local(argsOnly = true) PoseStack matrices) { - /*?}*/ - //? if >=1.21.2 { +// /*? if <1.21.2 {*/ +// /*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;shouldShowName(Lnet/minecraft/world/entity/Entity;)Z"), method = "render") +// private boolean render(EntityRenderer instance, Entity entity, Operation original, @Local(argsOnly = true) PoseStack matrices, @Local(argsOnly = true) MultiBufferSource provider, @Local(argsOnly = true) int light, @Local(argsOnly = true, ordinal = 1) float tickDelta) { +// boolean bl = original.call(instance, entity); +// *//*?} elif <1.21.9 {*/ +// /*@WrapOperation(at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/EntityRenderState;nameTag:Lnet/minecraft/network/chat/Component;"), method = "render") +// private Component render(EntityRenderState state, Operation original, @Local(argsOnly = true) PoseStack matrices, @Local(argsOnly = true) MultiBufferSource provider, @Local(argsOnly = true) int light) { +// *///?} elif <26.1 { +// @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;submitNameTag(Lnet/minecraft/client/renderer/entity/state/EntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V"), method = "submit") +// private void render(EntityRenderer instance, EntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, net.minecraft.client.renderer.state.CameraRenderState cameraRenderState, Operation original, @Local(argsOnly = true) PoseStack matrices) { +// /*?}*/ +// } + + //? if >=26.1 { + @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;submitNameDisplay(Lnet/minecraft/client/renderer/entity/state/EntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V"), method = "submit") + private void render(EntityRenderer instance, EntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState cameraRenderState, Operation original, @Local(argsOnly = true) PoseStack matrices) { EntityRenderStateWithParent stateWithParent = (EntityRenderStateWithParent) state; Entity entity = stateWithParent.patPat$getEntity(); float tickDelta = stateWithParent.patPat$getTickDelta(); - //?} - //? if >=1.21.9 { - Boolean result = this.render(matrices, state.lightCoords, entity, tickDelta, true); + + Boolean result = this.render(matrices, state.lightCoords, entity, tickDelta, true, null); if (result != null) { original.call(instance, state, poseStack, submitNodeCollector, cameraRenderState); } - //?} elif >=1.21.2 { - /*return this.render(matrices, light, entity, tickDelta, original.call(state)); - *///?} else { - /*Boolean result = this.render(matrices, light, entity, tickDelta, bl); + } + //?} elif >=1.21.9 { + /*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;submitNameTag(Lnet/minecraft/client/renderer/entity/state/EntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V"), method = "submit") + private void render(EntityRenderer instance, EntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState cameraRenderState, Operation original, @Local(argsOnly = true) PoseStack matrices) { + EntityRenderStateWithParent stateWithParent = (EntityRenderStateWithParent) state; + Entity entity = stateWithParent.patPat$getEntity(); + float tickDelta = stateWithParent.patPat$getTickDelta(); + + Boolean result = this.render(matrices, state.lightCoords, entity, tickDelta, true, null); + if (result != null) { + original.call(instance, state, poseStack, submitNodeCollector, cameraRenderState); + } + } + *///?} elif >=1.21.2 { + /*@WrapOperation(at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/EntityRenderState;nameTag:Lnet/minecraft/network/chat/Component;"), method = "render") + private Component render(EntityRenderState state, Operation original, @Local(argsOnly = true) PoseStack matrices, @Local(argsOnly = true) MultiBufferSource provider, @Local(argsOnly = true) int light) { + EntityRenderStateWithParent stateWithParent = (EntityRenderStateWithParent) state; + Entity entity = stateWithParent.patPat$getEntity(); + float tickDelta = stateWithParent.patPat$getTickDelta(); + return this.render(matrices, light, entity, tickDelta, original.call(state), provider); + } + *///?} else { + /*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;shouldShowName(Lnet/minecraft/world/entity/Entity;)Z"), method = "render") + private boolean render(EntityRenderer instance, Entity entity, Operation original, @Local(argsOnly = true) PoseStack matrices, @Local(argsOnly = true) MultiBufferSource provider, @Local(argsOnly = true) int light, @Local(argsOnly = true, ordinal = 1) float tickDelta) { + Boolean result = this.render(matrices, light, entity, tickDelta, original.call(instance, entity), provider); return result != null && result; - *///?} } + *///?} // original => render, null => cancel @Unique @Nullable - private T render(PoseStack matrices, int light, Entity entity, float tickDelta, @SuppressWarnings("all") T original) { + private T render(PoseStack matrices, int light, Entity entity, float tickDelta, @SuppressWarnings("all") T original, @Nullable MultiBufferSource provider) { if (!(entity instanceof LivingEntity)) { return original; } @@ -83,7 +113,8 @@ private T render(PoseStack matrices, int light, Entity entity, float tickDel entity, null, tickDelta, - light + light, + provider ); if (result == RenderResult.RENDERER_SHOULD_CANCEL) { diff --git a/src/main/java/net/lopymine/patpat/mixin/FeatureRenderDispatcherMixin.java b/src/main/java/net/lopymine/patpat/mixin/FeatureRenderDispatcherMixin.java index 16a23954..1da9ed0e 100644 --- a/src/main/java/net/lopymine/patpat/mixin/FeatureRenderDispatcherMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/FeatureRenderDispatcherMixin.java @@ -3,19 +3,28 @@ //? if >=1.21.9 { import net.lopymine.patpat.client.render.feature.PatFeatureRenderer; +import net.minecraft.client.renderer.MultiBufferSource.BufferSource; import net.minecraft.client.renderer.feature.FeatureRenderDispatcher; -import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(FeatureRenderDispatcher.class) public class FeatureRenderDispatcherMixin { - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/NameTagFeatureRenderer;render(Lnet/minecraft/client/renderer/SubmitNodeCollection;Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;Lnet/minecraft/client/gui/Font;)V"), method = "renderAllFeatures") + @Shadow @Final private BufferSource bufferSource; + + //? if >=26.1 { + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/NameTagFeatureRenderer;renderTranslucent(Lnet/minecraft/client/renderer/SubmitNodeCollection;Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;Lnet/minecraft/client/gui/Font;)V"), method = "renderTranslucentFeatures") private void renderPatFeature(CallbackInfo ci) { - PatFeatureRenderer.getInstance().render(); + PatFeatureRenderer.getInstance().render(this.bufferSource); } + //?} else { + /*@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/NameTagFeatureRenderer;render(Lnet/minecraft/client/renderer/SubmitNodeCollection;Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;Lnet/minecraft/client/gui/Font;)V"), method = "renderAllFeatures") + private void renderPatFeature(CallbackInfo ci) { + PatFeatureRenderer.getInstance().render(this.bufferSource); + } + *///?} } //?} diff --git a/src/main/java/net/lopymine/patpat/mixin/GameRendererMixin.java b/src/main/java/net/lopymine/patpat/mixin/GameRendererMixin.java index 64b2f9fc..bf86eb86 100644 --- a/src/main/java/net/lopymine/patpat/mixin/GameRendererMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/GameRendererMixin.java @@ -1,6 +1,8 @@ package net.lopymine.patpat.mixin; -import com.llamalad7.mixinextras.injector.wrapoperation.*; +//? if <=1.21.10 { + +/*import com.llamalad7.mixinextras.injector.wrapoperation.*; import lombok.experimental.ExtensionMethod; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.world.entity.*; @@ -19,9 +21,9 @@ public class GameRendererMixin { //? if >=1.20.5 { @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ProjectileUtil;getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;"), method = "pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult;") - //?} else { - /*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ProjectileUtil;getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;"), method = "pick") - *///?} + //?} else { + /^@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ProjectileUtil;getEntityHitResult(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;D)Lnet/minecraft/world/phys/EntityHitResult;"), method = "pick") + ^///?} private @Nullable EntityHitResult makeAllMobsPattable(Entity entity, Vec3 vec3, Vec3 vec32, AABB aABB, Predicate predicate, double d, Operation original) { if (!entity.isMarked()) { return original.call(entity, vec3, vec32, aABB, predicate, d); @@ -29,3 +31,4 @@ public class GameRendererMixin { return original.call(entity, vec3, vec32, aABB, EntitySelector.NO_SPECTATORS, d); } } +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenAccessor.java b/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenAccessor.java new file mode 100644 index 00000000..a861479a --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenAccessor.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.mixin; + +//? if >=1.19.4 { + +import net.minecraft.client.gui.screens.options.controls.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyBindsScreen.class) +public interface KeyBindsScreenAccessor { + + @Accessor("keyBindsList") + KeyBindsList getList(); + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenMixin.java b/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenMixin.java index 88172c03..4d83d239 100644 --- a/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/KeyBindsScreenMixin.java @@ -1,19 +1,17 @@ package net.lopymine.patpat.mixin; +import net.lopymine.patpat.client.keybinding.*; import net.minecraft.client.KeyMapping; -import net.minecraft.client.gui.screens./*? if >=1.21 {*/options./*?}*/controls.*; +import net.minecraft.client.gui.screens.options.controls.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.mojang.blaze3d.platform.InputConstants; - -import net.lopymine.patpat.client.keybinding.PatPatKeybinding; import net.lopymine.patpat.utils.mixin.ScreenWithPatPatKeybinding; import org.jetbrains.annotations.Nullable; -@Mixin(/*? if >=1.18 {*/KeyBindsScreen/*?} else {*/ /*ControlsScreen *//*?}*/.class) +@Mixin(KeyBindsScreen.class) public class KeyBindsScreenMixin implements ScreenWithPatPatKeybinding { @Shadow @Nullable public KeyMapping selectedKey; @@ -24,37 +22,30 @@ public class KeyBindsScreenMixin implements ScreenWithPatPatKeybinding { //?} @Inject(at = @At("HEAD"), method = "keyPressed", cancellable = true) - private void handlePatPatKeybindingOnKeyPressed(/*? if >=1.21.9 {*/net.minecraft.client.input.KeyEvent event, /*?} else {*/ /*int keyCode, int scanCode, int modifiers, *//*?}*/ CallbackInfoReturnable cir) { - if (this.selectedKey instanceof PatPatKeybinding keybinding) { - boolean bl = keybinding.addBindingKey(InputConstants.getKey(/*? if >=1.21.9 {*/event/*?} else {*/ /*keyCode, scanCode *//*?}*/)); - if (bl) { - keybinding.sendBindingKeys(); - this.selectedKey = null; - } - //? if >=1.19.4 { - this.keyBindsList.refreshEntries(); - //?} - cir.setReturnValue(false); - } + private void handlePatPatKeybindingOnKeyPressed(net.minecraft.client.input.KeyEvent event, CallbackInfoReturnable cir) { + //? if >=1.21.9 { + int keyCode = event.key(); + int scanCode = event.scancode(); + //?} + PatPatClientKeybindingManager.handlePatPatKeybindingOnKeyPressed(this.selectedKey, (KeyBindsScreen) (Object) (this), keyCode, scanCode, () -> cir.setReturnValue(false)); + //? if >=26.1 { + this.keyBindsList.refreshEntries(); + //?} } @Inject(at = @At("HEAD"), method = "mouseClicked", cancellable = true) - private void handlePatPatKeybindingOnMouseClick(/*? if >=1.21.9 {*/net.minecraft.client.input.MouseButtonEvent event, boolean b, /*?} else {*/ /*double mouseX, double mouseY, int button, *//*?}*/ CallbackInfoReturnable cir) { - if (this.selectedKey instanceof PatPatKeybinding keybinding) { - boolean bl = keybinding.addBindingKey(InputConstants.Type.MOUSE.getOrCreate(/*? if >=1.21.9 {*/ event.button() /*?} else {*/ /*button *//*?}*/)); - if (bl) { - keybinding.sendBindingKeys(); - this.selectedKey = null; - } - //? if >=1.19.4 { - this.keyBindsList.refreshEntries(); - //?} - cir.setReturnValue(false); - } + private void handlePatPatKeybindingOnMouseClick(net.minecraft.client.input.MouseButtonEvent event, boolean bl, CallbackInfoReturnable cir) { + //? if >=1.21.9 { + int button = event.button(); + //?} + PatPatClientKeybindingManager.handlePatPatKeybindingOnMouseClick(this.selectedKey, (KeyBindsScreen) (Object) (this), button, () -> cir.setReturnValue(false)); + //? if >=26.1 { + this.keyBindsList.refreshEntries(); + //?} } @Override - public void patPat$onKeyReleased(int keyCode, int scanCode, int modifiers) { + public void patPat$onKeyReleased() { if (this.selectedKey instanceof PatPatKeybinding keybinding && keybinding.isBinding()) { keybinding.sendBindingKeys(); this.selectedKey = null; diff --git a/src/main/java/net/lopymine/patpat/mixin/ControlsListWidgetMixin.java b/src/main/java/net/lopymine/patpat/mixin/KeyEntryMixin.java similarity index 92% rename from src/main/java/net/lopymine/patpat/mixin/ControlsListWidgetMixin.java rename to src/main/java/net/lopymine/patpat/mixin/KeyEntryMixin.java index 7c39a5dc..9c874956 100644 --- a/src/main/java/net/lopymine/patpat/mixin/ControlsListWidgetMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/KeyEntryMixin.java @@ -8,14 +8,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //? if <1.19.3 { -/*import net.minecraft.client.gui.screens.controls.*; +/*import net.minecraft.client.gui.screens.options.controls.*; import net.minecraft.network.chat.Component; *///?} import net.lopymine.patpat.client.keybinding.PatPatKeybinding; @Mixin(KeyEntry.class) -public class ControlsListWidgetMixin { +public class KeyEntryMixin { @Shadow @Final @@ -36,7 +36,7 @@ private void init(/^? if >=1.18 {^/ KeyBindsList /^?} else {^/ /^ControlList ^// /^? if >=1.18 {^/ KeyBindsScreen screen = list.keyBindsScreen; /^?} else {^/ - /^ControlsScreen screen = list.controlsScreen; + /^KeyBindsScreen screen = list.controlsScreen; ^//^?}^/ ((net.lopymine.patpat.utils.mixin.IRequestableTooltipScreen) screen).myTotemDoll$requestTooltip((pose, x, y, d) -> { screen.renderTooltip(poseStack, patPatKeybinding.getFullTranslatedKeyMessage(), x, y); @@ -45,7 +45,6 @@ private void init(/^? if >=1.18 {^/ KeyBindsList /^?} else {^/ /^ControlList ^// } *///?} - @Inject(at = @At(/*? if >=1.19.4 {*/ "TAIL" /*?} else {*/ /*"HEAD" *//*?}*/), method = /*? if >=1.19.4 {*/ "refreshEntry" /*?} else {*/ /*"render" *//*?}*/) private void addPatPatTooltipToPatPatKey(CallbackInfo ci) { //? if >=1.19.4 { diff --git a/src/main/java/net/lopymine/patpat/mixin/KeyMappingAccessor.java b/src/main/java/net/lopymine/patpat/mixin/KeyMappingAccessor.java new file mode 100644 index 00000000..c897b22b --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/KeyMappingAccessor.java @@ -0,0 +1,14 @@ +package net.lopymine.patpat.mixin; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyMapping.class) +public interface KeyMappingAccessor { + + @Accessor("key") + InputConstants.Key getKeyMappingKey(); + +} diff --git a/src/main/java/net/lopymine/patpat/mixin/KeybindingMixin.java b/src/main/java/net/lopymine/patpat/mixin/KeybindingMixin.java index d7dce927..4d640d7c 100644 --- a/src/main/java/net/lopymine/patpat/mixin/KeybindingMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/KeybindingMixin.java @@ -1,17 +1,17 @@ package net.lopymine.patpat.mixin; +import net.lopymine.patpat.client.keybinding.*; import net.minecraft.client.KeyMapping; -import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.platform.InputConstants; -import net.lopymine.patpat.client.keybinding.PatPatClientKeybindingManager; import net.lopymine.patpat.client.manager.PatPatClientManager; -@Mixin(KeyMapping.class) +@Mixin(value = KeyMapping.class, priority = 255) public class KeybindingMixin { private KeybindingMixin() { @@ -20,14 +20,22 @@ private KeybindingMixin() { @Inject(at = @At("HEAD"), method = "click", cancellable = true) private static void cancelClickForPatPatKeybinding(InputConstants.Key key, CallbackInfo ci) { - if (PatPatClientKeybindingManager.getPatKeybinding().onKeyAction(key, true) && PatPatClientManager.canPat()) { + PatPatKeybinding patKeybinding = PatPatClientKeybindingManager.getPatKeybinding(); + if (patKeybinding == null) { + return; + } + if (patKeybinding.onKeyAction(key, true) && PatPatClientManager.canPat()) { ci.cancel(); } } @Inject(at = @At("HEAD"), method = "set", cancellable = true) private static void processSetForPatPatKeybinding(InputConstants.Key key, boolean pressed, CallbackInfo ci) { - if (PatPatClientKeybindingManager.getPatKeybinding().onKeyAction(key, pressed) && PatPatClientManager.canPat()) { + PatPatKeybinding patKeybinding = PatPatClientKeybindingManager.getPatKeybinding(); + if (patKeybinding == null) { + return; + } + if (patKeybinding.onKeyAction(key, pressed) && PatPatClientManager.canPat()) { ci.cancel(); } } diff --git a/src/main/java/net/lopymine/patpat/mixin/KeyboardHandlerMixin.java b/src/main/java/net/lopymine/patpat/mixin/KeyboardHandlerMixin.java new file mode 100644 index 00000000..ad28207a --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/KeyboardHandlerMixin.java @@ -0,0 +1,34 @@ +package net.lopymine.patpat.mixin; + +import net.minecraft.client.KeyboardHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.lopymine.patpat.utils.mixin.ScreenWithPatPatKeybinding; + +@Mixin(KeyboardHandler.class) +public class KeyboardHandlerMixin { + + @Inject(at = @At("HEAD"), method = "keyPress") + private void handleScreenWithPatPatKeybindings( + //? if >=1.21.9 { + long window, int action, net.minecraft.client.input.KeyEvent event, CallbackInfo ci + //?} else { + /*long window, int key, int scancode, int action, int modifiers, CallbackInfo ci + *///?} + ) { + if (action != GLFW.GLFW_RELEASE) { + return; + } + Screen screen = Minecraft.getInstance().screen; + if (screen instanceof ScreenWithPatPatKeybinding keybindingScreen) { + keybindingScreen.patPat$onKeyReleased(); + } + } + +} diff --git a/src/main/java/net/lopymine/patpat/mixin/LevelRendererMixin.java b/src/main/java/net/lopymine/patpat/mixin/LevelRendererMixin.java index 4b9599de..f63fbc52 100644 --- a/src/main/java/net/lopymine/patpat/mixin/LevelRendererMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/LevelRendererMixin.java @@ -2,20 +2,66 @@ //? if >=1.21.9 { +import com.llamalad7.mixinextras.injector.wrapoperation.*; import net.lopymine.patpat.client.render.PatPatClientRenderer; +import net.lopymine.patpat.client.render.feature.PatFeatureRenderer; import net.minecraft.client.renderer.LevelRenderer; -import org.spongepowered.asm.mixin.Mixin; +import net.minecraft.client.renderer.feature.FeatureRenderDispatcher; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(LevelRenderer.class) +@Mixin(value = LevelRenderer.class, priority = 1039) public class LevelRendererMixin { - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeCollector;)V", shift = Shift.AFTER), method = "method_62214") + //? if >=26.1 { + + @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher;renderTranslucentFeatures()V"), method = "lambda$addMainPass$0") + private void markLevelRendering(FeatureRenderDispatcher instance, Operation original) { + PatFeatureRenderer.getInstance().setRenderingLevel(true); + original.call(instance); + PatFeatureRenderer.getInstance().setRenderingLevel(false); + } + + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeCollector;)V", shift = Shift.AFTER), method = "lambda$addMainPass$0") + private void renderPatOnYourself(CallbackInfo ci) { + PatPatClientRenderer.renderPatOnYourself(); + } + //?} else { + /*@WrapOperation( + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher;renderAllFeatures()V" + ), + //? if fabric { + method = "method_62214" + //?} else { + /^method = "lambda$addMainPass$1" + ^///?} + ) + private void markLevelRendering(FeatureRenderDispatcher instance, Operation original) { + PatFeatureRenderer.getInstance().setRenderingLevel(true); + original.call(instance); + PatFeatureRenderer.getInstance().setRenderingLevel(false); + } + + @Inject( + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;submitEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeCollector;)V", + shift = Shift.AFTER + ), + //? if fabric { + method = "method_62214" + //?} else { + /^method = "lambda$addMainPass$1" + ^///?} + ) private void renderPatOnYourself(CallbackInfo ci) { PatPatClientRenderer.renderPatOnYourself(); } + *///?} } //?} diff --git a/src/main/java/net/lopymine/patpat/mixin/LivingEntityRendererMixin.java b/src/main/java/net/lopymine/patpat/mixin/LivingEntityRendererMixin.java index f94afc7d..8ac8d7b9 100644 --- a/src/main/java/net/lopymine/patpat/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/LivingEntityRendererMixin.java @@ -15,28 +15,49 @@ import net.minecraft.world.entity.Entity; //?} +//? if >=26.1 { +import net.minecraft.client.renderer.state.level.CameraRenderState; +//?} elif >=1.21.9 { +/*import net.minecraft.client.renderer.state.CameraRenderState; +*///?} + @Mixin(LivingEntityRenderer.class) public class LivingEntityRendererMixin { - //? if >=1.21.9 { - @Inject(method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/LivingEntityRenderer;scale(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;)V")) + //? if >=26.1 { + @Inject(method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V")) + private void render(LivingEntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + Entity entity = ((EntityRenderStateWithParent) state).patPat$getEntity(); + float tickDelta = ((EntityRenderStateWithParent) state).patPat$getTickDelta(); + if (!(entity instanceof LivingEntity livingEntity)) { + return; + } + PatPatClientRenderer.scaleEntityIfPatted(livingEntity, poseStack, tickDelta); + } + //?} elif >=1.21.9 { + /*@Inject(method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/LivingEntityRenderer;scale(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;)V")) private void render(LivingEntityRenderState livingEntityRenderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, net.minecraft.client.renderer.state.CameraRenderState cameraRenderState, CallbackInfo ci) { Entity entity = ((EntityRenderStateWithParent) livingEntityRenderState).patPat$getEntity(); float tickDelta = ((EntityRenderStateWithParent) livingEntityRenderState).patPat$getTickDelta(); if (!(entity instanceof LivingEntity livingEntity)) { return; } - //?} elif >=1.21.2 { + PatPatClientRenderer.scaleEntityIfPatted(livingEntity, poseStack, tickDelta); + } + *///?} elif >=1.21.2 { /*@Inject(method = "render(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/LivingEntityRenderer;scale(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;)V")) private void render(LivingEntityRenderState livingEntityRenderState, PoseStack poseStack, MultiBufferSource vertexConsumerProvider, int i, CallbackInfo ci) { Entity entity = ((EntityRenderStateWithParent) livingEntityRenderState).patPat$getEntity(); float tickDelta = ((EntityRenderStateWithParent) livingEntityRenderState).patPat$getTickDelta(); if (!(entity instanceof LivingEntity livingEntity)) { return; - }*///?} else { + } + PatPatClientRenderer.scaleEntityIfPatted(livingEntity, poseStack, tickDelta); + } + *///?} else { /*@Inject(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V")) private void render(LivingEntity livingEntity, float f, float tickDelta, PoseStack poseStack, MultiBufferSource vertexConsumerProvider, int i, CallbackInfo ci) { - *///?} PatPatClientRenderer.scaleEntityIfPatted(livingEntity, poseStack, tickDelta); } + *///?} } diff --git a/src/main/java/net/lopymine/patpat/mixin/LocalPlayerMixin.java b/src/main/java/net/lopymine/patpat/mixin/LocalPlayerMixin.java new file mode 100644 index 00000000..41db3904 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/LocalPlayerMixin.java @@ -0,0 +1,35 @@ +package net.lopymine.patpat.mixin; + +//? if >=1.21.11 { + +import com.llamalad7.mixinextras.injector.wrapoperation.*; +import java.util.function.Predicate; +import lombok.experimental.ExtensionMethod; +import net.lopymine.patpat.extension.EntityExtension; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.*; +import net.minecraft.world.item.component.AttackRange; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@ExtensionMethod(EntityExtension.class) +@Mixin(LocalPlayer.class) +public class LocalPlayerMixin { + + @WrapOperation( + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/item/component/AttackRange;getClosesetHit(Lnet/minecraft/world/entity/Entity;FLjava/util/function/Predicate;)Lnet/minecraft/world/phys/HitResult;" + ), + method = "raycastHitResult" + ) + private HitResult makeAllMobsPattable(AttackRange instance, Entity entity, float f, Predicate predicate, Operation original) { + if (!entity.isMarked()) { + return original.call(instance, entity, f, predicate); + } + return original.call(instance, entity, f, EntitySelector.NO_SPECTATORS); + } + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/mixin/MinecraftClientMixin.java b/src/main/java/net/lopymine/patpat/mixin/MinecraftClientMixin.java index 2740d242..2c658da4 100644 --- a/src/main/java/net/lopymine/patpat/mixin/MinecraftClientMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/MinecraftClientMixin.java @@ -1,13 +1,15 @@ package net.lopymine.patpat.mixin; +import net.lopymine.patpat.client.keybinding.*; +import net.lopymine.patpat.tests.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.lopymine.patpat.client.keybinding.PatPatClientKeybindingManager; import net.lopymine.patpat.client.manager.PatPatClientManager; @Mixin(Minecraft.class) @@ -19,16 +21,29 @@ private void tickPatCooldown(CallbackInfo ci) { if (--tick >= 0) { PatPatClientManager.setPatCooldown(tick); } + PatPatTestClientAgent.onClientTick(); } - @Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;rightClickDelay:I", ordinal = 0), method = "tick") + @Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;rightClickDelay:I", ordinal = 0, opcode = Opcodes.GETFIELD), method = "tick") private void continuePatsWhenPressed(CallbackInfo ci) { PatPatClientManager.requestPat(); } @Inject(at = @At("HEAD"), method = "setScreen") private void clearPatPatKeybinding(Screen screen, CallbackInfo ci) { - PatPatClientKeybindingManager.getPatKeybinding().refreshPressedState(); + PatPatKeybinding patKeybinding = PatPatClientKeybindingManager.getPatKeybinding(); + if (patKeybinding == null) { + return; + } + patKeybinding.refreshPressedState(); + } + + @Inject(at = @At("HEAD"), method = "close") + private void testLogOnClosing(CallbackInfo ci) { + if (!PatPatTestMode.isEnabled()) { + return; + } + PatPatTestAgent.LOGGER.info("Closing the game...", new Exception()); } } diff --git a/src/main/java/net/lopymine/patpat/mixin/ModMenuMixin.java b/src/main/java/net/lopymine/patpat/mixin/ModMenuMixin.java index e904199f..00cb57ca 100644 --- a/src/main/java/net/lopymine/patpat/mixin/ModMenuMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/ModMenuMixin.java @@ -1,5 +1,7 @@ package net.lopymine.patpat.mixin; +//? if fabric { + import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.terraformersmc.modmenu.util.mod.fabric.FabricMod; import org.spongepowered.asm.mixin.*; @@ -9,7 +11,7 @@ import net.fabricmc.loader.api.ModContainer; import net.lopymine.patpat.PatPat; -import net.lopymine.patpat.modmenu.ModMenuTranslators; +import net.lopymine.patpat.modmenu.translation.ModMenuTranslators; import org.jetbrains.annotations.NotNull; @@ -18,7 +20,7 @@ import java.util.Map; /*?} else {*/ /*import java.util.List; -*//*?}*/ + *//*?}*/ @Mixin(value = FabricMod.class, remap = false) public class ModMenuMixin { @@ -39,7 +41,7 @@ private Map> getContributorsInject(@NotNull Map getContributorsInject(@NotNull List original) { if (MOD_CONTAINER.equals(container)) { @@ -49,4 +51,5 @@ private List getContributorsInject(@NotNull List original) { return original; } } +//?} diff --git a/src/main/java/net/lopymine/patpat/mixin/MultiPlayerGameModeMixin.java b/src/main/java/net/lopymine/patpat/mixin/MultiPlayerGameModeMixin.java index dbd15b09..2f153d50 100644 --- a/src/main/java/net/lopymine/patpat/mixin/MultiPlayerGameModeMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/MultiPlayerGameModeMixin.java @@ -6,7 +6,7 @@ import net.lopymine.patpat.client.config.resourcepack.PlayerConfig; import net.lopymine.patpat.client.config.sub.PatPatClientFunConfig.PvpMode; import net.lopymine.patpat.client.render.PatPatClientRenderer; -import net.lopymine.patpat.client.render.PatPatClientRenderer.PatPacket; +import net.lopymine.patpat.client.render.PatPatClientRenderer.PacketPat; import net.lopymine.patpat.extension.GameProfileExtension; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.MultiPlayerGameMode; @@ -48,7 +48,7 @@ private void patOnAttack(Player player, Entity entity, CallbackInfo ci) { GameProfile profile = /*? if >=1.20.2 {*/ Minecraft.getInstance().getGameProfile(); /*?} else {*/ /*Minecraft.getInstance().getUser().getGameProfile(); *//*?}*/ PlayerConfig whoPatted = PlayerConfig.of(profile.getName(), profile.getUUID()); - PatPatClientRenderer.registerClientPacket(new PatPacket(pattedEntity, whoPatted, localPlayer, false)); + PatPatClientRenderer.registerClientPacket(new PacketPat(pattedEntity, whoPatted, localPlayer, false)); } } diff --git a/src/main/java/net/lopymine/patpat/mixin/ParentElementMixin.java b/src/main/java/net/lopymine/patpat/mixin/ParentElementMixin.java deleted file mode 100644 index faf8815d..00000000 --- a/src/main/java/net/lopymine/patpat/mixin/ParentElementMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lopymine.patpat.mixin; - -import net.minecraft.client.gui.components.events.ContainerEventHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lopymine.patpat.utils.mixin.ScreenWithPatPatKeybinding; -/*? if >=1.21.9 {*/ -import net.minecraft.client.input.KeyEvent; -/*?}*/ -@Mixin(ContainerEventHandler.class) -public interface ParentElementMixin { - - @Inject(at = @At("HEAD"), method = "keyReleased") - private void handleScreenWithPatPatKeybindings(/*? if <1.21.9 {*//*int keyCode, int scanCode, int modifiers*//*?} else {*/KeyEvent keyEvent/*?}*/, CallbackInfoReturnable cir) { - if (this instanceof ScreenWithPatPatKeybinding screen) { - screen.patPat$onKeyReleased(/*? if <1.21.9 {*//*keyCode, scanCode, modifiers*//*?} else {*/keyEvent.key(), keyEvent.scancode(), keyEvent.modifiers()/*?}*/); - } - } - -} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingKeyBindingListWidgetNewAccessor.java b/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingKeyBindingListWidgetNewAccessor.java new file mode 100644 index 00000000..c6469e0c --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingKeyBindingListWidgetNewAccessor.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if =1.16.5 && controlling { + +/*import com.blamejared.controlling.client.gui.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyBindingListWidgetNew.class) +public interface ControllingKeyBindingListWidgetNewAccessor { + + @Accessor("gui") + ControllingOptionsScreen getScreenPleaseThanks(); + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingKeyEntryMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingKeyEntryMixin.java new file mode 100644 index 00000000..bc92d0d7 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingKeyEntryMixin.java @@ -0,0 +1,38 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if =1.16.5 && controlling { + +/*import com.blamejared.controlling.client.gui.KeyBindingListWidgetNew; +import com.blamejared.controlling.client.gui.KeyBindingListWidgetNew.KeyEntry; +import net.lopymine.patpat.client.keybinding.PatPatKeybinding; +import net.lopymine.patpat.utils.mixin.IRequestableTooltipScreen; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.gui.components.*; +import net.minecraft.client.gui.screens.options.controls.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(KeyEntry.class) +public class ControllingKeyEntryMixin { + + @Shadow @Final public KeyMapping binding; + + @Shadow @Final public Button editButton; + + @Inject(at = @At("TAIL"), method = "(Lcom/blamejared/controlling/client/gui/KeyBindingListWidgetNew;Lnet/minecraft/client/KeyMapping;)V") + private void init(KeyBindingListWidgetNew list, KeyMapping name, CallbackInfo ci) { + if (!(this.binding instanceof PatPatKeybinding patPatKeybinding)) { + return; + } + + this.editButton.onTooltip = (button, poseStack, a, b) -> { + KeyBindsScreen screen = ((ControllingKeyBindingListWidgetNewAccessor) list).getScreenPleaseThanks(); + ((IRequestableTooltipScreen) screen).myTotemDoll$requestTooltip((pose, x, y, d) -> { + screen.renderTooltip(poseStack, patPatKeybinding.getFullTranslatedKeyMessage(), x, y); + }); + }; + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingOptionsScreenMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingOptionsScreenMixin.java new file mode 100644 index 00000000..c08a5f60 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/ControllingOptionsScreenMixin.java @@ -0,0 +1,27 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if <=1.17 && controlling { + +/*import com.blamejared.controlling.client.gui.ControllingOptionsScreen; +import com.mojang.blaze3d.vertex.PoseStack; +import net.lopymine.patpat.utils.mixin.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ControllingOptionsScreen.class) +public class ControllingOptionsScreenMixin { + + @Inject(at = @At("TAIL"), method = "render") + private void renderWithTooltip(PoseStack poseStack, int mouseX, int mouseY, float partialTick, CallbackInfo ci) { + if (this instanceof IRequestableTooltipScreen screen) { + TooltipRequest tooltipRequest = screen.myTotemDoll$getCurrentRequest(); + if (tooltipRequest != null) { + tooltipRequest.render(poseStack, mouseX, mouseY, partialTick); + screen.myTotemDoll$requestTooltip(null); + } + } + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/ControlsSettingsGuiNewMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/ControlsSettingsGuiNewMixin.java new file mode 100644 index 00000000..6faca7b1 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/ControlsSettingsGuiNewMixin.java @@ -0,0 +1,37 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if =1.16.5 && controlling { + +/*import com.blamejared.controlling.client.gui.ControllingOptionsScreen; +import net.lopymine.patpat.client.keybinding.PatPatClientKeybindingManager; +import net.minecraft.client.Options; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.controls.KeyBindsScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ControllingOptionsScreen.class) +public class ControlsSettingsGuiNewMixin extends KeyBindsScreen { + + public ControlsSettingsGuiNewMixin(Screen screen, Options options) { + super(screen, options); + } + + @Inject( + at = @At( + value = "FIELD", + target = "Lcom/blamejared/controlling/client/gui/ControllingOptionsScreen;selectedKey:Lnet/minecraft/client/KeyMapping;", + ordinal = 1, + shift = Shift.AFTER + ), + method = "keyPressed", + cancellable = true + ) + private void handlePatPatKeybindingOnKeyPressed(int keyCode, int scanCode, int mods, CallbackInfoReturnable cir) { + PatPatClientKeybindingManager.handlePatPatKeybindingOnKeyPressed(this.selectedKey, this, keyCode, scanCode, () -> cir.setReturnValue(false)); + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/KeyBindsScreenAccessor.java b/src/main/java/net/lopymine/patpat/mixin/controlling/KeyBindsScreenAccessor.java new file mode 100644 index 00000000..10f1aee2 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/KeyBindsScreenAccessor.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if >=1.19.4 && controlling { + +import net.minecraft.client.gui.screens.options.controls.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyBindsScreen.class) +public interface KeyBindsScreenAccessor { + + @Accessor("keyBindsList") + KeyBindsList getList(); + +} +//?} \ No newline at end of file diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsListAccessor.java b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsListAccessor.java new file mode 100644 index 00000000..7e2ef7b0 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsListAccessor.java @@ -0,0 +1,17 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if =1.17.1 && controlling { + +/*import com.blamejared.controlling.client.NewKeyBindsList; +import net.minecraft.client.gui.screens.controls.KeyBindsScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(NewKeyBindsList.class) +public interface NewKeyBindsListAccessor { + + @Accessor("controlsScreen") + KeyBindsScreen getScreenPleaseThanks(); + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsListMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsListMixin.java new file mode 100644 index 00000000..84ffca0f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsListMixin.java @@ -0,0 +1,28 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if >=1.17.1 && <1.19.3 && controlling { +/*import com.blamejared.controlling.client.NewKeyBindsList; +import com.blamejared.controlling.client.NewKeyBindsList.KeyEntry; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.vertex.PoseStack; +import net.lopymine.patpat.client.keybinding.*; +import net.lopymine.patpat.utils.mixin.IRequestableTooltipScreen; +import net.minecraft.client.gui.screens.controls.KeyBindsScreen; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(NewKeyBindsList.class) +public class NewKeyBindsListMixin { + + @WrapWithCondition(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen;renderTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/network/chat/Component;II)V"), method = "renderDecorations") + private boolean cancelUselessTooltip(KeyBindsScreen instance, PoseStack stack, Component component, int x, int y, @Local KeyEntry entry) { + if (instance instanceof IRequestableTooltipScreen screen) { + return screen.myTotemDoll$getCurrentRequest() == null; + } + return true; + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsScreenMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsScreenMixin.java new file mode 100644 index 00000000..f73ba176 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsScreenMixin.java @@ -0,0 +1,58 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if >=1.17.1 && <=1.20.6 && controlling { + +/*import com.blamejared.controlling.client.NewKeyBindsScreen; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.vertex.PoseStack; +import net.lopymine.patpat.client.keybinding.*; +import net.lopymine.patpat.utils.mixin.*; +import net.minecraft.client.*; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.options.controls.*; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.*; + +@Debug(export = true, print = true) +@Mixin(NewKeyBindsScreen.class) +// Ignore the "Cannot find 'KeyBindsScreen' in the hierarchy of target class 'NewKeyBindsScreen'" +// That's fine +public abstract class NewKeyBindsScreenMixin extends KeyBindsScreen { + + public NewKeyBindsScreenMixin(Screen screen, Options options) { + super(screen, options); + } + + @Inject( + at = @At( + value = "FIELD", + target = "Lcom/blamejared/controlling/client/NewKeyBindsScreen;selectedKey:Lnet/minecraft/client/KeyMapping;", + ordinal = 1, + shift = Shift.AFTER, + opcode = Opcodes.GETFIELD + ), + method = "keyPressed", + cancellable = true + ) + private void handlePatPatKeybindingOnKeyPressed(int keyCode, int scanCode, int mods, CallbackInfoReturnable cir) { + PatPatClientKeybindingManager.handlePatPatKeybindingOnKeyPressed(this.selectedKey, this, keyCode, scanCode, () -> cir.setReturnValue(false)); + } + + //? if <1.19.3 { + /^@Inject(at = @At("TAIL"), method = "render") + private void renderWithTooltip(PoseStack poseStack, int mouseX, int mouseY, float partialTick, CallbackInfo ci) { + if (this instanceof IRequestableTooltipScreen screen) { + TooltipRequest tooltipRequest = screen.myTotemDoll$getCurrentRequest(); + if (tooltipRequest != null) { + tooltipRequest.render(poseStack, mouseX, mouseY, partialTick); + screen.myTotemDoll$requestTooltip(null); + } + } + } + ^///?} + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsScreenModernMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsScreenModernMixin.java new file mode 100644 index 00000000..145bf195 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyBindsScreenModernMixin.java @@ -0,0 +1,31 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if >=1.21 && controlling { + +import com.blamejared.controlling.client.NewKeyBindsScreen; +import net.lopymine.patpat.client.keybinding.PatPatClientKeybindingManager; +import net.minecraft.client.Options; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.options.controls.KeyBindsScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(NewKeyBindsScreen.class) +public abstract class NewKeyBindsScreenModernMixin extends KeyBindsScreen { + + public NewKeyBindsScreenModernMixin(Screen screen, Options options) { + super(screen, options); + } + + @Inject(at = @At("HEAD"), method = "keyPressed", cancellable = true) + private void handlePatPatKeybindingOnKeyPressed(/*? if >=1.21.9 {*/net.minecraft.client.input.KeyEvent event/*?} else {*/ /*net.minecraft.client.input.KeyEvent event*//*?}*/, CallbackInfoReturnable cir) { + //? if >=1.21.9 { + int keyCode = event.key(); + int scanCode = event.scancode(); + //?} + PatPatClientKeybindingManager.handlePatPatKeybindingOnKeyPressed(this.selectedKey, this, keyCode, scanCode, () -> cir.setReturnValue(false)); + } + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyEntryMixin.java b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyEntryMixin.java new file mode 100644 index 00000000..bd2a832e --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/controlling/NewKeyEntryMixin.java @@ -0,0 +1,63 @@ +package net.lopymine.patpat.mixin.controlling; + +//? if >=1.17.1 && controlling { + +import com.blamejared.controlling.client.NewKeyBindsList; +import com.blamejared.controlling.client.NewKeyBindsList.KeyEntry; +import net.lopymine.patpat.client.keybinding.PatPatKeybinding; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.gui.components.*; +import net.minecraft.client.gui.screens.options.controls.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(KeyEntry.class) +public class NewKeyEntryMixin { + + //? if >=1.19.4 { + @Shadow/*? if forge {*//*(remap = false)*//*?}*/ + @Final + private KeyMapping key; + //?} else { + /*@Shadow + @Final + private KeyMapping keybinding; + *///?} + + @Shadow/*? if forge {*//*(remap = false)*//*?}*/ + @Final + private Button btnChangeKeyBinding; + + //? if <1.19.3 { + /*@Inject(at = @At("TAIL"), method = "") + private void init(NewKeyBindsList list, KeyMapping name, CallbackInfo ci) { + if (!(this.keybinding instanceof PatPatKeybinding patPatKeybinding)) { + return; + } + + this.btnChangeKeyBinding.onTooltip = (button, poseStack, a, b) -> { + /^? if >=1.18 {^/ + KeyBindsScreen screen = list.keyBindsScreen; + /^?} else {^/ + /^KeyBindsScreen screen = ((NewKeyBindsListAccessor) list).getScreenPleaseThanks(); + ^//^?}^/ + ((net.lopymine.patpat.utils.mixin.IRequestableTooltipScreen) screen).myTotemDoll$requestTooltip((pose, x, y, d) -> { + screen.renderTooltip(poseStack, patPatKeybinding.getFullTranslatedKeyMessage(), x, y); + }); + }; + } + *///?} + + @Inject(at = @At(/*? if >=1.19.4 {*/ "TAIL" /*?} else {*/ /*"HEAD" *//*?}*/), method = /*? if >=1.19.4 {*/ "refreshEntry" /*?} else {*/ /*"render" *//*?}*/) + private void addPatPatTooltipToPatPatKey(CallbackInfo ci) { + //? if >=1.19.4 { + if (!(this.key instanceof PatPatKeybinding patPatKeybinding)) { + return; + } + this.btnChangeKeyBinding.setTooltip(Tooltip.create(patPatKeybinding.getTranslatedKeyMessage())); + //?} + } + +} +//?} diff --git a/src/main/java/net/lopymine/patpat/mixin/forge/MinecraftMixin.java b/src/main/java/net/lopymine/patpat/mixin/forge/MinecraftMixin.java new file mode 100644 index 00000000..ecbdcbba --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/forge/MinecraftMixin.java @@ -0,0 +1,29 @@ +package net.lopymine.patpat.mixin.forge; + +//? if forge { + +/*import net.lopymine.patpat.entrypoint.impl.forge.event.PatPatForgeClientStoppingEvent; +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Inject( + at = @At( + value = "INVOKE", + target = "Lorg/slf4j/Logger;info(Ljava/lang/String;)V", + ordinal = 0, + remap = false + ), + method = "destroy" + ) + private void onStopping(CallbackInfo ci) { + MinecraftForge.EVENT_BUS.post(new PatPatForgeClientStoppingEvent()); + } + +} +*///?} diff --git a/src/main/java/net/lopymine/patpat/mixin/geckolib/GeoEntityRendererMixin.java b/src/main/java/net/lopymine/patpat/mixin/geckolib/GeoEntityRendererMixin.java index 993996ef..eec696aa 100644 --- a/src/main/java/net/lopymine/patpat/mixin/geckolib/GeoEntityRendererMixin.java +++ b/src/main/java/net/lopymine/patpat/mixin/geckolib/GeoEntityRendererMixin.java @@ -8,16 +8,20 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.vertex.PoseStack; - import net.lopymine.patpat.client.render.PatPatClientRenderer; - -//? if >=1.19.3 { -import software.bernie.geckolib.renderer.GeoEntityRenderer; import net.minecraft.world.entity.Entity; -//?} -//? if >=1.21.9 { -import net.minecraft.client.renderer.state.CameraRenderState; +//? if >=1.19.3 && <=1.21.11 { +/*import software.bernie.geckolib.renderer.GeoEntityRenderer; +*///?} + +//? if >=1.21.9 && <=1.21.11 { +/*import net.minecraft.client.renderer.state.CameraRenderState; +*///?} + +//? if >=26.1 { +import com.geckolib.renderer.GeoEntityRenderer; +import net.minecraft.client.renderer.state.level.CameraRenderState; //?} @Pseudo @@ -41,7 +45,15 @@ private void render(net.minecraft.client.renderer.entity.state.EntityRenderState return; } *///?} elif >=1.19.3 { - /*@Inject(at = @At("HEAD"), method = "render") + /*@Inject( + at = @At("HEAD"), + //? if fabric || neoforge { + method = "render" + //?} elif forge { + /^method = "m_7392_", + remap = false + ^///?} + ) private void render(Entity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, CallbackInfo ci) { if (!(entity instanceof LivingEntity livingEntity)) { return; diff --git a/src/main/java/net/lopymine/patpat/mixin/tests/AbstractSelectionListInvoker.java b/src/main/java/net/lopymine/patpat/mixin/tests/AbstractSelectionListInvoker.java new file mode 100644 index 00000000..df6ed3d2 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/tests/AbstractSelectionListInvoker.java @@ -0,0 +1,13 @@ +package net.lopymine.patpat.mixin.tests; + +import net.minecraft.client.gui.components.AbstractSelectionList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(AbstractSelectionList.class) +public interface AbstractSelectionListInvoker { + + @Invoker("getRowTop") + int invokeGetRowTop(int index); + +} diff --git a/src/main/java/net/lopymine/patpat/mixin/tests/KeyboardHandlerInvoker.java b/src/main/java/net/lopymine/patpat/mixin/tests/KeyboardHandlerInvoker.java new file mode 100644 index 00000000..cad8b852 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/tests/KeyboardHandlerInvoker.java @@ -0,0 +1,19 @@ +package net.lopymine.patpat.mixin.tests; + +import net.minecraft.client.KeyboardHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(KeyboardHandler.class) +public interface KeyboardHandlerInvoker { + + @Invoker("keyPress") + void invokeKeyPress( + //? if >=1.21.9 { + long window, int action, net.minecraft.client.input.KeyEvent event + //?} else { + /*long window, int key, int scancode, int action, int modifiers + *///?} + ); + +} diff --git a/src/main/java/net/lopymine/patpat/mixin/tests/KeyboardHandlerMixin.java b/src/main/java/net/lopymine/patpat/mixin/tests/KeyboardHandlerMixin.java new file mode 100644 index 00000000..e9823c0e --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/tests/KeyboardHandlerMixin.java @@ -0,0 +1,47 @@ +package net.lopymine.patpat.mixin.tests; + +import net.minecraft.client.KeyboardHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.lopymine.patpat.tests.PatPatTestMode; + +//? if >=1.21.9 { +import net.minecraft.client.input.*; +//?} + +@Mixin(KeyboardHandler.class) +public class KeyboardHandlerMixin { + + //? if >=1.21.9 { + @Inject(method = "keyPress", at = @At("HEAD"), cancellable = true) + private void blockRealKeyPressDuringTests(long window, int key, KeyEvent event, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + + @Inject(method = "charTyped", at = @At("HEAD"), cancellable = true) + private void blockRealCharTypedDuringTests(long window, CharacterEvent event, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + //?} else { + /*@Inject(method = "keyPress", at = @At("HEAD"), cancellable = true) + private void blockRealKeyPressDuringTests(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + + @Inject(method = "charTyped", at = @At("HEAD"), cancellable = true) + private void blockRealCharTypedDuringTests(long window, int codePoint, int modifiers, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + *///?} +} diff --git a/src/main/java/net/lopymine/patpat/mixin/tests/MouseHandlerInvoker.java b/src/main/java/net/lopymine/patpat/mixin/tests/MouseHandlerInvoker.java new file mode 100644 index 00000000..b976880b --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/tests/MouseHandlerInvoker.java @@ -0,0 +1,24 @@ +package net.lopymine.patpat.mixin.tests; + +import net.minecraft.client.MouseHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(MouseHandler.class) +public interface MouseHandlerInvoker { + + @Invoker("onMove") + void invokeOnMove(long window, double x, double y); + + @Invoker("onScroll") + void invokeOnScroll(long window, double x, double y); + + //? if >=1.21.9 { + @Invoker("onButton") + void invokeOnButton(long window, net.minecraft.client.input.MouseButtonInfo info, int action); + //?} else { + /*@Invoker("onPress") + void invokeOnPress(long window, int button, int action, int modifiers); + *///?} + +} diff --git a/src/main/java/net/lopymine/patpat/mixin/tests/MouseHandlerMixin.java b/src/main/java/net/lopymine/patpat/mixin/tests/MouseHandlerMixin.java new file mode 100644 index 00000000..21ac2161 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/tests/MouseHandlerMixin.java @@ -0,0 +1,54 @@ +package net.lopymine.patpat.mixin.tests; + +import net.minecraft.client.MouseHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.lopymine.patpat.tests.PatPatTestMode; + +//? if >=1.21.9 { +import net.minecraft.client.input.MouseButtonInfo; +//?} + +@Mixin(MouseHandler.class) +public class MouseHandlerMixin { + + //? if >=1.21.9 { + @Inject(method = "onButton", at = @At("HEAD"), cancellable = true) + private void blockRealMouseButtonDuringTests(long window, MouseButtonInfo info, int action, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + //?} else { + /*@Inject(method = "onPress", at = @At("HEAD"), cancellable = true) + private void blockRealMouseButtonDuringTests(long window, int button, int action, int modifiers, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + *///?} + + @Inject(method = "onMove", at = @At("HEAD"), cancellable = true) + private void blockRealMouseMoveDuringTests(long window, double x, double y, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + + @Inject(method = "onScroll", at = @At("HEAD"), cancellable = true) + private void blockRealMouseScrollDuringTests(long window, double x, double y, CallbackInfo ci) { + if (PatPatTestMode.isRealInputBlocked()) { + ci.cancel(); + } + } + + @Inject(method = {"grabMouse", "releaseMouse"}, at = @At("HEAD"), cancellable = true) + private void keepCursorFreeDuringTests(CallbackInfo ci) { + if (PatPatTestMode.isEnabled()) { + ci.cancel(); + } + } +} diff --git a/src/main/java/net/lopymine/patpat/mixin/tests/WindowMixin.java b/src/main/java/net/lopymine/patpat/mixin/tests/WindowMixin.java new file mode 100644 index 00000000..75f6a7a3 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/mixin/tests/WindowMixin.java @@ -0,0 +1,29 @@ +package net.lopymine.patpat.mixin.tests; + +import com.mojang.blaze3d.platform.Window; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.lopymine.patpat.tests.PatPatTestMode; + +@Mixin(Window.class) +public class WindowMixin { + + @Inject(method = {"onFocus", "onEnter"}, at = @At("HEAD"), cancellable = true) + private void keepWindowFocusedDuringTests(long window, boolean value, CallbackInfo ci) { + if (PatPatTestMode.isEnabled() && !value) { + ci.cancel(); + } + } + + //? if >=1.21.9 { + @Inject(method = "onIconify", at = @At("HEAD"), cancellable = true) + private void keepWindowRestoredDuringTests(long window, boolean value, CallbackInfo ci) { + if (PatPatTestMode.isEnabled() && value) { + ci.cancel(); + } + } + //?} +} diff --git a/src/main/java/net/lopymine/patpat/modmenu/ModMenuIntegration.java b/src/main/java/net/lopymine/patpat/modmenu/ModMenuIntegration.java deleted file mode 100644 index e56a791c..00000000 --- a/src/main/java/net/lopymine/patpat/modmenu/ModMenuIntegration.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.lopymine.patpat.modmenu; - -import com.terraformersmc.modmenu.api.*; - -import net.fabricmc.loader.api.FabricLoader; - -import net.lopymine.patpat.modmenu.bridge.*; -import net.lopymine.patpat.utils.VersionedThings; - -public class ModMenuIntegration implements ModMenuApi { - - @Override - public ConfigScreenFactory getModConfigScreenFactory() { - //? >=1.20.1 { - if (FabricLoader.getInstance().isModLoaded("yet_another_config_lib_v3")) { - return YACLBridge::getScreen; - } - //?} - if (FabricLoader.getInstance().isModLoaded(VersionedThings.CLOTH_CONFIG_ID)) { - return ClothConfigBridge::getScreen; - } - return NoConfigLibrariesScreen::createScreen; - } -} diff --git a/src/main/java/net/lopymine/patpat/modmenu/PatConfig.java b/src/main/java/net/lopymine/patpat/modmenu/PatConfig.java index 8aca79fb..c07cdc12 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/PatConfig.java +++ b/src/main/java/net/lopymine/patpat/modmenu/PatConfig.java @@ -1,16 +1,24 @@ package net.lopymine.patpat.modmenu; -import java.util.*; import lombok.*; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; + import net.lopymine.patpat.client.config.PatPatClientConfig; + import net.lopymine.patpat.client.config.list.PatPatClientProxLibServersWhitelistConfig; import net.lopymine.patpat.client.config.sub.PatPatClientFunConfig; import net.lopymine.patpat.modmenu.common.*; -import net.lopymine.patpat.modmenu.common.image.*; +import net.lopymine.patpat.modmenu.common.image.ImageType; +import net.lopymine.patpat.modmenu.common.image.PatImage; import net.lopymine.patpat.modmenu.common.option.*; -import net.lopymine.patpat.utils.*; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; +import net.lopymine.patpat.utils.ModMenuUtils; +import net.lopymine.patpat.utils.TextUtils; + +import java.util.ArrayList; +import java.util.List; + +import net.lopymine.patpat.client.config.PatPatDebugConfig; @Getter @Builder @@ -23,216 +31,247 @@ public class PatConfig { public static PatConfig generate() { PatPatClientConfig config = PatPatClientConfig.getInstance(); - PatPatClientConfig defConfig = PatPatClientConfig.getNewInstance().get(); + PatPatDebugConfig debugConfig = PatPatDebugConfig.getInstance(); + + Runnable saveFunction = () -> { + config.saveAsync(); + debugConfig.saveAsync(); + }; + return PatConfig.builder() .title(ModMenuUtils.getModTitle()) - .onSave(config::saveAsync) - .addCategory(PatCategory.builder() + .onSave(saveFunction) + .addCategory(generateMainCategory(config)) + .addCategoryIf(generateDebugCategory(debugConfig), PatPatDebugConfig.DEBUG_ENABLED) + .build(); + } + + private static PatCategory generateMainCategory(PatPatClientConfig config) { + PatPatClientConfig defConfig = PatPatClientConfig.getNewInstance().get(); + + return PatCategory.builder() + .key("main") + .addElement(PatGroup.builder() .key("main") - .addElement(PatGroup.builder() - .key("main") - .addOption(BooleanOption.builder() - .key("enable_mod") - .defaultValue(defConfig.getMainConfig().isModEnabled()) - .getter(() -> config.getMainConfig().isModEnabled()) - .setter(config.getMainConfig()::setModEnabled) - .build() - ) - .addOption(BooleanOption.builder() - .key("debug_log_enabled") - .defaultValue(defConfig.getMainConfig().isDebugLogEnabled()) - .getter(() -> config.getMainConfig().isDebugLogEnabled()) - .setter(config.getMainConfig()::setDebugLogEnabled) - .build() - ) + .addOption(BooleanOption.builder() + .key("enable_mod") + .defaultValue(defConfig.getMainConfig().isModEnabled()) + .getter(() -> config.getMainConfig().isModEnabled()) + .setter(config.getMainConfig()::setModEnabled) .build() ) - .addElement(PatGroup.builder() - .key("custom_animations") - .addOption(BooleanOption.builder() - .key("skip_outdated_animations_enabled") - .defaultValue(defConfig.getResourcePacksConfig().isSkipOldAnimationsEnabled()) - .getter(() -> config.getResourcePacksConfig().isSkipOldAnimationsEnabled()) - .setter(config.getResourcePacksConfig()::setSkipOldAnimationsEnabled) - .build() - ) + .addOption(BooleanOption.builder() + .key("debug_log_enabled") + .defaultValue(defConfig.getMainConfig().isDebugLogEnabled()) + .getter(() -> config.getMainConfig().isDebugLogEnabled()) + .setter(config.getMainConfig()::setDebugLogEnabled) .build() ) - .addElement(PatGroup.builder() - .key("sound") - .addOption(BooleanOption.builder() - .key("enable_sounds") - .defaultValue(defConfig.getSoundsConfig().isSoundsEnabled()) - .getter(() -> config.getSoundsConfig().isSoundsEnabled()) - .setter(config.getSoundsConfig()::setSoundsEnabled) - .build() - ) - .addOption(SliderNumberOption.builder() - .key("enable_sounds") - .defaultValue(defConfig.getSoundsConfig().getSoundsVolume()) - .getter(() -> config.getSoundsConfig().getSoundsVolume()) - .setter(config.getSoundsConfig()::setSoundsVolume) - .min(0F).max(2F).step(0.01F) - .build() - ) + .build() + ) + .addElement(PatGroup.builder() + .key("custom_animations") + .addOption(BooleanOption.builder() + .key("skip_outdated_animations_enabled") + .defaultValue(defConfig.getResourcePacksConfig().isSkipOldAnimationsEnabled()) + .getter(() -> config.getResourcePacksConfig().isSkipOldAnimationsEnabled()) + .setter(config.getResourcePacksConfig()::setSkipOldAnimationsEnabled) .build() ) - .addElement(PatGroup.builder() - .key("visual") - .addOption(BooleanOption.builder() - .key("hiding_nickname_enabled") - .defaultValue(defConfig.getVisualConfig().isHidingNicknameEnabled()) - .getter(() -> config.getVisualConfig().isHidingNicknameEnabled()) - .setter(config.getVisualConfig()::setHidingNicknameEnabled) - .build() - ) - .addOption(BooleanOption.builder() - .key("client_swing_hand_enabled") - .defaultValue(defConfig.getVisualConfig().isClientSwingHandEnabled()) - .getter(() -> config.getVisualConfig().isClientSwingHandEnabled()) - .setter(config.getVisualConfig()::setClientSwingHandEnabled) - .build() - ) - .addOption(BooleanOption.builder() - .key("server_swing_hand_enabled") - .defaultValue(defConfig.getVisualConfig().isServerSwingHandEnabled()) - .getter(() -> config.getVisualConfig().isServerSwingHandEnabled()) - .setter(config.getVisualConfig()::setServerSwingHandEnabled) - .build() - ) - .addOption(SliderNumberOption.builder() - .key("animation_offset_x") - .defaultValue(defConfig.getVisualConfig().getAnimationOffsets().getX()) - .getter(() -> config.getVisualConfig().getAnimationOffsets().getX()) - .setter(config.getVisualConfig().getAnimationOffsets()::setX) - .min(-5F).max(5F).step(0.01F) - .addImage(PatImage.builder() - .resource(ModMenuUtils.getContentId("animation_offset_x.png")) - .type(ImageType.IMAGE) - .width(500) - .height(500) - .build() - ) - .build() - ) - .addOption(SliderNumberOption.builder() - .key("animation_offset_y") - .defaultValue(defConfig.getVisualConfig().getAnimationOffsets().getY()) - .getter(() -> config.getVisualConfig().getAnimationOffsets().getY()) - .setter(config.getVisualConfig().getAnimationOffsets()::setY) - .min(-5F).max(5F).step(0.01F) - .addImage(PatImage.builder() - .resource(ModMenuUtils.getContentId("animation_offset_y.png")) - .type(ImageType.IMAGE) - .width(500) - .height(500) - .build() - ) - .build() - ) - .addOption(SliderNumberOption.builder() - .key("animation_offset_z") - .defaultValue(defConfig.getVisualConfig().getAnimationOffsets().getZ()) - .getter(() -> config.getVisualConfig().getAnimationOffsets().getZ()) - .setter(config.getVisualConfig().getAnimationOffsets()::setZ) - .min(-5F).max(5F).step(0.01F) - .addImage(PatImage.builder() - .resource(ModMenuUtils.getContentId("animation_offset_z.png")) - .type(ImageType.IMAGE) - .width(500) - .height(500) - .build() - ) - .build() - ) - .addOption(BooleanOption.builder() - .key("camera_shacking") - .defaultValue(defConfig.getVisualConfig().isCameraShackingEnabled()) - .getter(() -> config.getVisualConfig().isCameraShackingEnabled()) - .setter(config.getVisualConfig()::setCameraShackingEnabled) - .build() - ) - .addOption(NumberOption.builder() - .key("pat_weight") - .defaultValue(defConfig.getVisualConfig().getPatWeight()) - .getter(() -> config.getVisualConfig().getPatWeight()) - .setter(config.getVisualConfig()::setPatWeight) - .min(0F).max(5F) - .build() - ) + .build() + ) + .addElement(PatGroup.builder() + .key("sound") + .addOption(BooleanOption.builder() + .key("enable_sounds") + .defaultValue(defConfig.getSoundsConfig().isSoundsEnabled()) + .getter(() -> config.getSoundsConfig().isSoundsEnabled()) + .setter(config.getSoundsConfig()::setSoundsEnabled) .build() ) - .addElement(PatGroup.builder() - .key("multiplayer") - .addOption(BooleanOption.builder() - .key("pat_me_enabled") - .defaultValue(defConfig.getMultiPlayerConfig().isPatMeEnabled()) - .getter(() -> config.getMultiPlayerConfig().isPatMeEnabled()) - .setter(config.getMultiPlayerConfig()::setPatMeEnabled) - .build() - ) - .addOption(BooleanOption.builder() - .key("bypass_server_animations_priority_enabled") - .defaultValue(defConfig.getMultiPlayerConfig().isBypassServerResourcePackPriorityEnabled()) - .getter(() -> config.getMultiPlayerConfig().isBypassServerResourcePackPriorityEnabled()) - .setter(config.getMultiPlayerConfig()::setBypassServerResourcePackEnabled) - .build() - ) + .addOption(SliderNumberOption.builder() + .key("sounds_volume") + .defaultValue(defConfig.getSoundsConfig().getSoundsVolume()) + .getter(() -> config.getSoundsConfig().getSoundsVolume()) + .setter(config.getSoundsConfig()::setSoundsVolume) + .min(0F).max(2F).step(0.01F) .build() ) - .addElement(PatGroup.builder() - .key("fun") - .addOption(EnumOption.builder() - .key("pvp_mode") - .enumClass(PatPatClientFunConfig.PvpMode.class) - .enumNameProvider(PatPatClientFunConfig.PvpMode::getText) - .defaultValue(defConfig.getFunConfig().getPvpMode()) - .getter(() -> config.getFunConfig().getPvpMode()) - .setter(config.getFunConfig()::setPvpMode) - .build() - ) + .build() + ) + .addElement(PatGroup.builder() + .key("visual") + .addOption(BooleanOption.builder() + .key("hiding_nickname_enabled") + .defaultValue(defConfig.getVisualConfig().isHidingNicknameEnabled()) + .getter(() -> config.getVisualConfig().isHidingNicknameEnabled()) + .setter(config.getVisualConfig()::setHidingNicknameEnabled) .build() ) - //? if proxlib { - .addElement(PatGroup.builder() - .key("proximity_packets") - .addOption(BooleanOption.builder() - .name(ModMenuUtils.getOptionName("proximity_packets_enabled")) - .description(getDescriptionWithWarn("proximity_packets_enabled")) - .defaultValue(defConfig.getProximityPacketsConfig().isProximityPacketsEnabled()) - .getter(() -> config.getProximityPacketsConfig().isProximityPacketsEnabled()) - .setter(config.getProximityPacketsConfig()::setProximityPacketsEnabled) - .build() - ) - .addOption(SliderNumberOption.builder() - .key("max_packets_per_second") - .defaultValue(defConfig.getProximityPacketsConfig().getMaxPacketsPerSecond()) - .getter(() -> config.getProximityPacketsConfig().getMaxPacketsPerSecond()) - .setter(config.getProximityPacketsConfig()::setMaxPacketsPerSecond) - .min(1).max(50).step(1) + .addOption(BooleanOption.builder() + .key("client_swing_hand_enabled") + .defaultValue(defConfig.getVisualConfig().isClientSwingHandEnabled()) + .getter(() -> config.getVisualConfig().isClientSwingHandEnabled()) + .setter(config.getVisualConfig()::setClientSwingHandEnabled) + .build() + ) + .addOption(BooleanOption.builder() + .key("server_swing_hand_enabled") + .defaultValue(defConfig.getVisualConfig().isServerSwingHandEnabled()) + .getter(() -> config.getVisualConfig().isServerSwingHandEnabled()) + .setter(config.getVisualConfig()::setServerSwingHandEnabled) + .build() + ) + .addOption(SliderNumberOption.builder() + .key("animation_offset_x") + .defaultValue(defConfig.getVisualConfig().getAnimationOffsets().getX()) + .getter(() -> config.getVisualConfig().getAnimationOffsets().getX()) + .setter(config.getVisualConfig().getAnimationOffsets()::setX) + .min(-5F).max(5F).step(0.01F) + .addImage(PatImage.builder() + .resource(ModMenuUtils.getContentId("animation_offset_x.png")) + .type(ImageType.IMAGE) + .width(500) + .height(500) .build() ) - .addOption(BooleanOption.builder() - .key("proximity_packets_list_is_blacklist") - .defaultValue(defConfig.getProximityPacketsConfig().isBlacklist()) - .getter(() -> config.getProximityPacketsConfig().isBlacklist()) - .setter(config.getProximityPacketsConfig()::setBlacklist) + .build() + ) + .addOption(SliderNumberOption.builder() + .key("animation_offset_y") + .defaultValue(defConfig.getVisualConfig().getAnimationOffsets().getY()) + .getter(() -> config.getVisualConfig().getAnimationOffsets().getY()) + .setter(config.getVisualConfig().getAnimationOffsets()::setY) + .min(-5F).max(5F).step(0.01F) + .addImage(PatImage.builder() + .resource(ModMenuUtils.getContentId("animation_offset_y.png")) + .type(ImageType.IMAGE) + .width(500) + .height(500) .build() ) - .addOption(PatListOption.builder() - .name(ModMenuUtils.getOptionName("proximity_packets_servers_whitelist")) - .description(getDescriptionWithWarn("proximity_packets_servers_whitelist")) - .defaultValue(PatPatClientProxLibServersWhitelistConfig.DEFAULT_VALUES) - .getter(() -> new ArrayList<>(PatPatClientProxLibServersWhitelistConfig.getInstance().getValues())) - .setter(PatPatClientProxLibServersWhitelistConfig::rewriteServersList) - .initial("") - .maxEntries(2000) + .build() + ) + .addOption(SliderNumberOption.builder() + .key("animation_offset_z") + .defaultValue(defConfig.getVisualConfig().getAnimationOffsets().getZ()) + .getter(() -> config.getVisualConfig().getAnimationOffsets().getZ()) + .setter(config.getVisualConfig().getAnimationOffsets()::setZ) + .min(-5F).max(5F).step(0.01F) + .addImage(PatImage.builder() + .resource(ModMenuUtils.getContentId("animation_offset_z.png")) + .type(ImageType.IMAGE) + .width(500) + .height(500) .build() ) .build() ) - //?} + .addOption(BooleanOption.builder() + .key("camera_shacking") + .defaultValue(defConfig.getVisualConfig().isCameraShackingEnabled()) + .getter(() -> config.getVisualConfig().isCameraShackingEnabled()) + .setter(config.getVisualConfig()::setCameraShackingEnabled) + .build() + ) + .addOption(NumberOption.builder() + .key("pat_weight") + .defaultValue(defConfig.getVisualConfig().getPatWeight()) + .getter(() -> config.getVisualConfig().getPatWeight()) + .setter(config.getVisualConfig()::setPatWeight) + .min(0F).max(5F) + .build() + ) + .build() + ) + .addElement(PatGroup.builder() + .key("multiplayer") + .addOption(BooleanOption.builder() + .key("pat_me_enabled") + .defaultValue(defConfig.getMultiPlayerConfig().isPatMeEnabled()) + .getter(() -> config.getMultiPlayerConfig().isPatMeEnabled()) + .setter(config.getMultiPlayerConfig()::setPatMeEnabled) + .build() + ) + .addOption(BooleanOption.builder() + .key("bypass_server_animations_priority_enabled") + .defaultValue(defConfig.getMultiPlayerConfig().isBypassServerResourcePackPriorityEnabled()) + .getter(() -> config.getMultiPlayerConfig().isBypassServerResourcePackPriorityEnabled()) + .setter(config.getMultiPlayerConfig()::setBypassServerResourcePackEnabled) + .build() + ) + .build() + ) + .addElement(PatGroup.builder() + .key("fun") + .addOption(EnumOption.builder() + .key("pvp_mode") + .enumClass(PatPatClientFunConfig.PvpMode.class) + .enumNameProvider(PatPatClientFunConfig.PvpMode::getText) + .defaultValue(defConfig.getFunConfig().getPvpMode()) + .getter(() -> config.getFunConfig().getPvpMode()) + .setter(config.getFunConfig()::setPvpMode) + .build() + ) + .build() + ) + //? if proxlib { + /*.addElement(PatGroup.builder() + .key("proximity_packets") + .addOption(BooleanOption.builder() + .name(ModMenuUtils.getOptionName("proximity_packets_enabled")) + .description(getDescriptionWithWarn("proximity_packets_enabled")) + .defaultValue(defConfig.getProximityPacketsConfig().isProximityPacketsEnabled()) + .getter(() -> config.getProximityPacketsConfig().isProximityPacketsEnabled()) + .setter(config.getProximityPacketsConfig()::setProximityPacketsEnabled) + .build() + ) + .addOption(SliderNumberOption.builder() + .key("max_packets_per_second") + .defaultValue(defConfig.getProximityPacketsConfig().getMaxPacketsPerSecond()) + .getter(() -> config.getProximityPacketsConfig().getMaxPacketsPerSecond()) + .setter(config.getProximityPacketsConfig()::setMaxPacketsPerSecond) + .min(1).max(50).step(1) + .build() + ) + .addOption(BooleanOption.builder() + .name(ModMenuUtils.getOptionName("proximity_packets_list_is_blacklist")) + .description(getDescriptionWithWarn("proximity_packets_list_is_blacklist")) + .defaultValue(defConfig.getProximityPacketsConfig().isBlacklist()) + .getter(() -> config.getProximityPacketsConfig().isBlacklist()) + .setter(config.getProximityPacketsConfig()::setBlacklist) + .build() + ) + .addOption(PatListOption.builder() + .key("proximity_packets_servers_whitelist") + .defaultValue(PatPatClientProxLibServersWhitelistConfig.DEFAULT_VALUES) + .getter(() -> new ArrayList<>(PatPatClientProxLibServersWhitelistConfig.getInstance().getValues())) + .setter(PatPatClientProxLibServersWhitelistConfig::rewriteServersList) + .initial("") + .maxEntries(2000) + .build() + ) + .build() + ) + *///?} + .build(); + } + + public static PatCategory generateDebugCategory(PatPatDebugConfig debugConfig) { + PatPatDebugConfig defDebugConfig = PatPatDebugConfig.getNewInstance().get(); + + return PatCategory.builder() + .key("debug") + .addElement(PatGroup.builder() + .key("main") + .addOption(BooleanOption.builder() + .key("selfPat") + .defaultValue(defDebugConfig.isSelfPat()) + .getter(debugConfig::isSelfPat) + .setter(debugConfig::setSelfPat) + .build() + ) .build() ) .build(); @@ -246,4 +285,15 @@ public static PatDescription getDescriptionWithWarn(String key) { .append(ModMenuUtils.getOptionDescription(key)) ); } + + public static class PatConfigBuilder { + + public PatConfigBuilder addCategoryIf(PatCategory category, boolean bl) { + if (bl) { + this.addCategory(category); + } + return this; + } + + } } diff --git a/src/main/java/net/lopymine/patpat/modmenu/bridge/ClothConfigBridge.java b/src/main/java/net/lopymine/patpat/modmenu/bridge/ClothConfigBridge.java index c745c1da..a68c894c 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/bridge/ClothConfigBridge.java +++ b/src/main/java/net/lopymine/patpat/modmenu/bridge/ClothConfigBridge.java @@ -1,6 +1,8 @@ package net.lopymine.patpat.modmenu.bridge; -import me.shedaniel.clothconfig2.api.*; +//? if cloth-config { + +/*import me.shedaniel.clothconfig2.api.*; import me.shedaniel.clothconfig2.gui.entries.*; import me.shedaniel.clothconfig2.impl.builders.*; import net.lopymine.patpat.modmenu.PatConfig; @@ -213,3 +215,4 @@ private static AbstractConfigListEntry getListOption(PatListOption option, } +*///?} diff --git a/src/main/java/net/lopymine/patpat/modmenu/bridge/YACLBridge.java b/src/main/java/net/lopymine/patpat/modmenu/bridge/YACLBridge.java index e7c88879..c23753f6 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/bridge/YACLBridge.java +++ b/src/main/java/net/lopymine/patpat/modmenu/bridge/YACLBridge.java @@ -1,6 +1,6 @@ package net.lopymine.patpat.modmenu.bridge; -//? >=1.20.1 { +//? >=1.20.1 && yacl { import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.*; @@ -17,7 +17,7 @@ //? if yacl: >=3.6.6 { import dev.isxander.yacl3.gui.image.ImageRenderer; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; //?} public class YACLBridge { @@ -229,7 +229,7 @@ private static OptionDescription getDescription(PatDescription description) { builder.customImage( new ImageRenderer() { @Override - public int render(GuiGraphics graphics, int x, int y, int renderWidth, float delta) { + public int render(GuiGraphicsExtractor graphics, int x, int y, int renderWidth, float delta) { return renderer.getMethod().render(graphics, x, y, renderWidth, delta); } diff --git a/src/main/java/net/lopymine/patpat/modmenu/common/image/PatImage.java b/src/main/java/net/lopymine/patpat/modmenu/common/image/PatImage.java index 8f7ae4e9..69f86a46 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/common/image/PatImage.java +++ b/src/main/java/net/lopymine/patpat/modmenu/common/image/PatImage.java @@ -2,12 +2,12 @@ import lombok.Getter; import lombok.experimental.SuperBuilder; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; @Getter @SuperBuilder public class PatImage extends AbstractPatImage{ - private final ResourceLocation resource; + private final Identifier resource; } diff --git a/src/main/java/net/lopymine/patpat/modmenu/common/image/PatRenderer.java b/src/main/java/net/lopymine/patpat/modmenu/common/image/PatRenderer.java index 6c6a3e38..b9fff10e 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/common/image/PatRenderer.java +++ b/src/main/java/net/lopymine/patpat/modmenu/common/image/PatRenderer.java @@ -4,7 +4,7 @@ import lombok.experimental.SuperBuilder; //? >=1.20 { -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; //?} else { /*import com.mojang.blaze3d.vertex.PoseStack; *///?} @@ -17,7 +17,7 @@ public class PatRenderer extends AbstractPatImage { @FunctionalInterface public interface RenderMethod { - int render(/*? >=1.20 {*/GuiGraphics graphics/*?} else {*//*PoseStack poseStack*//*?}*/, int x, int y, int renderWidth, float delta); + int render(/*? >=1.20 {*/GuiGraphicsExtractor graphics/*?} else {*//*PoseStack poseStack*//*?}*/, int x, int y, int renderWidth, float delta); } } diff --git a/src/main/java/net/lopymine/patpat/modmenu/integration/AbstractModMenuIntegration.java b/src/main/java/net/lopymine/patpat/modmenu/integration/AbstractModMenuIntegration.java new file mode 100644 index 00000000..e3c5215d --- /dev/null +++ b/src/main/java/net/lopymine/patpat/modmenu/integration/AbstractModMenuIntegration.java @@ -0,0 +1,87 @@ +package net.lopymine.patpat.modmenu.integration; + +//? if fabric { + +import com.terraformersmc.modmenu.api.*; +import net.minecraft.client.gui.screens.Screen; + +public abstract class AbstractModMenuIntegration implements ModMenuApi { + + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return this::createConfigScreen; + } + + protected abstract Screen createConfigScreen(Screen parent); +} + + +//?} elif neoforge && >=1.20.5 { + +/*import net.neoforged.fml.*; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import net.minecraft.client.gui.screens.Screen; + +public abstract class AbstractModMenuIntegration { + + public void register(ModContainer container) { + container.registerExtensionPoint(IConfigScreenFactory.class, (modContainer, parent) -> createConfigScreen(parent)); + } + + protected abstract Screen createConfigScreen(Screen parent); + +} + +*///?} elif neoforge { + +/*import net.minecraft.client.gui.screens.Screen; +import net.neoforged.neoforge.client.ConfigScreenHandler.ConfigScreenFactory; +import net.neoforged.fml.*; + +public abstract class AbstractModMenuIntegration { + + public void register(ModContainer container) { + container.registerExtensionPoint( + ConfigScreenFactory.class, + () -> new ConfigScreenFactory((minecraft, parent) -> this.createConfigScreen(parent)) + ); + } + + protected abstract Screen createConfigScreen(Screen parent); + +} + +*///?} elif forge { + +/*import net.minecraft.client.gui.screens.Screen; +import net.minecraftforge.fml.*; + +//? if >=1.19 { +import net.minecraftforge.client.ConfigScreenHandler.ConfigScreenFactory; +//?} elif >=1.18 { +/^import net.minecraftforge.client.ConfigGuiHandler.ConfigGuiFactory; +^///?} else { +/^import net.minecraftforge.fmlclient.ConfigGuiHandler.ConfigGuiFactory; +^///?} + +public abstract class AbstractModMenuIntegration { + + public void register(ModContainer container) { + //? if >=1.19 { + container.registerExtensionPoint( + ConfigScreenFactory.class, + () -> new ConfigScreenFactory((minecraft, parent) -> this.createConfigScreen(parent)) + ); + //?} else { + /^container.registerExtensionPoint( + ConfigGuiFactory.class, + () -> new ConfigGuiFactory((minecraft, parent) -> this.createConfigScreen(parent)) + ); + ^///?} + } + + protected abstract Screen createConfigScreen(Screen parent); + +} + +*///?} diff --git a/src/main/java/net/lopymine/patpat/modmenu/integration/PatPatModMenuIntegration.java b/src/main/java/net/lopymine/patpat/modmenu/integration/PatPatModMenuIntegration.java new file mode 100644 index 00000000..16c1064c --- /dev/null +++ b/src/main/java/net/lopymine/patpat/modmenu/integration/PatPatModMenuIntegration.java @@ -0,0 +1,26 @@ +package net.lopymine.patpat.modmenu.integration; + +import net.lopymine.patpat.entrypoint.*; +import net.lopymine.patpat.modmenu.screen.NoConfigLibrariesScreen; +import net.lopymine.patpat.modmenu.bridge.*; +import net.lopymine.patpat.utils.VersionedThings; +import net.minecraft.client.gui.screens.Screen; + +public class PatPatModMenuIntegration extends AbstractModMenuIntegration { + + @Override + protected Screen createConfigScreen(Screen parent) { + //? >=1.20.1 && yacl { + if (EarlyCommonMultiLoader.getInstance().isModLoaded("yet_another_config_lib_v3")) { + return YACLBridge.getScreen(parent); + } + //?} + //? if cloth-config { + /*if (EarlyCommonMultiLoader.getInstance().isModLoaded(VersionedThings.CLOTH_CONFIG_ID)) { + return ClothConfigBridge.getScreen(parent); + } + + *///?} + return NoConfigLibrariesScreen.createScreen(parent); + } +} diff --git a/src/main/java/net/lopymine/patpat/modmenu/NoConfigLibrariesScreen.java b/src/main/java/net/lopymine/patpat/modmenu/screen/NoConfigLibrariesScreen.java similarity index 67% rename from src/main/java/net/lopymine/patpat/modmenu/NoConfigLibrariesScreen.java rename to src/main/java/net/lopymine/patpat/modmenu/screen/NoConfigLibrariesScreen.java index ee783468..d39acc3f 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/NoConfigLibrariesScreen.java +++ b/src/main/java/net/lopymine/patpat/modmenu/screen/NoConfigLibrariesScreen.java @@ -1,20 +1,23 @@ -package net.lopymine.patpat.modmenu; +package net.lopymine.patpat.modmenu.screen; +import it.unimi.dsi.fastutil.booleans.BooleanConsumer; +import net.lopymine.patpat.entrypoint.EarlyCommonMultiLoader; +import net.lopymine.patpat.translation.PatTranslation; import net.minecraft.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ConfirmScreen; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.*; +import net.minecraft.util.*; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.utils.*; -import net.lopymine.patpat.*; import java.net.*; import java.util.*; -/*? if >=1.21.9 {*/ +//? if >=1.21.9 { import net.minecraft.client.input.KeyEvent; -/*?}*/ +//?} public class NoConfigLibrariesScreen { @@ -22,8 +25,8 @@ private NoConfigLibrariesScreen() { throw new IllegalStateException("Screen class, use NoConfigLibrariesScreen.createScreen(...) method!"); } - private static final String YACL_MODRINTH_LINK = "https://modrinth.com/mod/yacl?version=%s&loader=fabric#download"; - private static final String CLOTH_CONFIG_API_MODRINTH_LINK = "https://modrinth.com/mod/cloth-config?version=%s&loader=fabric#download"; + private static final String YACL_MODRINTH_LINK = "https://modrinth.com/mod/yacl?version=%s&loader=%s#download"; + private static final String CLOTH_CONFIG_API_MODRINTH_LINK = "https://modrinth.com/mod/cloth-config?version=%s&loader=%s#download"; private static final Component TITLE; private static final Component MESSAGE; @@ -33,39 +36,12 @@ private NoConfigLibrariesScreen() { private static final Set ALLOWED_PROTOCOLS = Set.of("http", "https"); public static Screen createScreen(Screen parent) { - return new ConfirmScreen(NoConfigLibrariesScreen::onConfirm, NoConfigLibrariesScreen.TITLE, NoConfigLibrariesScreen.MESSAGE, NoConfigLibrariesScreen.OPEN_YACL_PAGE, NoConfigLibrariesScreen.OPEN_CLOTH_CONFIG_PAGE) { - //? if >=1.21.9 { - - @Override - public boolean keyPressed(KeyEvent keyEvent) { - if (keyEvent.key() == 256 && this.shouldCloseOnEsc()) { - Minecraft.getInstance().setScreen(parent); - return true; - } - return super.keyPressed(keyEvent); - } - - //?} else { - /*@Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == 256 && this.shouldCloseOnEsc()) { - Minecraft.getInstance().setScreen(parent); - return true; - } - return super.keyPressed(keyCode, scanCode, modifiers); - } - *///?} - - @Override - public boolean shouldCloseOnEsc() { - return true; - } - }; + return new CustomConfirmScreen(parent); } private static void onConfirm(boolean bl) { try { - String url = (bl ? YACL_MODRINTH_LINK : CLOTH_CONFIG_API_MODRINTH_LINK).formatted(SharedConstants.getCurrentVersion()./*? if >=1.21.6 {*/name/*?} else {*/ /*getName *//*?}*/()); + String url = (bl ? YACL_MODRINTH_LINK : CLOTH_CONFIG_API_MODRINTH_LINK).formatted(SharedConstants.getCurrentVersion()./*? if >=1.21.6 {*/name/*?} else {*/ /*getName *//*?}*/(), EarlyCommonMultiLoader.getInstance().getPlatform()); URI link = new URI(url); String string = link.getScheme(); @@ -81,6 +57,44 @@ private static void onConfirm(boolean bl) { } } + private static final class CustomConfirmScreen extends ConfirmScreen { + + private final Screen parent; + + public CustomConfirmScreen(Screen parent) { + super(NoConfigLibrariesScreen::onConfirm, NoConfigLibrariesScreen.TITLE, NoConfigLibrariesScreen.MESSAGE, NoConfigLibrariesScreen.OPEN_YACL_PAGE, NoConfigLibrariesScreen.OPEN_CLOTH_CONFIG_PAGE); + this.parent = parent; + } + + //? if >=1.21.9 { + + @Override + public boolean keyPressed(KeyEvent keyEvent) { + if (keyEvent.key() == 256 && this.shouldCloseOnEsc()) { + Minecraft.getInstance().setScreen(this.parent); + return true; + } + return super.keyPressed(keyEvent); + } + + //?} else { + /*@Override + public boolean keyPressed(net.minecraft.client.input.KeyEvent event) { + if (keyCode == 256 && this.shouldCloseOnEsc()) { + Minecraft.getInstance().setScreen(parent); + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + *///?} + + @Override + public boolean shouldCloseOnEsc() { + return true; + } + + } + static { MutableComponent yaclShort = TextUtils.literal("YACL").withStyle(ChatFormatting.GOLD); Component yaclFull = TextUtils.literal("Yet Another Config Lib [YACL]").withStyle(ChatFormatting.GOLD); diff --git a/src/main/java/net/lopymine/patpat/modmenu/ModMenuTranslators.java b/src/main/java/net/lopymine/patpat/modmenu/translation/ModMenuTranslators.java similarity index 93% rename from src/main/java/net/lopymine/patpat/modmenu/ModMenuTranslators.java rename to src/main/java/net/lopymine/patpat/modmenu/translation/ModMenuTranslators.java index b5816d88..934ca0f0 100644 --- a/src/main/java/net/lopymine/patpat/modmenu/ModMenuTranslators.java +++ b/src/main/java/net/lopymine/patpat/modmenu/translation/ModMenuTranslators.java @@ -1,4 +1,6 @@ -package net.lopymine.patpat.modmenu; +package net.lopymine.patpat.modmenu.translation; + +//? if fabric { import lombok.Getter; @@ -6,7 +8,7 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.CustomValue; -import net.lopymine.patpat.PatLogger; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.PatPat; import java.util.*; @@ -20,11 +22,10 @@ public class ModMenuTranslators { private Map> translators = new HashMap<>(); /*?} else {*/ /*private List translators = new ArrayList<>(); - *//*?}*/ + *//*?}*/ private static ModMenuTranslators instance; - private ModMenuTranslators() { Optional modContainer = FabricLoader.getInstance().getModContainer(PatPat.MOD_ID); if (modContainer.isEmpty()) { @@ -59,3 +60,4 @@ public static ModMenuTranslators getInstance() { } } +//?} diff --git a/src/main/java/net/lopymine/patpat/packet/BasePatPatPacket.java b/src/main/java/net/lopymine/patpat/packet/BasePatPatPacket.java index ccbc46ab..815fbd7a 100644 --- a/src/main/java/net/lopymine/patpat/packet/BasePatPatPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/BasePatPatPacket.java @@ -2,8 +2,8 @@ // Every PatPat packets should extend/implement this interface public interface BasePatPatPacket> -/*? >=1.20.5 {*/extends net.minecraft.network.protocol.common.custom.CustomPacketPayload -/*?} elif >=1.19.4 {*/ /*extends net.fabricmc.fabric.api.networking.v1.FabricPacket *//*?}*/ { +/*? >=1.20.5 || (neoforge && >=1.20.2) {*/extends net.minecraft.network.protocol.common.custom.CustomPacketPayload +/*?} elif >=1.19.4 && fabric {*/ /*extends net.fabricmc.fabric.api.networking.v1.FabricPacket *//*?}*/ { void write(net.minecraft.network.FriendlyByteBuf buf); @@ -14,7 +14,12 @@ public interface BasePatPatPacket> default Type type() { return this.getPatPatType().getPacketId(); } - //?} elif >=1.19.4 { + //?} elif neoforge && >=1.20.2 { + /*@Override + default net.minecraft.resources.Identifier id() { + return this.getPatPatType().getId(); + } + *///?} elif >=1.19.4 && fabric { /*@Override default net.fabricmc.fabric.api.networking.v1.PacketType getType() { return this.getPatPatType().getPacketId(); diff --git a/src/main/java/net/lopymine/patpat/packet/PacketReply.java b/src/main/java/net/lopymine/patpat/packet/PacketReply.java new file mode 100644 index 00000000..0419776a --- /dev/null +++ b/src/main/java/net/lopymine/patpat/packet/PacketReply.java @@ -0,0 +1,16 @@ +package net.lopymine.patpat.packet; + +//? if <=1.19.3 && !forge { +/*import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.Identifier; +*///?} + +public interface PacketReply { + + //? if >=1.19.4 || forge { + void reply(BasePatPatPacket packet); + //?} else { + /*void reply(Identifier id, FriendlyByteBuf buf); + *///?} + +} diff --git a/src/main/java/net/lopymine/patpat/packet/PatPatPacketType.java b/src/main/java/net/lopymine/patpat/packet/PatPatPacketType.java index 0a7d1d3f..a5b1a06c 100644 --- a/src/main/java/net/lopymine/patpat/packet/PatPatPacketType.java +++ b/src/main/java/net/lopymine/patpat/packet/PatPatPacketType.java @@ -1,30 +1,33 @@ package net.lopymine.patpat.packet; +import java.util.function.Function; import lombok.Getter; -import net.minecraft.network.*; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.Identifier; import java.util.function.Function; @Getter public class PatPatPacketType> { private final Function factory; - private final ResourceLocation id; + private final Identifier id; + private final Class clazz; //? >=1.20.5 { private final net.minecraft.network.protocol.common.custom.CustomPacketPayload.Type packetId; private final net.minecraft.network.codec.StreamCodec codec; - //?} elif >=1.19.4 { + //?} elif >=1.19.4 && fabric { /*private final net.fabricmc.fabric.api.networking.v1.PacketType packetId; *///?} - public PatPatPacketType(ResourceLocation id, Function factory) { + public PatPatPacketType(Identifier id, Function factory, Class clazz) { this.id = id; this.factory = factory; + this.clazz = clazz; //? >=1.20.5 { this.packetId = new net.minecraft.network.protocol.common.custom.CustomPacketPayload.Type<>(id); this.codec = net.minecraft.network.protocol.common.custom.CustomPacketPayload.codec(T::write, factory::apply); - //?} elif >=1.19.4 { + //?} elif >=1.19.4 && fabric { /*this.packetId = net.fabricmc.fabric.api.networking.v1.PacketType.create(id, factory); *///?} } diff --git a/src/main/java/net/lopymine/patpat/packet/PingPatPacket.java b/src/main/java/net/lopymine/patpat/packet/PingPatPacket.java index af2ede80..e579c221 100644 --- a/src/main/java/net/lopymine/patpat/packet/PingPatPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/PingPatPacket.java @@ -1,15 +1,13 @@ package net.lopymine.patpat.packet; -import net.fabricmc.fabric.api.networking.v1.PacketSender; - import org.jetbrains.annotations.Nullable; public interface PingPatPacket, A extends PongPatPacket> extends BasePatPatPacket { - void setPacketSender(PacketSender sender); + void setPacketReply(PacketReply reply); @Nullable - PacketSender getSender(); + PacketReply getPacketReply(); A getPongPacket(); diff --git a/src/main/java/net/lopymine/patpat/packet/PongPatPacket.java b/src/main/java/net/lopymine/patpat/packet/PongPatPacket.java index 8816d488..ee708fb9 100644 --- a/src/main/java/net/lopymine/patpat/packet/PongPatPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/PongPatPacket.java @@ -1,35 +1,38 @@ package net.lopymine.patpat.packet; -import net.fabricmc.fabric.api.networking.v1.PacketSender; - import org.jetbrains.annotations.Nullable; +//? if <=1.19.3 && !forge { +/*import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.Identifier; +*///?} + public interface PongPatPacket> extends BasePatPatPacket { - T setPacketSender(PacketSender sender); + void setPacketReply(PacketReply sender); @Nullable - PacketSender getSender(); + PacketReply getPacketReply(); default boolean canPong() { - return this.getSender() != null; + return this.getPacketReply() != null; } - //? if >=1.19.4 { + //? if >=1.19.4 || forge { default void pong(BasePatPatPacket packet) { - PacketSender sender = this.getSender(); - if (sender == null) { + PacketReply reply = this.getPacketReply(); + if (reply == null) { return; } - sender.sendPacket(packet); + reply.reply(packet); } //?} else { - /*default void pong(net.minecraft.resources.ResourceLocation id, net.minecraft.network.FriendlyByteBuf buf) { - PacketSender sender = this.getSender(); - if (sender == null) { + /*default void pong(Identifier id, FriendlyByteBuf buf) { + PacketReply reply = this.getPacketReply(); + if (reply == null) { return; } - sender.sendPacket(id, buf); + reply.reply(id, buf); } *///?} diff --git a/src/main/java/net/lopymine/patpat/packet/c2s/HelloPatPatServerC2SPacket.java b/src/main/java/net/lopymine/patpat/packet/c2s/HelloPatPatServerC2SPacket.java index b6a43731..d6126e8d 100644 --- a/src/main/java/net/lopymine/patpat/packet/c2s/HelloPatPatServerC2SPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/c2s/HelloPatPatServerC2SPacket.java @@ -1,24 +1,23 @@ package net.lopymine.patpat.packet.c2s; -import lombok.Getter; +import lombok.*; import net.lopymine.patpat.PatPat; import net.lopymine.patpat.common.Version; import net.lopymine.patpat.packet.*; -import net.lopymine.patpat.utils.IdentifierUtils; +import net.lopymine.patpat.utils.RLUtils; import net.minecraft.network.FriendlyByteBuf; -import net.fabricmc.fabric.api.networking.v1.PacketSender; - @Getter public class HelloPatPatServerC2SPacket implements PongPatPacket { public static final String PACKET_ID = "hello_patpat_server_c2s_packet"; - public static final PatPatPacketType TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), HelloPatPatServerC2SPacket::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), HelloPatPatServerC2SPacket::new, HelloPatPatServerC2SPacket.class); private final Version version; - private PacketSender sender; + @Setter + private PacketReply packetReply; public HelloPatPatServerC2SPacket() { this.version = Version.CURRENT_MOD_VERSION; @@ -37,12 +36,6 @@ private static Version readVersion(FriendlyByteBuf buf){ } } - @Override - public HelloPatPatServerC2SPacket setPacketSender(PacketSender sender) { - this.sender = sender; - return this; - } - @Override public void write(FriendlyByteBuf buf) { buf.writeByte(this.version.major()); diff --git a/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacket.java b/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacket.java index 3437a9d9..d1226203 100644 --- a/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacket.java @@ -1,13 +1,12 @@ package net.lopymine.patpat.packet.c2s; +import java.util.UUID; import lombok.Getter; -import net.minecraft.network.*; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.RLUtils; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.lopymine.patpat.packet.*; -import net.lopymine.patpat.utils.IdentifierUtils; - -import java.util.UUID; import org.jetbrains.annotations.Nullable; @Getter @@ -15,7 +14,7 @@ public class PatEntityC2SPacket implements C2SPatPacket { public static final String PACKET_ID = "pat_entity_c2s_packet"; - public static final PatPatPacketType TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), PatEntityC2SPacket::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), PatEntityC2SPacket::new, PatEntityC2SPacket.class); private final UUID pattedEntityUuid; diff --git a/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacketV2.java b/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacketV2.java index d454ba23..ef707db4 100644 --- a/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacketV2.java +++ b/src/main/java/net/lopymine/patpat/packet/c2s/PatEntityC2SPacketV2.java @@ -2,13 +2,12 @@ import lombok.Getter; import lombok.experimental.ExtensionMethod; -import net.minecraft.network.*; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; import net.lopymine.patpat.extension.EntityExtension; import net.lopymine.patpat.packet.*; -import net.lopymine.patpat.utils.IdentifierUtils; - +import net.lopymine.patpat.utils.RLUtils; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; @Getter @@ -17,7 +16,7 @@ public class PatEntityC2SPacketV2 implements C2SPatPacket public static final String PACKET_ID = "pat_entity_c2s_packet_v2"; - public static final PatPatPacketType TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), PatEntityC2SPacketV2::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), PatEntityC2SPacketV2::new, PatEntityC2SPacketV2.class); private final int pattedEntityId; diff --git a/src/main/java/net/lopymine/patpat/packet/s2c/HelloPatPatPlayerS2CPacket.java b/src/main/java/net/lopymine/patpat/packet/s2c/HelloPatPatPlayerS2CPacket.java index 22675d25..795e4a70 100644 --- a/src/main/java/net/lopymine/patpat/packet/s2c/HelloPatPatPlayerS2CPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/s2c/HelloPatPatPlayerS2CPacket.java @@ -1,26 +1,24 @@ package net.lopymine.patpat.packet.s2c; -import lombok.Getter; -import net.minecraft.network.*; - -import net.fabricmc.fabric.api.networking.v1.PacketSender; - +import lombok.*; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.Version; import net.lopymine.patpat.packet.*; import net.lopymine.patpat.packet.c2s.HelloPatPatServerC2SPacket; -import net.lopymine.patpat.utils.IdentifierUtils; +import net.lopymine.patpat.utils.RLUtils; +import net.minecraft.network.FriendlyByteBuf; @Getter public class HelloPatPatPlayerS2CPacket implements PingPatPacket { public static final String PACKET_ID = "hello_patpat_player_s2c_packet"; - public static final PatPatPacketType TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), HelloPatPatPlayerS2CPacket::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), HelloPatPatPlayerS2CPacket::new, HelloPatPatPlayerS2CPacket.class); private final Version version; - private PacketSender sender; + @Setter + private PacketReply packetReply; public HelloPatPatPlayerS2CPacket() { this.version = Version.CURRENT_MOD_VERSION; @@ -41,12 +39,9 @@ private static Version readVersion(FriendlyByteBuf buf){ @Override public HelloPatPatServerC2SPacket getPongPacket() { - return new HelloPatPatServerC2SPacket().setPacketSender(this.sender); - } - - @Override - public void setPacketSender(PacketSender sender) { - this.sender = sender; + HelloPatPatServerC2SPacket packet = new HelloPatPatServerC2SPacket(); + packet.setPacketReply(this.packetReply); + return packet; } @Override diff --git a/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacket.java b/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacket.java index 33f211a3..03040959 100644 --- a/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacket.java @@ -1,13 +1,12 @@ package net.lopymine.patpat.packet.s2c; +import java.util.UUID; import lombok.Getter; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.*; -import net.minecraft.world.entity.Entity; import net.lopymine.patpat.packet.*; import net.lopymine.patpat.utils.*; - -import java.util.UUID; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; @Getter @@ -15,7 +14,7 @@ public class PatEntityS2CPacket implements S2CPatPacket { public static final String PACKET_ID = "pat_entity_s2c_packet"; - public static final PatPatPacketType TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), PatEntityS2CPacket::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), PatEntityS2CPacket::new, PatEntityS2CPacket.class); private final UUID pattedEntityUuid; private final UUID whoPattedUuid; diff --git a/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacketV2.java b/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacketV2.java index 9d31bda8..dbb853fb 100644 --- a/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacketV2.java +++ b/src/main/java/net/lopymine/patpat/packet/s2c/PatEntityS2CPacketV2.java @@ -2,13 +2,12 @@ import lombok.*; import lombok.experimental.ExtensionMethod; +import net.lopymine.patpat.extension.EntityExtension; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.RLUtils; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.*; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; -import net.lopymine.patpat.packet.*; -import net.lopymine.patpat.extension.EntityExtension; -import net.lopymine.patpat.utils.IdentifierUtils; - import org.jetbrains.annotations.Nullable; @Getter @@ -18,7 +17,7 @@ public class PatEntityS2CPacketV2 implements S2CPatPacket public static final String PACKET_ID = "pat_entity_s2c_packet_v2"; - public static final PatPatPacketType TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), PatEntityS2CPacketV2::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), PatEntityS2CPacketV2::new, PatEntityS2CPacketV2.class); private final int pattedEntityId; private final int whoPattedId; diff --git a/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacket.java b/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacket.java index b3e0dc2c..cf6fd92e 100644 --- a/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacket.java +++ b/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacket.java @@ -1,13 +1,12 @@ package net.lopymine.patpat.packet.s2c; +import java.util.UUID; import lombok.Getter; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.*; -import net.minecraft.world.entity.Entity; import net.lopymine.patpat.packet.*; import net.lopymine.patpat.utils.*; - -import java.util.UUID; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; @Getter @@ -15,7 +14,7 @@ public class SelfPatEntityS2CPacket implements S2CPatPacket TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), SelfPatEntityS2CPacket::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), SelfPatEntityS2CPacket::new, SelfPatEntityS2CPacket.class); private final UUID pattedEntityUuid; private final UUID whoPattedUuid; diff --git a/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacketV2.java b/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacketV2.java index e77a5397..dcc6f694 100644 --- a/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacketV2.java +++ b/src/main/java/net/lopymine/patpat/packet/s2c/SelfPatEntityS2CPacketV2.java @@ -1,12 +1,11 @@ package net.lopymine.patpat.packet.s2c; import lombok.Getter; +import net.lopymine.patpat.packet.*; +import net.lopymine.patpat.utils.RLUtils; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.*; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; -import net.lopymine.patpat.packet.*; -import net.lopymine.patpat.utils.*; - import org.jetbrains.annotations.Nullable; @Getter @@ -14,7 +13,7 @@ public class SelfPatEntityS2CPacketV2 implements S2CPatPacket TYPE = new PatPatPacketType<>(IdentifierUtils.modId(PACKET_ID), SelfPatEntityS2CPacketV2::new); + public static final PatPatPacketType TYPE = new PatPatPacketType<>(RLUtils.modId(PACKET_ID), SelfPatEntityS2CPacketV2::new, SelfPatEntityS2CPacketV2.class); private final int pattedEntityId; private final int whoPattedId; diff --git a/src/main/java/net/lopymine/patpat/server/command/PatPatServerCommandManager.java b/src/main/java/net/lopymine/patpat/server/command/PatPatServerCommandManager.java index 18262bcd..486eae03 100644 --- a/src/main/java/net/lopymine/patpat/server/command/PatPatServerCommandManager.java +++ b/src/main/java/net/lopymine/patpat/server/command/PatPatServerCommandManager.java @@ -1,28 +1,25 @@ package net.lopymine.patpat.server.command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import java.util.function.Predicate; import lombok.experimental.ExtensionMethod; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; - import net.lopymine.patpat.*; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; import net.lopymine.patpat.extension.*; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.server.command.info.PatPatServerInfoCommand; import net.lopymine.patpat.server.command.list.*; import net.lopymine.patpat.server.command.ratelimit.*; import net.lopymine.patpat.server.command.reload.PatPatServerConfigReloadCommand; +import net.lopymine.patpat.server.config.PatPatServerConfig; import net.lopymine.patpat.server.ratelimit.PatPatServerRateLimitManager; import net.lopymine.patpat.utils.TextUtils; +import net.minecraft.commands.*; import net.minecraft.network.chat.MutableComponent; import static net.minecraft.commands.Commands.literal; -//? >=1.19 { -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -//?} else { -/*import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; - *///?} - - @ExtensionMethod({TextExtension.class, CommandExtension.class}) public class PatPatServerCommandManager { @@ -35,20 +32,23 @@ private PatPatServerCommandManager() { } public static void register() { - ServerLifecycleEvents.SERVER_STARTED.register(server -> PatPatServerRateLimitManager.runTask()); - ServerLifecycleEvents.SERVER_STOPPING.register(server -> PatPatServerRateLimitManager.stopTask()); - - CommandRegistrationCallback.EVENT.register((/*? >=1.19 {*/(dispatcher, registryAccess, environment)/*?} else {*//*(dispatcher, dedicated)*//*?}*/ -> { - dispatcher.register(literal("patpat") - .then(PatPatServerInfoCommand.get()) - .then(PatPatServerListCommand.get()) - .then(PatPatServerRateLimitCommand.get()) - .then(PatPatServerConfigReloadCommand.get()) - ); - })); + ServerMultiLoader.getInstance().registerOnServerStart(PatPatServerRateLimitManager::runTask); + ServerMultiLoader.getInstance().registerOnServerStop(PatPatServerRateLimitManager::stopTask); + + ServerMultiLoader.getInstance().registerServerCommands((dispatcher) -> dispatcher.register( + literal("patpat") + .then(PatPatServerInfoCommand.get()) + .then(PatPatServerListCommand.get()) + .then(PatPatServerRateLimitCommand.get()) + .then(PatPatServerConfigReloadCommand.get())) + ); + + ServerMultiLoader.getInstance().registerPermission(PatPatServerConfig.getInstance().getRateLimitConfig().getPermissionBypass()); } - public static String getPermission(String permission) { - return "%s.%s".formatted(PatPat.MOD_ID, permission); + public static Predicate permission(String permission) { + String id = "%s.command.%s".formatted(PatPat.MOD_ID, permission); + ServerMultiLoader.getInstance().registerPermission("command." + permission); + return (context) -> context.hasPatPatPermission(id); } } diff --git a/src/main/java/net/lopymine/patpat/server/command/info/PatPatServerInfoCommand.java b/src/main/java/net/lopymine/patpat/server/command/info/PatPatServerInfoCommand.java index 81f62974..a27a19f5 100644 --- a/src/main/java/net/lopymine/patpat/server/command/info/PatPatServerInfoCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/info/PatPatServerInfoCommand.java @@ -6,6 +6,7 @@ import com.mojang.brigadier.context.CommandContext; import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.entrypoint.EarlyCommonMultiLoader; import net.lopymine.patpat.extension.CommandExtension; import net.lopymine.patpat.utils.*; @@ -14,34 +15,35 @@ import net.minecraft.network.chat.*; import net.minecraft.network.chat.ClickEvent.Action; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) public class PatPatServerInfoCommand { - public static final String PLATFORM = "Fabric/Server"; - private PatPatServerInfoCommand() { throw new IllegalStateException("Command class"); } public static LiteralArgumentBuilder get() { return literal("info") - .requires(context -> context.hasPatPatPermission("info")) + .requires(permission("info")) .executes(PatPatServerInfoCommand::version); } public static int version(CommandContext context) { + String platform = EarlyCommonMultiLoader.getInstance().getFullPlatform(); + String version = PatPat.MOD_VERSION + "+" + PatPat.BUILD_CODE_TIME; String minecraftVersion = SharedConstants.getCurrentVersion()./*? if >=1.21.6 {*/name/*?} else {*/ /*getName *//*?}*/(); String debugInformation = "Platform: %s%nMinecraft: %s%nVersion: %s" - .formatted(PLATFORM, minecraftVersion, version); + .formatted(platform, minecraftVersion, version); Style style = Style.EMPTY .withClickEvent(CommandText.getClickEvent(Action.COPY_TO_CLIPBOARD, debugInformation)) .withHoverEvent(CommandText.getHoverEvent(HoverEvent.Action.SHOW_TEXT, CommandText.text("info.copy").finish())); - MutableComponent platformText = CommandText.goldenArgs("info.platform", PLATFORM) + MutableComponent platformText = CommandText.goldenArgs("info.platform", platform) .finish() .withStyle(style); diff --git a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListChangeCommand.java b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListChangeCommand.java index 9e48960f..35750cd0 100644 --- a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListChangeCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListChangeCommand.java @@ -7,7 +7,7 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.lopymine.patpat.common.command.list.PatPatCommonListChangeCommand; +import net.lopymine.patpat.common.command.PatPatCommonListChangeCommand; import net.lopymine.patpat.extension.*; import net.lopymine.patpat.server.config.list.PatPatServerPlayerListConfig; @@ -21,6 +21,7 @@ /*?}*/ import static net.minecraft.commands.Commands.argument; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod({TextExtension.class, CommandExtension.class}) @@ -34,7 +35,7 @@ private PatPatServerListChangeCommand() { public static LiteralArgumentBuilder getRemove() { return literal("remove") - .requires(context -> context.hasPatPatPermission("list.remove")) + .requires(permission("list.remove")) .then(argument(PROFILE_KEY, GameProfileArgument.gameProfile()) .suggests((context, builder) -> SharedSuggestionProvider.suggest(context.getSource().getOnlinePlayerNames(), builder)) .executes(PatPatServerListChangeCommand::remove)); @@ -42,7 +43,7 @@ public static LiteralArgumentBuilder getRemove() { public static LiteralArgumentBuilder getAdd() { return literal("add") - .requires(context -> context.hasPatPatPermission("list.add")) + .requires(permission("list.add")) .then(argument(PROFILE_KEY, GameProfileArgument.gameProfile()) .suggests(((context, builder) -> SharedSuggestionProvider.suggest(context.getSource().getOnlinePlayerNames(), builder))) .executes(PatPatServerListChangeCommand::add)); diff --git a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListCommand.java b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListCommand.java index 1e092cb1..1ffba052 100644 --- a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListCommand.java @@ -6,6 +6,7 @@ import net.lopymine.patpat.extension.*; import net.minecraft.commands.CommandSourceStack; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -17,7 +18,7 @@ private PatPatServerListCommand() { public static LiteralArgumentBuilder get() { return literal("list") - .requires(context -> context.hasPatPatPermission("list")) + .requires(permission("list")) .then(PatPatServerListInfoCommand.get()) .then(PatPatServerListSetModeCommand.get()) .then(PatPatServerListChangeCommand.getAdd()) diff --git a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListInfoCommand.java b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListInfoCommand.java index ced768a1..5ced5dd0 100644 --- a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListInfoCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListInfoCommand.java @@ -7,13 +7,14 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import net.lopymine.patpat.common.command.list.PatPatCommonListChangeCommand; +import net.lopymine.patpat.common.command.PatPatCommonListChangeCommand; import net.lopymine.patpat.extension.*; import net.lopymine.patpat.server.config.PatPatServerConfig; import net.lopymine.patpat.server.config.list.PatPatServerPlayerListConfig; import java.util.*; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @@ -26,7 +27,7 @@ private PatPatServerListInfoCommand() { public static LiteralArgumentBuilder get() { return literal("info") - .requires(context -> context.hasPatPatPermission("list.info")) + .requires(permission("list.info")) .executes(PatPatServerListInfoCommand::onInfo); } diff --git a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListSetModeCommand.java b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListSetModeCommand.java index 42b667fd..3327df4f 100644 --- a/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListSetModeCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/list/PatPatServerListSetModeCommand.java @@ -18,6 +18,7 @@ import java.util.*; import static net.minecraft.commands.Commands.argument; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod({TextExtension.class, CommandExtension.class}) @@ -29,7 +30,7 @@ private PatPatServerListSetModeCommand() { public static LiteralArgumentBuilder get() { return literal("set") - .requires(context -> context.hasPatPatPermission("list.set")) + .requires(permission("list.set")) .then(argument("mode", StringArgumentType.word()) .suggests(((context, builder) -> SharedSuggestionProvider.suggest(List.of("WHITELIST", "BLACKLIST", "DISABLED"), builder))) .executes(PatPatServerListSetModeCommand::setListMode)); diff --git a/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitCommand.java b/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitCommand.java index 6fe66fbb..e1300ee6 100644 --- a/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitCommand.java @@ -7,6 +7,7 @@ import net.lopymine.patpat.server.command.ratelimit.set.*; import net.minecraft.commands.CommandSourceStack; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -18,7 +19,7 @@ private PatPatServerRateLimitCommand() { public static LiteralArgumentBuilder get() { return literal("ratelimit") - .requires(context -> context.hasPatPatPermission("ratelimit")) + .requires(permission("ratelimit")) .then(PatPatServerRateLimitInfoCommand.get()) .then(PatPatServerRateLimitSetCommand.get()) .then(PatPatServerRateLimitToggleCommand.getEnable()) diff --git a/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitInfoCommand.java b/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitInfoCommand.java index f407fe4e..c9d39651 100644 --- a/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitInfoCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitInfoCommand.java @@ -1,7 +1,7 @@ package net.lopymine.patpat.server.command.ratelimit; -import lombok.experimental.ExtensionMethod; import com.mojang.authlib.GameProfile; +import lombok.experimental.ExtensionMethod; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; @@ -11,8 +11,8 @@ import net.lopymine.patpat.server.config.sub.PatPatServerRateLimitConfig; import net.lopymine.patpat.server.ratelimit.PatPatServerRateLimitManager; import net.lopymine.patpat.server.config.*; +import net.lopymine.patpat.translation.PatTranslation; import net.lopymine.patpat.utils.*; -import net.lopymine.patpat.*; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; @@ -27,6 +27,7 @@ /*?}*/ import static net.minecraft.commands.Commands.argument; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod({CommandExtension.class, PlayerExtension.class, GameProfileExtension.class}) @@ -40,7 +41,7 @@ private PatPatServerRateLimitInfoCommand() { public static LiteralArgumentBuilder get() { return literal("info") - .requires(context -> context.hasPatPatPermission("ratelimit.info")) + .requires(permission("ratelimit.info")) .executes(PatPatServerRateLimitInfoCommand::info) .then(argument(PROFILE_KEY, GameProfileArgument.gameProfile()) .suggests((context, builder) -> SharedSuggestionProvider.suggest(context.getSource().getOnlinePlayerNames(), builder)) @@ -97,7 +98,7 @@ public static int infoWithUser(CommandContext context) throw } int availablePats = PatPatServerRateLimitManager.getAvailablePats(profile.getUUID()); - profile.hasPermission(config.getPermissionBypass(), context).thenAcceptAsync(result -> { + profile.hasPermission(context.getSource().getServer(), config.getPermissionBypass()).thenAcceptAsync(result -> { Object arg = result ? CommandText.text("ratelimit.info.tokens.bypass").finish().withStyle(ChatFormatting.GOLD) : diff --git a/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitToggleCommand.java b/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitToggleCommand.java index 0f19c9ca..2e23f3f1 100644 --- a/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitToggleCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/ratelimit/PatPatServerRateLimitToggleCommand.java @@ -15,6 +15,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.*; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -26,13 +27,13 @@ private PatPatServerRateLimitToggleCommand() { public static LiteralArgumentBuilder getEnable() { return literal("enable") - .requires(context -> context.hasPatPatPermission("ratelimit.toggle")) + .requires(permission("ratelimit.toggle")) .executes(PatPatServerRateLimitToggleCommand::enable); } public static LiteralArgumentBuilder getDisable() { return literal("disable") - .requires(context -> context.hasPatPatPermission("ratelimit.toggle")) + .requires(permission("ratelimit.toggle")) .executes(PatPatServerRateLimitToggleCommand::disable); } diff --git a/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIncrementCommand.java b/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIncrementCommand.java index 3f9328f4..403425b8 100644 --- a/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIncrementCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIncrementCommand.java @@ -16,6 +16,7 @@ import static net.lopymine.patpat.server.command.ratelimit.set.PatPatServerRateLimitSetCommand.VALUE_KEY; import static net.minecraft.commands.Commands.argument; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -27,7 +28,7 @@ private PatPatServerRateLimitIncrementCommand() { public static LiteralArgumentBuilder get() { return literal("increment") - .requires(context -> context.hasPatPatPermission("ratelimit.set.increment")) + .requires(permission("ratelimit.set.increment")) .then(argument(VALUE_KEY, IntegerArgumentType.integer(1)) .executes(PatPatServerRateLimitIncrementCommand::set)); } diff --git a/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIntervalCommand.java b/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIntervalCommand.java index 4d5ac968..a72b0e01 100644 --- a/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIntervalCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitIntervalCommand.java @@ -19,6 +19,7 @@ import static net.lopymine.patpat.server.command.ratelimit.set.PatPatServerRateLimitSetCommand.VALUE_KEY; import static net.minecraft.commands.Commands.argument; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -32,7 +33,7 @@ private PatPatServerRateLimitIntervalCommand() { public static LiteralArgumentBuilder get() { return literal("interval") - .requires(context -> context.hasPatPatPermission("ratelimit.set.interval")) + .requires(permission("ratelimit.set.interval")) .then(argument(VALUE_KEY, StringArgumentType.word()) .executes(PatPatServerRateLimitIntervalCommand::set)); } diff --git a/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitLimitCommand.java b/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitLimitCommand.java index 05621ae7..47ad74a6 100644 --- a/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitLimitCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/ratelimit/set/PatPatServerRateLimitLimitCommand.java @@ -16,6 +16,7 @@ import static net.lopymine.patpat.server.command.ratelimit.set.PatPatServerRateLimitSetCommand.VALUE_KEY; import static net.minecraft.commands.Commands.argument; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -27,7 +28,7 @@ private PatPatServerRateLimitLimitCommand() { public static LiteralArgumentBuilder get() { return literal("limit") - .requires(context -> context.hasPatPatPermission("ratelimit.set.limit")) + .requires(permission("ratelimit.set.limit")) .then(argument(VALUE_KEY, IntegerArgumentType.integer(1)) .executes(PatPatServerRateLimitLimitCommand::set)); } diff --git a/src/main/java/net/lopymine/patpat/server/command/reload/PatPatServerConfigReloadCommand.java b/src/main/java/net/lopymine/patpat/server/command/reload/PatPatServerConfigReloadCommand.java index fd9d1dad..e904de58 100644 --- a/src/main/java/net/lopymine/patpat/server/command/reload/PatPatServerConfigReloadCommand.java +++ b/src/main/java/net/lopymine/patpat/server/command/reload/PatPatServerConfigReloadCommand.java @@ -12,6 +12,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; +import static net.lopymine.patpat.server.command.PatPatServerCommandManager.permission; import static net.minecraft.commands.Commands.literal; @ExtensionMethod(CommandExtension.class) @@ -23,7 +24,7 @@ private PatPatServerConfigReloadCommand() { public static LiteralArgumentBuilder get() { return literal("reload") - .requires(context -> context.hasPatPatPermission("reload")) + .requires(permission("reload")) .executes(PatPatServerConfigReloadCommand::reload); } diff --git a/src/main/java/net/lopymine/patpat/server/config/PatPatServerConfig.java b/src/main/java/net/lopymine/patpat/server/config/PatPatServerConfig.java index b61942f2..13e07d5c 100644 --- a/src/main/java/net/lopymine/patpat/server/config/PatPatServerConfig.java +++ b/src/main/java/net/lopymine/patpat/server/config/PatPatServerConfig.java @@ -10,6 +10,7 @@ import net.lopymine.patpat.client.config.resourcepack.*; import net.lopymine.patpat.common.Version; import net.lopymine.patpat.common.config.*; +import net.lopymine.patpat.logger.PatLogger; import net.lopymine.patpat.server.config.sub.PatPatServerRateLimitConfig; import net.lopymine.patpat.utils.*; diff --git a/src/main/java/net/lopymine/patpat/server/config/list/PatPatServerPlayerListConfig.java b/src/main/java/net/lopymine/patpat/server/config/list/PatPatServerPlayerListConfig.java index 73e7c357..66ea2dea 100644 --- a/src/main/java/net/lopymine/patpat/server/config/list/PatPatServerPlayerListConfig.java +++ b/src/main/java/net/lopymine/patpat/server/config/list/PatPatServerPlayerListConfig.java @@ -2,13 +2,13 @@ import lombok.Getter; -import net.lopymine.patpat.*; import net.lopymine.patpat.client.PatPatClient; import net.lopymine.patpat.common.config.PatPatConfigManager; import net.lopymine.patpat.common.config.list.*; import java.io.*; import java.util.*; +import net.lopymine.patpat.logger.PatLogger; @Getter public class PatPatServerPlayerListConfig extends AbstractPatPatPlayerListConfig { diff --git a/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateManager.java b/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateManager.java index 037fe67d..c2cafbdf 100644 --- a/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateManager.java +++ b/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateManager.java @@ -2,7 +2,7 @@ import net.lopymine.patpat.*; import net.lopymine.patpat.common.Version; -import net.lopymine.patpat.common.migrate.*; +import net.lopymine.patpat.common.config.migrate.*; import net.lopymine.patpat.server.config.PatPatServerConfig; public class PatPatServerConfigMigrateManager extends AbstractPatPatConfigMigrateManager { diff --git a/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateVersion0.java b/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateVersion0.java index 504c1e07..20ca3526 100644 --- a/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateVersion0.java +++ b/src/main/java/net/lopymine/patpat/server/config/migrate/PatPatServerConfigMigrateVersion0.java @@ -6,7 +6,7 @@ import net.lopymine.patpat.*; import net.lopymine.patpat.client.config.resourcepack.ListMode; -import net.lopymine.patpat.common.migrate.AbstractConfigMigrateHandler; +import net.lopymine.patpat.common.config.migrate.AbstractConfigMigrateHandler; import net.lopymine.patpat.server.config.*; import net.lopymine.patpat.server.config.list.PatPatServerPlayerListConfig; diff --git a/src/main/java/net/lopymine/patpat/server/event/PatPatServerPlayerEvents.java b/src/main/java/net/lopymine/patpat/server/event/PatPatServerPlayerEvents.java index 8d25eeac..e2b463e6 100644 --- a/src/main/java/net/lopymine/patpat/server/event/PatPatServerPlayerEvents.java +++ b/src/main/java/net/lopymine/patpat/server/event/PatPatServerPlayerEvents.java @@ -1,11 +1,9 @@ package net.lopymine.patpat.server.event; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; - -import net.lopymine.patpat.PatPat; +import net.lopymine.patpat.*; import net.lopymine.patpat.common.Version; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; import net.lopymine.patpat.packet.s2c.HelloPatPatPlayerS2CPacket; -import net.lopymine.patpat.server.packet.PatPatServerNetworkManager; import net.lopymine.patpat.server.packet.PatPatServerPacketManager; import net.minecraft.server.level.ServerPlayer; @@ -17,15 +15,19 @@ private PatPatServerPlayerEvents() { } public static void register() { - ServerPlayConnectionEvents.INIT.register((handler, server) -> { ServerPlayer player = /*? if >=1.21 {*/ handler.getPlayer() /*?} else {*/ /*handler.player *//*?}*/; - PatPatServerPacketManager.PLAYER_VERSIONS.put(player.getUUID(), Version.PACKET_V1_VERSION); - PatPat.LOGGER.debug("Player {} just joined, sending hello packet...", player.getName().getString()); - PatPatServerNetworkManager.sendPacketToPlayer(player, new HelloPatPatPlayerS2CPacket()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { ServerPlayer player = /*? if >=1.21 {*/ handler.getPlayer() /*?} else {*/ /*handler.player *//*?}*/; - PatPatServerPacketManager.PLAYER_VERSIONS.remove(player.getUUID()); - PatPat.LOGGER.debug("Player {} disconnected!", player.getName().getString()); + ServerMultiLoader.getInstance().registerServerPlayerLogListener((loggedIn, player) -> { + if (loggedIn) { + if(!(player instanceof ServerPlayer serverPlayer)){ + PatPat.LOGGER.warn("Not instance of ServerPlayer"); + return; + } + PatPatServerPacketManager.PLAYER_VERSIONS.put(player.getUUID(), Version.PACKET_V1_VERSION); + PatPat.LOGGER.debug("Player {} just joined, sending hello packet...", player.getName().getString()); + ServerMultiLoader.getInstance().sendPacketToPlayer(serverPlayer, new HelloPatPatPlayerS2CPacket()); + } else { + PatPatServerPacketManager.PLAYER_VERSIONS.remove(player.getUUID()); + PatPat.LOGGER.debug("Player {} disconnected!", player.getName().getString()); + } }); } diff --git a/src/main/java/net/lopymine/patpat/server/packet/PatPatServerNetworkManager.java b/src/main/java/net/lopymine/patpat/server/packet/PatPatServerNetworkManager.java index eb1472e0..e69de29b 100644 --- a/src/main/java/net/lopymine/patpat/server/packet/PatPatServerNetworkManager.java +++ b/src/main/java/net/lopymine/patpat/server/packet/PatPatServerNetworkManager.java @@ -1,48 +0,0 @@ -package net.lopymine.patpat.server.packet; - -import net.fabricmc.fabric.api.networking.v1.*; - -import net.lopymine.patpat.packet.*; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; - -public class PatPatServerNetworkManager { - - public static > void registerReceiver(PatPatPacketType id, PacketListener listener) { - ServerPlayNetworking.registerGlobalReceiver(/*? if >=1.19.4 {*/ id.getPacketId(), /*?} else {*/ /*id.getId(), *//*?}*/ - /*? >=1.20.5 {*/(packet, context) -> { ServerPlayer sender = context.player(); PacketSender responseSender = context.responseSender(); /*?} elif <=1.20.4 && >=1.19.4 {*//*(packet, sender, responseSender) -> {*//*?} else {*//*(server, sender, networkHandler, buf, responseSender) -> { T packet = id.getFactory().apply(buf); *//*?}*/ - if (packet instanceof PingPatPacket pingPacket) { - pingPacket.setPacketSender(responseSender); - } - listener.call(sender, packet); - }); - } - - public static void sendPacketToPlayer(ServerPlayer player, BasePatPatPacket packet) { - //? if <1.19.4 { - /*ResourceLocation id = packet.getPatPatType().getId(); - FriendlyByteBuf buf = PacketByteBufs.create(); - packet.write(buf); - *///?} - if (packet instanceof PongPatPacket pingPong && pingPong.canPong()) { - //? if >=1.19.4 { - pingPong.pong(packet); - //?} else { - /*pingPong.pong(id, buf); - *///?} - } else { - //? if >=1.19.4 { - ServerPlayNetworking.send(player, packet); - //?} else { - /*ServerPlayNetworking.send(player, id, buf); - *///?} - } - } - - public interface PacketListener { - void call(ServerPlayer sender, T packet); - } - -} diff --git a/src/main/java/net/lopymine/patpat/server/packet/PatPatServerPacketManager.java b/src/main/java/net/lopymine/patpat/server/packet/PatPatServerPacketManager.java index 3669c0a1..d25c6015 100644 --- a/src/main/java/net/lopymine/patpat/server/packet/PatPatServerPacketManager.java +++ b/src/main/java/net/lopymine/patpat/server/packet/PatPatServerPacketManager.java @@ -1,13 +1,16 @@ package net.lopymine.patpat.server.packet; import net.lopymine.patpat.*; +import net.lopymine.patpat.entrypoint.ServerMultiLoader; +import net.lopymine.patpat.entrypoint.loader.server.IServerModLoader.ServerPacketRegister; +import net.lopymine.patpat.entrypoint.loader.server.IServerModLoader.ServerPacketRegister.PacketRegistrationSide; +import net.lopymine.patpat.logger.PatLogger; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.ChunkPos; -import net.fabricmc.fabric.api.networking.v1.*; +import net.minecraft.world.level.*; import net.lopymine.patpat.common.Version; import net.lopymine.patpat.packet.*; @@ -25,20 +28,29 @@ private PatPatServerPacketManager() { } public static final PatLogger LOGGER = PatPat.LOGGER.extend("PacketManager"); - + public static final Map PLAYER_VERSIONS = new HashMap<>(); private static final List> PACKET_TESTS = new ArrayList<>(); - public static void register() { + public static void register(ServerPacketRegister register) { PACKET_TESTS.clear(); PACKET_TESTS.add(PatPatServerListManager::canPat); PACKET_TESTS.add(PatPatServerRateLimitManager::canPat); - PatPatServerPacketManager.registerPackets(); - PatPatServerNetworkManager.registerReceiver(PatEntityC2SPacket.TYPE, PatPatServerPacketManager::handlePacket); - PatPatServerNetworkManager.registerReceiver(PatEntityC2SPacketV2.TYPE, PatPatServerPacketManager::handlePacket); - PatPatServerNetworkManager.registerReceiver(HelloPatPatServerC2SPacket.TYPE, PatPatServerPacketManager::handleHelloPacket); + // Hello packets + register.register(HelloPatPatServerC2SPacket.TYPE, PacketRegistrationSide.C2S, PatPatServerPacketManager::handleHelloPacket); + register.register(HelloPatPatPlayerS2CPacket.TYPE, PacketRegistrationSide.S2C, (player, packet) -> {}); + + // Pat packets V2 + register.register(PatEntityC2SPacketV2.TYPE, PacketRegistrationSide.C2S, PatPatServerPacketManager::handlePacket); + register.register(PatEntityS2CPacketV2.TYPE, PacketRegistrationSide.S2C, (player, packet) -> {}); + register.register(SelfPatEntityS2CPacketV2.TYPE, PacketRegistrationSide.S2C, (player, packet) -> {}); + + // Pat packets V1 + register.register(PatEntityC2SPacket.TYPE, PacketRegistrationSide.C2S, PatPatServerPacketManager::handlePacket); + register.register(PatEntityS2CPacket.TYPE, PacketRegistrationSide.S2C, (player, packet) -> {}); + register.register(SelfPatEntityS2CPacket.TYPE, PacketRegistrationSide.S2C, (player, packet) -> {}); } private static void handleHelloPacket(ServerPlayer sender, HelloPatPatServerC2SPacket packet) { @@ -54,6 +66,7 @@ private static void handleHelloPacket(ServerPlayer sender, HelloPatPatServerC2SP PLAYER_VERSIONS.put(sender.getUUID(), version); } + @SuppressWarnings("ConstantConditions") public static void handlePacket(ServerPlayer sender, PatPacket packet) { LOGGER.debug("Received pat packet from {}", sender.getName().getString()); for (Predicate packetTest : PACKET_TESTS) { @@ -62,7 +75,11 @@ public static void handlePacket(ServerPlayer sender, PatPacket p } } - ServerLevel serverWorld = (ServerLevel) sender./*? >=1.20 {*/level()/*?} else {*//*level*//*?}*/; + Level level = sender./*? >=1.20 {*/level()/*?} else {*//*level*//*?}*/; + if (!(level instanceof ServerLevel serverWorld)) { + return; + } + Entity entity = packet.getPattedEntity(serverWorld); if (!(entity instanceof LivingEntity)) { return; @@ -73,43 +90,16 @@ public static void handlePacket(ServerPlayer sender, PatPacket p return; } - ChunkPos chunkPos = /*? >=1.17 {*/entity.chunkPosition()/*?} else {*//*serverWorld.getChunk(entity./^? if >=1.17 {^/ getBlockPos() /^?} else {^//^blockPosition()^//^?}^/).getPos()*//*?}*/; - for (ServerPlayer player : PlayerLookup.tracking(serverWorld, chunkPos)) { + ChunkPos chunkPos = /*? >=1.17 {*/entity.chunkPosition()/*?} else {*//*serverWorld.getChunk(entity.blockPosition()).getPos()*//*?}*/; + for (ServerPlayer player : serverWorld.getChunkSource().chunkMap.getPlayers(chunkPos, false)/*? if <=1.17.1 {*//*.toList() *//*?}*/) { if (player.equals(sender)) { continue; } LOGGER.debug("Sending pat packet to {} from {}", player.getName().getString(), sender.getName().getString()); - PatPatServerNetworkManager.sendPacketToPlayer(player, getPatPacket(entity, player)); + ServerMultiLoader.getInstance().sendPacketToPlayer(player, getPatPacket(entity, player)); } } - private static void registerPackets() { - // Register all packets - //? >=1.20.5 { - registerC2SPacket(HelloPatPatServerC2SPacket.TYPE); - registerS2CPacket(HelloPatPatPlayerS2CPacket.TYPE); - - // v2 - registerC2SPacket(PatEntityC2SPacketV2.TYPE); - registerS2CPacket(PatEntityS2CPacketV2.TYPE); - registerS2CPacket(SelfPatEntityS2CPacketV2.TYPE); - - // v1 - registerC2SPacket(PatEntityC2SPacket.TYPE); - registerS2CPacket(PatEntityS2CPacket.TYPE); - registerS2CPacket(SelfPatEntityS2CPacket.TYPE); - //?} - } - - //? >=1.20.5 { - private static > void registerC2SPacket(PatPatPacketType type) { - PayloadTypeRegistry.playC2S().register(type.getPacketId(), type.getCodec()); - } - private static > void registerS2CPacket(PatPatPacketType type) { - PayloadTypeRegistry.playS2C().register(type.getPacketId(), type.getCodec()); - } - //?} - public static PatPacket getPatPacket(Entity pattedEntity, Entity whoPattedEntity) { if (PLAYER_VERSIONS.get(whoPattedEntity.getUUID()).isGreaterOrEqualThan(Version.PACKET_V2_VERSION)) { LOGGER.debug("Getting pat packet... Using V2 version"); diff --git a/src/main/java/net/lopymine/patpat/tests/PatPatTestAgent.java b/src/main/java/net/lopymine/patpat/tests/PatPatTestAgent.java new file mode 100644 index 00000000..043c1d4c --- /dev/null +++ b/src/main/java/net/lopymine/patpat/tests/PatPatTestAgent.java @@ -0,0 +1,157 @@ +package net.lopymine.patpat.tests; + +import java.io.*; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.concurrent.ConcurrentLinkedQueue; +import lombok.*; +import net.lopymine.patpat.logger.PatLogger; + +public class PatPatTestAgent { + + public static final String PORT_PROPERTY = "patpat.test.port"; + public static final String PORT_FILE = "patpat-test-port.txt"; + public static final PatLogger LOGGER = new PatLogger("PatPat/Test"); + + private static final int PORT = resolvePort(); + + private final ConcurrentLinkedQueue requests = new ConcurrentLinkedQueue<>(); + private final String role; + private Socket socket; + private BufferedWriter writer; + private boolean failed; + @Setter + private Runnable disconnectHandler; + + @Getter + private boolean connected; + + public PatPatTestAgent(String role) { + this.role = role; + } + + public static boolean isEnabled() { + return getPort() != -1; + } + + public static int getPort() { + return PORT; + } + + private static int resolvePort() { + int fromProperty = parsePort(System.getProperty(PORT_PROPERTY)); + if (fromProperty != -1) { + return fromProperty; + } + + Path file = Path.of("").toAbsolutePath().resolve(PORT_FILE); + if (!Files.isRegularFile(file)) { + return -1; + } + try { + return parsePort(Files.readString(file)); + } catch (IOException e) { + return -1; + } + } + + private static int parsePort(String value) { + if (value == null) { + return -1; + } + try { + return Integer.parseInt(value.trim()); + } catch (NumberFormatException e) { + return -1; + } + } + + public void connect(String name) { + if (this.connected || this.failed) { + return; + } + int port = getPort(); + if (port == -1) { + return; + } + try { + this.socket = new Socket("127.0.0.1", port); + this.socket.setTcpNoDelay(true); + this.writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), StandardCharsets.UTF_8)); + this.connected = true; + + Thread reader = new Thread(this::readLoop, "patpat-test-agent-reader"); + reader.setContextClassLoader(PatPatTestAgent.class.getClassLoader()); + reader.setDaemon(true); + reader.start(); + + this.send("0 HELLO %s %s".formatted(this.role, name)); + LOGGER.info("Test agent connected as {} ({})", this.role, name); + } catch (IOException e) { + this.failed = true; + LOGGER.error("Failed to connect test agent to harness on port {}, giving up", port, e); + } + } + + private void readLoop() { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + PatPatTestRequest request = PatPatTestRequest.parse(line); + if (request != null) { + this.requests.add(request); + } + } + } catch (IOException e) { + LOGGER.warn("Test agent connection closed: {}", e.getMessage()); + } + + this.connected = false; + this.failed = true; + LOGGER.warn("Lost connection to the test harness, shutting down this game process"); + if (this.disconnectHandler != null) { + this.disconnectHandler.run(); + } + } + + public PatPatTestRequest poll() { + return this.requests.poll(); + } + + public void ok(PatPatTestRequest request, String payload) { + this.send("%d OK %s".formatted(request.id(), payload == null ? "" : payload)); + } + + public void error(PatPatTestRequest request, String message) { + this.send("%d ERR %s".formatted(request.id(), message)); + } + + private synchronized void send(String line) { + if (this.writer == null) { + return; + } + try { + this.writer.write(line); + this.writer.write('\n'); + this.writer.flush(); + } catch (IOException e) { + LOGGER.error("Failed to send line to harness", e); + } + } + + public record PatPatTestRequest(int id, String command, String argument) { + + public static PatPatTestRequest parse(String line) { + String[] parts = line.trim().split(" ", 3); + if (parts.length < 2) { + return null; + } + try { + return new PatPatTestRequest(Integer.parseInt(parts[0]), parts[1], parts.length > 2 ? parts[2] : ""); + } catch (NumberFormatException e) { + return null; + } + } + } +} diff --git a/src/main/java/net/lopymine/patpat/tests/PatPatTestClientAgent.java b/src/main/java/net/lopymine/patpat/tests/PatPatTestClientAgent.java new file mode 100644 index 00000000..29a2d0b5 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/tests/PatPatTestClientAgent.java @@ -0,0 +1,833 @@ +package net.lopymine.patpat.tests; + +import java.io.File; +import java.lang.reflect.Field; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.BooleanSupplier; + +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.platform.InputConstants.Key; +import org.lwjgl.glfw.GLFW; + +import net.lopymine.patpat.client.config.PatPatClientConfig; +import net.lopymine.patpat.client.keybinding.*; +import net.lopymine.patpat.client.manager.PatPatClientManager; +import net.lopymine.patpat.mixin.tests.*; +import net.lopymine.patpat.tests.PatPatTestAgent.PatPatTestRequest; +import net.minecraft.client.*; +import net.minecraft.client.gui.components.*; +import net.minecraft.client.gui.components.events.*; +import net.minecraft.client.gui.screens.ConnectScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens./*? if >=1.21 {*/options./*?}*/controls.KeyBindsScreen; +import net.minecraft.client.multiplayer.ServerData; +//? if >=1.17 { +import net.minecraft.client.multiplayer.resolver.ServerAddress; +//?} else { +/*import net.minecraft.client.multiplayer.ServerAddress; +*///?} +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.util.Mth; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.Entity; + +public class PatPatTestClientAgent { + + private static final int PAT_TIMEOUT_TICKS = 40; + private static final int JOIN_ATTEMPT_TICKS = 200; + private static final int JOIN_ATTEMPTS = 5; + private static final int WORLD_LOAD_TIMEOUT_TICKS = 12000; + private static final long WORLD_SEED = 0L; + private static final int SCROLL_TIMEOUT_TICKS = 400; + private static final int CLICK_ATTEMPTS = 40; + private static final int LIST_TOP_PADDING = 40; + private static final int ROW_HEIGHT = 20; + + //? if >=26.1 { + private static final String[] WORLD_SETUP_COMMANDS = { + "gamerule advance_time false", + "gamerule advance_weather false", + "gamerule spawn_mobs false", + "gamerule spawn_monsters false", + "gamerule random_tick_speed 0", + "gamerule send_command_feedback false", + "time set noon", + "weather clear" + }; + //?} else { + /*private static final String[] WORLD_SETUP_COMMANDS = { + "gamerule doDaylightCycle false", + "gamerule doWeatherCycle false", + "gamerule doMobSpawning false", + "gamerule randomTickSpeed 0", + "gamerule doFireTick false", + "gamerule sendCommandFeedback false", + "time set noon", + "weather clear" + }; + *///?} + + private static PatPatTestAgent agent; + private static PatPatTestRequest current; + private static BooleanSupplier task; + private static String payload; + private static int ticks; + private static volatile boolean abandoned; + + private PatPatTestClientAgent() { + throw new IllegalStateException("Agent class"); + } + + public static void register() { + if (!PatPatTestAgent.isEnabled()) { + return; + } + agent = new PatPatTestAgent("CLIENT"); + agent.setDisconnectHandler(() -> abandoned = true); + } + + public static void onClientTick() { + if (agent == null) { + return; + } + + Minecraft minecraft = Minecraft.getInstance(); + if (abandoned) { + abandoned = false; + minecraft.stop(); + return; + } + + if (!agent.isConnected()) { + if (minecraft.getUser() == null) { + return; + } + agent.connect(minecraft.getUser().getName()); + return; + } + + if (task != null) { + ticks++; + boolean done; + try { + done = task.getAsBoolean(); + } catch (Exception e) { + PatPatTestAgent.LOGGER.error("Test command {} failed", current.command(), e); + agent.error(current, e.toString()); + task = null; + current = null; + return; + } + if (done) { + PatPatTestAgent.LOGGER.info("Finished command {} in {} ticks{}", current.command(), ticks, payload.isBlank() ? "" : " -> " + payload); + agent.ok(current, payload); + task = null; + current = null; + } + return; + } + + PatPatTestRequest request = agent.poll(); + if (request == null) { + return; + } + + current = request; + payload = ""; + ticks = 0; + PatPatTestAgent.LOGGER.info("Starting command {} {}", request.command(), request.argument()); + try { + task = createTask(minecraft, request); + } catch (Exception e) { + PatPatTestAgent.LOGGER.error("Failed to start test command {}", request.command(), e); + agent.error(request, e.toString()); + current = null; + } + } + + private static BooleanSupplier createTask(Minecraft minecraft, PatPatTestRequest request) { + return switch (request.command()) { + case "PREPARE" -> prepare(); + case "JOIN" -> join(minecraft, request.argument()); + case "CREATE_WORLD" -> createWorld(minecraft, request.argument().trim()); + case "SETUP_WORLD" -> runCommands(minecraft, WORLD_SETUP_COMMANDS); + case "RUN_COMMAND" -> runCommands(minecraft, request.argument()); + case "OPEN_KEY_BINDS" -> openKeyBinds(minecraft); + case "SCROLL_TO_KEYBINDING" -> scrollToKeybinding(minecraft); + case "CLICK_KEYBINDING" -> clickKeybinding(minecraft); + case "PRESS_KEYS" -> pressKeys(minecraft, request.argument().trim()); + case "KEYBINDING" -> keybinding(); + case "ENABLE_SHADERS" -> enableShaders(); + case "WAIT_TICKS" -> waitTicks(Integer.parseInt(request.argument().trim())); + case "LOOK_AT" -> lookAt(minecraft, request.argument().trim()); + case "PAT" -> pat(minecraft, request.argument().trim()); + case "WAIT_PAT" -> waitPat(minecraft, request.argument().trim()); + case "SCREENSHOT" -> screenshot(minecraft, request.argument().trim()); + case "CAMERA" -> camera(minecraft, request.argument().trim()); + case "QUIT" -> quit(minecraft); + default -> throw new IllegalArgumentException("Unknown command: " + request.command()); + }; + } + + private static BooleanSupplier prepare() { + PatPatClientConfig config = PatPatClientConfig.getInstance(); + config.getMainConfig().setModEnabled(true); + config.getMultiPlayerConfig().setPatMeEnabled(true); + config.getVisualConfig().setHidingNicknameEnabled(false); + PatPatClientManager.clearPatEntities(); + return () -> true; + } + + private static BooleanSupplier join(Minecraft minecraft, String address) { + ServerAddress serverAddress = ServerAddress.parseString(address.trim()); + //? if >=1.20.2 { + ServerData data = new ServerData("patpat-test", address.trim(), ServerData.Type.OTHER); + //?} else { + /*ServerData data = new ServerData("patpat-test", address.trim(), false); + *///?} + + int[] attempt = {1}; + int[] attemptStartedAt = {0}; + startConnecting(minecraft, serverAddress, data); + + return () -> { + if (minecraft.level != null && minecraft.player != null && minecraft.getConnection() != null) { + return true; + } + if ((ticks - attemptStartedAt[0]) < JOIN_ATTEMPT_TICKS) { + return false; + } + if (attempt[0] >= JOIN_ATTEMPTS) { + throw new IllegalStateException("Failed to join %s after %d attempts".formatted(address, attempt[0])); + } + + attempt[0]++; + attemptStartedAt[0] = ticks; + PatPatTestAgent.LOGGER.warn("Join attempt {} to {} timed out, retrying", attempt[0] - 1, address); + startConnecting(minecraft, serverAddress, data); + return false; + }; + } + + private static void startConnecting(Minecraft minecraft, ServerAddress serverAddress, ServerData data) { + //? if >=1.20.5 { + ConnectScreen.startConnecting(new TitleScreenHolder().get(), minecraft, serverAddress, data, false, null); + //?} elif >=1.20 { + /*ConnectScreen.startConnecting(new TitleScreenHolder().get(), minecraft, serverAddress, data, false); + *///?} elif >=1.17 { + /*ConnectScreen.startConnecting(new TitleScreenHolder().get(), minecraft, serverAddress, data); + *///?} else { + /*minecraft.setScreen(new ConnectScreen(new TitleScreenHolder().get(), minecraft, data)); + *///?} + } + + private static BooleanSupplier createWorld(Minecraft minecraft, String name) { + boolean[] created = {false}; + + return () -> { + if (ticks > WORLD_LOAD_TIMEOUT_TICKS) { + throw new IllegalStateException("The test world was not loaded in %d ticks".formatted(WORLD_LOAD_TIMEOUT_TICKS)); + } + if (!created[0]) { + if (minecraft.getOverlay() != null) { + return false; + } + created[0] = true; + createFreshLevel(minecraft, name); + } + return isWorldReady(minecraft); + }; + } + + private static void createFreshLevel(Minecraft minecraft, String name) { + //? if >=1.20.3 { + minecraft.createWorldOpenFlows().createFreshLevel(name, createLevelSettings(name), createWorldOptions(), PatPatTestClientAgent::createFlatWorldDimensions, new TitleScreenHolder().get()); + //?} elif >=1.19.3 { + /*minecraft.createWorldOpenFlows().createFreshLevel(name, createLevelSettings(name), createWorldOptions(), PatPatTestClientAgent::createFlatWorldDimensions); + *///?} elif >=1.19 { + /*net.minecraft.core.RegistryAccess.Frozen registries = net.minecraft.core.RegistryAccess.BUILTIN.get(); + minecraft.createWorldOpenFlows().createFreshLevel(name, createLevelSettings(name), registries, createFlatWorldGenSettings(registries)); + *///?} elif >=1.18.2 { + /*net.minecraft.core.RegistryAccess.Frozen registries = net.minecraft.core.RegistryAccess.BUILTIN.get(); + minecraft.createLevel(name, createLevelSettings(name), registries, createFlatWorldGenSettings(registries)); + *///?} else { + /*net.minecraft.core.RegistryAccess.RegistryHolder registries = net.minecraft.core.RegistryAccess.builtin(); + minecraft.createLevel(name, createLevelSettings(name), registries, createFlatWorldGenSettings(registries)); + *///?} + } + + private static net.minecraft.world.level.LevelSettings createLevelSettings(String name) { + //? if >=26.1 { + return new net.minecraft.world.level.LevelSettings( + name, + net.minecraft.world.level.GameType.CREATIVE, + new net.minecraft.world.level.LevelSettings.DifficultySettings(net.minecraft.world.Difficulty.PEACEFUL, false, true), + true, + net.minecraft.world.level.WorldDataConfiguration.DEFAULT + ); + //?} elif >=1.21.11 { + /*return new net.minecraft.world.level.LevelSettings( + name, + net.minecraft.world.level.GameType.CREATIVE, + false, + net.minecraft.world.Difficulty.PEACEFUL, + true, + new net.minecraft.world.level.gamerules.GameRules(net.minecraft.world.level.WorldDataConfiguration.DEFAULT.enabledFeatures()), + net.minecraft.world.level.WorldDataConfiguration.DEFAULT + ); + *///?} elif >=1.21.4 { + /*return new net.minecraft.world.level.LevelSettings( + name, + net.minecraft.world.level.GameType.CREATIVE, + false, + net.minecraft.world.Difficulty.PEACEFUL, + true, + new net.minecraft.world.level.GameRules(net.minecraft.world.level.WorldDataConfiguration.DEFAULT.enabledFeatures()), + net.minecraft.world.level.WorldDataConfiguration.DEFAULT + ); + *///?} elif >=1.19.3 { + /*return new net.minecraft.world.level.LevelSettings( + name, + net.minecraft.world.level.GameType.CREATIVE, + false, + net.minecraft.world.Difficulty.PEACEFUL, + true, + new net.minecraft.world.level.GameRules(), + net.minecraft.world.level.WorldDataConfiguration.DEFAULT + ); + *///?} else { + /*return new net.minecraft.world.level.LevelSettings( + name, + net.minecraft.world.level.GameType.CREATIVE, + false, + net.minecraft.world.Difficulty.PEACEFUL, + true, + new net.minecraft.world.level.GameRules(), + net.minecraft.world.level.DataPackConfig.DEFAULT + ); + *///?} + } + + //? if >=1.19.3 { + private static net.minecraft.world.level.levelgen.WorldOptions createWorldOptions() { + return new net.minecraft.world.level.levelgen.WorldOptions(WORLD_SEED, false, false); + } + //?} + + //? if >=1.21.4 { + private static net.minecraft.world.level.levelgen.WorldDimensions createFlatWorldDimensions(net.minecraft.core.HolderLookup.Provider registries) { + return net.minecraft.world.level.levelgen.presets.WorldPresets.createFlatWorldDimensions(registries); + } + //?} elif >=1.19.3 { + /*private static net.minecraft.world.level.levelgen.WorldDimensions createFlatWorldDimensions(net.minecraft.core.RegistryAccess registries) { + return registries.registryOrThrow(net.minecraft.core.registries.Registries.WORLD_PRESET) + .getOrThrow(net.minecraft.world.level.levelgen.presets.WorldPresets.FLAT) + .createWorldDimensions(); + } + *///?} elif >=1.19 { + /*private static net.minecraft.world.level.levelgen.WorldGenSettings createFlatWorldGenSettings(net.minecraft.core.RegistryAccess registries) { + return registries.registryOrThrow(net.minecraft.core.Registry.WORLD_PRESET_REGISTRY) + .getOrThrow(net.minecraft.world.level.levelgen.presets.WorldPresets.FLAT) + .createWorldGenSettings(WORLD_SEED, false, false); + } + *///?} elif >=1.18.2 { + /*private static net.minecraft.world.level.levelgen.WorldGenSettings createFlatWorldGenSettings(net.minecraft.core.RegistryAccess registries) { + net.minecraft.core.Registry biomes = registries.registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY); + net.minecraft.core.Registry structureSets = registries.registryOrThrow(net.minecraft.core.Registry.STRUCTURE_SET_REGISTRY); + net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings flat = net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings.getDefault(biomes, structureSets); + + return new net.minecraft.world.level.levelgen.WorldGenSettings(WORLD_SEED, false, false, net.minecraft.world.level.levelgen.WorldGenSettings.withOverworld( + registries.registryOrThrow(net.minecraft.core.Registry.DIMENSION_TYPE_REGISTRY), + net.minecraft.world.level.dimension.DimensionType.defaultDimensions(registries, WORLD_SEED), + new net.minecraft.world.level.levelgen.FlatLevelSource(structureSets, flat) + )); + } + *///?} elif >=1.18 { + /*private static net.minecraft.world.level.levelgen.WorldGenSettings createFlatWorldGenSettings(net.minecraft.core.RegistryAccess.RegistryHolder registries) { + net.minecraft.core.Registry biomes = registries.registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY); + net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings flat = net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings.getDefault(biomes); + + return new net.minecraft.world.level.levelgen.WorldGenSettings(WORLD_SEED, false, false, net.minecraft.world.level.levelgen.WorldGenSettings.withOverworld( + registries.registryOrThrow(net.minecraft.core.Registry.DIMENSION_TYPE_REGISTRY), + net.minecraft.world.level.dimension.DimensionType.defaultDimensions(registries, WORLD_SEED), + new net.minecraft.world.level.levelgen.FlatLevelSource(flat) + )); + } + *///?} else { + /*private static net.minecraft.world.level.levelgen.WorldGenSettings createFlatWorldGenSettings(net.minecraft.core.RegistryAccess.RegistryHolder registries) { + net.minecraft.core.Registry dimensionTypes = registries.registryOrThrow(net.minecraft.core.Registry.DIMENSION_TYPE_REGISTRY); + net.minecraft.core.Registry biomes = registries.registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY); + net.minecraft.core.Registry noiseSettings = registries.registryOrThrow(net.minecraft.core.Registry.NOISE_GENERATOR_SETTINGS_REGISTRY); + net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings flat = net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings.getDefault(biomes); + + return new net.minecraft.world.level.levelgen.WorldGenSettings(WORLD_SEED, false, false, net.minecraft.world.level.levelgen.WorldGenSettings.withOverworld( + dimensionTypes, + net.minecraft.world.level.dimension.DimensionType.defaultDimensions(dimensionTypes, biomes, noiseSettings, WORLD_SEED), + new net.minecraft.world.level.levelgen.FlatLevelSource(flat) + )); + } + *///?} + + private static boolean isWorldReady(Minecraft minecraft) { + MinecraftServer server = minecraft.getSingleplayerServer(); + return minecraft.level != null && minecraft.player != null && minecraft.screen == null && server != null && server.isReady(); + } + + private static BooleanSupplier runCommands(Minecraft minecraft, String... commands) { + MinecraftServer server = minecraft.getSingleplayerServer(); + if (server == null) { + throw new IllegalStateException("Client is not in a singleplayer world"); + } + + CompletableFuture future = new CompletableFuture<>(); + server.execute(() -> { + try { + for (String command : commands) { + //? if >=1.19 { + server.getCommands().performPrefixedCommand(server.createCommandSourceStack(), command); + //?} else { + /*server.getCommands().performCommand(server.createCommandSourceStack(), command); + *///?} + } + future.complete(null); + } catch (Exception e) { + future.completeExceptionally(e); + } + }); + + return () -> { + if (!future.isDone()) { + return false; + } + future.join(); + return true; + }; + } + + private static BooleanSupplier openKeyBinds(Minecraft minecraft) { + return () -> { + if (minecraft.getOverlay() != null) { + return false; + } + if (!(minecraft.screen instanceof KeyBindsScreen)) { + minecraft.setScreen(new KeyBindsScreen(minecraft.screen, minecraft.options)); + return false; + } + if (findKeybindingButton(minecraft) != null) { + return true; + } + if (ticks > SCROLL_TIMEOUT_TICKS) { + throw new IllegalStateException("The PatPat keybinding button was not found on the key binds screen %s".formatted(minecraft.screen)); + } + return false; + }; + } + + private static BooleanSupplier scrollToKeybinding(Minecraft minecraft) { + return () -> { + AbstractSelectionList list = findKeyBindsList(minecraft); + int index = list == null ? -1 : findKeybindingIndex(list); + if (index == -1) { + if (ticks > SCROLL_TIMEOUT_TICKS) { + throw new IllegalStateException("The PatPat keybinding entry was not found in the key binds list"); + } + return false; + } + + int rowTop = ((AbstractSelectionListInvoker) list).invokeGetRowTop(index); + Button button = findChangeButton(list.children().get(index)); + + if (button != null && Math.abs(getButtonY(button) - rowTop) <= ROW_HEIGHT) { + payload = "%d".formatted(getButtonY(button)); + return true; + } + if (ticks > SCROLL_TIMEOUT_TICKS) { + throw new IllegalStateException("Failed to scroll the key binds list to the PatPat keybinding, the row is at %d, the button is at %d".formatted(rowTop, button == null ? -1 : getButtonY(button))); + } + + int desiredY = LIST_TOP_PADDING + ROW_HEIGHT; + list.setScrollAmount(getScrollAmount(list) + (rowTop - desiredY)); + return false; + }; + } + + private static AbstractSelectionList findKeyBindsList(Minecraft minecraft) { + Screen screen = minecraft.screen; + if (screen == null) { + return null; + } + for (GuiEventListener child : screen.children()) { + if (child instanceof AbstractSelectionList list) { + return list; + } + } + return null; + } + + private static int findKeybindingIndex(AbstractSelectionList list) { + List entries = list.children(); + for (int index = 0; index < entries.size(); index++) { + if (isKeybindingEntry(entries.get(index))) { + return index; + } + } + return -1; + } + + private static boolean isKeybindingEntry(Object entry) { + return findEntryField(entry, KeyMapping.class, false) instanceof PatPatKeybinding; + } + + private static Button findChangeButton(Object entry) { + return (Button) findEntryField(entry, Button.class, true); + } + + private static Object findEntryField(Object entry, Class type, boolean excludeReset) { + for (Class current = entry.getClass(); current != null && current != Object.class; current = current.getSuperclass()) { + for (Field field : current.getDeclaredFields()) { + if (!type.isAssignableFrom(field.getType())) { + continue; + } + if (excludeReset && field.getName().toLowerCase(Locale.ROOT).contains("reset")) { + continue; + } + try { + field.setAccessible(true); + return field.get(entry); + } catch (Exception e) { + return null; + } + } + } + return null; + } + + private static BooleanSupplier clickKeybinding(Minecraft minecraft) { + int[] phase = {0}; + int[] attempts = {0}; + return () -> { + PatPatKeybinding keybinding = PatPatClientKeybindingManager.getPatKeybinding(); + if (minecraft.screen instanceof KeyBindsScreen screen && screen.selectedKey == keybinding) { + return ticks >= 5; + } + if (attempts[0] >= CLICK_ATTEMPTS) { + throw new IllegalStateException("The PatPat keybinding was not selected by the click after %d attempts, screen=%s".formatted(attempts[0], minecraft.screen)); + } + + Button button = awaitKeybindingButton(minecraft); + if (button == null) { + return false; + } + if (phase[0] == 0) { + moveMouse(minecraft, getButtonX(button) + (button.getWidth() / 2.0D), getButtonY(button) + (button.getHeight() / 2.0D)); + phase[0] = 1; + return false; + } + if (phase[0] == 1) { + click(minecraft, GLFW.GLFW_PRESS); + phase[0] = 2; + return false; + } + click(minecraft, GLFW.GLFW_RELEASE); + phase[0] = 0; + attempts[0]++; + return false; + }; + } + + private static BooleanSupplier pressKeys(Minecraft minecraft, String argument) { + List keys = new ArrayList<>(); + for (String name : argument.split("\\+")) { + keys.add(InputConstants.getKey("key.keyboard." + name.trim().toLowerCase(Locale.ROOT).replace('_', '.'))); + } + + List steps = new ArrayList<>(); + for (Key key : keys) { + steps.add(() -> sendKey(minecraft, key, GLFW.GLFW_PRESS)); + } + for (int i = keys.size() - 1; i >= 0; i--) { + Key key = keys.get(i); + steps.add(() -> sendKey(minecraft, key, GLFW.GLFW_RELEASE)); + } + + int[] index = {0}; + return () -> { + if (index[0] >= steps.size()) { + return true; + } + steps.get(index[0]++).run(); + return false; + }; + } + + private static BooleanSupplier enableShaders() { + payload = net.lopymine.patpat.compat.iris.IrisShaderController.enableFirstShaderPack(); + return () -> ticks >= 20; + } + + private static BooleanSupplier keybinding() { + KeybindingCombination combination = PatPatClientKeybindingManager.getPatKeybinding().getCombination(); + Key attributeKey = combination.getAttributeKey(); + Key key = combination.getKey(); + + payload = "%s+%s".formatted(attributeKey == null ? "none" : attributeKey.getName(), key == null ? "none" : key.getName()); + return () -> true; + } + + private static Button awaitKeybindingButton(Minecraft minecraft) { + Button button = findKeybindingButton(minecraft); + if (button == null && ticks > SCROLL_TIMEOUT_TICKS) { + throw new IllegalStateException("The PatPat keybinding entry was not found in the key binds list"); + } + return button; + } + + private static Button findKeybindingButton(Minecraft minecraft) { + AbstractSelectionList list = findKeyBindsList(minecraft); + if (list != null) { + int index = findKeybindingIndex(list); + if (index != -1) { + return findChangeButton(list.children().get(index)); + } + } + + Screen screen = minecraft.screen; + return screen == null ? null : findKeybindingButton(screen.children()); + } + + private static Button findKeybindingButton(List children) { + for (GuiEventListener child : children) { + if (isKeybindingEntry(child)) { + return findChangeButton(child); + } + if (child instanceof ContainerEventHandler container) { + Button button = findKeybindingButton(container.children()); + if (button != null) { + return button; + } + } + } + return null; + } + + private static int getButtonX(Button button) { + //? if >=1.19.3 { + return button.getX(); + //?} else { + /*return button.x; + *///?} + } + + private static double getScrollAmount(AbstractSelectionList list) { + //? if >=1.21.4 { + return list.scrollAmount(); + //?} else { + /*return list.getScrollAmount(); + *///?} + } + + private static int getButtonY(Button button) { + //? if >=1.19.3 { + return button.getY(); + //?} else { + /*return button.y; + *///?} + } + + private static void moveMouse(Minecraft minecraft, double guiX, double guiY) { + double x = (guiX * minecraft.getWindow().getScreenWidth()) / minecraft.getWindow().getGuiScaledWidth(); + double y = (guiY * minecraft.getWindow().getScreenHeight()) / minecraft.getWindow().getGuiScaledHeight(); + + PatPatTestMode.runSyntheticInput(() -> ((MouseHandlerInvoker) minecraft.mouseHandler).invokeOnMove(getWindowHandle(minecraft), x, y)); + } + + private static void click(Minecraft minecraft, int action) { + PatPatTestMode.runSyntheticInput(() -> { + //? if >=1.21.9 { + ((MouseHandlerInvoker) minecraft.mouseHandler).invokeOnButton(getWindowHandle(minecraft), new net.minecraft.client.input.MouseButtonInfo(GLFW.GLFW_MOUSE_BUTTON_LEFT, 0), action); + //?} else { + /*((MouseHandlerInvoker) minecraft.mouseHandler).invokeOnPress(getWindowHandle(minecraft), GLFW.GLFW_MOUSE_BUTTON_LEFT, action, 0); + *///?} + }); + } + + private static void sendKey(Minecraft minecraft, Key key, int action) { + PatPatTestMode.runSyntheticInput(() -> { + //? if >=1.21.9 { + ((KeyboardHandlerInvoker) minecraft.keyboardHandler).invokeKeyPress(getWindowHandle(minecraft), action, new net.minecraft.client.input.KeyEvent(key.getValue(), 0, 0)); + //?} else { + /*((KeyboardHandlerInvoker) minecraft.keyboardHandler).invokeKeyPress(getWindowHandle(minecraft), key.getValue(), 0, action, 0); + *///?} + }); + } + + private static long getWindowHandle(Minecraft minecraft) { + return minecraft.getWindow()/*? if <=1.21.8 {*//*.getWindow()*//*?} else {*/.handle()/*?}*/; + } + + private static BooleanSupplier waitTicks(int amount) { + return () -> ticks >= amount; + } + + private static BooleanSupplier lookAt(Minecraft minecraft, String name) { + LocalPlayer player = minecraft.player; + if (player == null || minecraft.level == null) { + throw new IllegalStateException("Client is not in a level"); + } + + Entity target = findEntity(minecraft, name); + if (target == null) { + throw new IllegalStateException("Entity not found: " + name); + } + + double dx = target.getX() - player.getX(); + double dy = target.getEyeY() - player.getEyeY(); + double dz = target.getZ() - player.getZ(); + double horizontal = Math.sqrt((dx * dx) + (dz * dz)); + + float yRot = (float) (Mth.atan2(dz, dx) * (180F / Math.PI)) - 90.0F; + float xRot = (float) (-(Mth.atan2(dy, horizontal) * (180F / Math.PI))); + + //? if >=1.17 { + player.setYRot(yRot); + player.setXRot(xRot); + //?} else { + /*player.yRot = yRot; + player.xRot = xRot; + *///?} + player.yHeadRot = yRot; + player.yBodyRot = yRot; + player.yHeadRotO = yRot; + player.yRotO = yRot; + player.xRotO = xRot; + + return () -> ticks >= 5; + } + + private static BooleanSupplier pat(Minecraft minecraft, String target) { + PatPatKeybinding keybinding = PatPatClientKeybindingManager.getPatKeybinding(); + keybinding.setKey(keybinding.getDefaultKey()); + + KeybindingCombination combination = PatPatKeybinding.DEFAULT_COMBINATION; + InputConstants.Key attributeKey = combination.getAttributeKey(); + InputConstants.Key key = combination.getKey(); + + if (attributeKey != null) { + keybinding.onKeyAction(attributeKey, true); + } + keybinding.onKeyAction(key, true); + + return () -> { + UUID uuid = findEntityUuid(minecraft, target); + boolean patted = uuid != null && PatPatClientManager.PAT_ENTITIES.containsKey(uuid); + + if (!patted && ticks < PAT_TIMEOUT_TICKS) { + return false; + } + + if (attributeKey != null) { + keybinding.onKeyAction(attributeKey, false); + } + keybinding.onKeyAction(key, false); + + if (!patted) { + throw new IllegalStateException("Pat was not registered on the sender for " + target); + } + return true; + }; + } + + private static BooleanSupplier waitPat(Minecraft minecraft, String target) { + return () -> { + LocalPlayer player = minecraft.player; + if (player == null) { + return false; + } + UUID uuid = "SELF".equals(target) ? player.getUUID() : findEntityUuid(minecraft, target); + return uuid != null && PatPatClientManager.PAT_ENTITIES.containsKey(uuid); + }; + } + + private static UUID findEntityUuid(Minecraft minecraft, String name) { + Entity entity = findEntity(minecraft, name); + return entity == null ? null : entity.getUUID(); + } + + private static Entity findEntity(Minecraft minecraft, String name) { + LocalPlayer player = minecraft.player; + if (minecraft.level == null || player == null) { + return null; + } + + Entity nearest = null; + double nearestDistance = Double.MAX_VALUE; + + for (Entity entity : minecraft.level.entitiesForRendering()) { + if (entity == player || !entity.getName().getString().equals(name)) { + continue; + } + double distance = entity.distanceToSqr(player); + if (distance < nearestDistance) { + nearest = entity; + nearestDistance = distance; + } + } + return nearest; + } + + private static BooleanSupplier screenshot(Minecraft minecraft, String name) { + File file = new File(new File(minecraft.gameDirectory, "screenshots"), name + ".png"); + if (file.exists() && !file.delete()) { + throw new IllegalStateException("Failed to delete previous screenshot: " + file); + } + + //? if >=1.21.6 { + Screenshot.grab(minecraft.gameDirectory, name + ".png", minecraft.getMainRenderTarget(), 1, component -> {}); + //?} elif >=1.17.1 { + /*Screenshot.grab(minecraft.gameDirectory, name + ".png", minecraft.getMainRenderTarget(), component -> {}); + *///?} else { + /*Screenshot.grab(minecraft.gameDirectory, name + ".png", minecraft.getWindow().getWidth(), minecraft.getWindow().getHeight(), minecraft.getMainRenderTarget(), component -> {}); + *///?} + + long[] previousSize = {-1L}; + return () -> { + long size = file.length(); + boolean stable = size > 0L && size == previousSize[0]; + previousSize[0] = size; + if (stable) { + payload = file.getAbsolutePath(); + } + return stable; + }; + } + + private static BooleanSupplier camera(Minecraft minecraft, String type) { + CameraType requested = CameraType.valueOf(type); + minecraft.options.setCameraType(requested); + + return () -> { + if (ticks < 5) { + return false; + } + CameraType actual = minecraft.options.getCameraType(); + if (actual != requested) { + throw new IllegalStateException("Camera type reverted to " + actual); + } + payload = actual.name(); + return true; + }; + } + + private static BooleanSupplier quit(Minecraft minecraft) { + minecraft.stop(); + return () -> true; + } + + private static class TitleScreenHolder { + + public net.minecraft.client.gui.screens.Screen get() { + return new net.minecraft.client.gui.screens.TitleScreen(); + } + } +} diff --git a/src/main/java/net/lopymine/patpat/tests/PatPatTestMode.java b/src/main/java/net/lopymine/patpat/tests/PatPatTestMode.java new file mode 100644 index 00000000..647b9225 --- /dev/null +++ b/src/main/java/net/lopymine/patpat/tests/PatPatTestMode.java @@ -0,0 +1,33 @@ +package net.lopymine.patpat.tests; + +public class PatPatTestMode { + + public static final float FROZEN_PROGRESS = 0.5F; + + private static boolean syntheticInput; + + private PatPatTestMode() { + throw new IllegalStateException("Mode class"); + } + + public static boolean isEnabled() { + return PatPatTestAgent.isEnabled(); + } + + public static boolean isRealInputBlocked() { + return isEnabled() && !syntheticInput; + } + + public static void runSyntheticInput(Runnable runnable) { + syntheticInput = true; + try { + runnable.run(); + } finally { + syntheticInput = false; + } + } + + public static boolean isFrozen(float progress, int duration) { + return progress >= (duration * FROZEN_PROGRESS); + } +} diff --git a/src/main/java/net/lopymine/patpat/tests/PatPatTestServerAgent.java b/src/main/java/net/lopymine/patpat/tests/PatPatTestServerAgent.java new file mode 100644 index 00000000..4375613d --- /dev/null +++ b/src/main/java/net/lopymine/patpat/tests/PatPatTestServerAgent.java @@ -0,0 +1,119 @@ +package net.lopymine.patpat.tests; + +import java.util.concurrent.CompletableFuture; +import net.lopymine.patpat.entrypoint.*; +import net.lopymine.patpat.entrypoint.loader.IEarlyCommonModLoader.ModEnvironment; +import net.lopymine.patpat.tests.PatPatTestAgent.PatPatTestRequest; +import net.minecraft.server.MinecraftServer; + +public class PatPatTestServerAgent { + + private static PatPatTestAgent agent; + private static volatile MinecraftServer server; + + private PatPatTestServerAgent() { + throw new IllegalStateException("Agent class"); + } + + public static void register() { + if (!PatPatTestAgent.isEnabled()) { + return; + } + if (EarlyCommonMultiLoader.getInstance().getEnvironment() != ModEnvironment.SERVER) { + return; + } + agent = new PatPatTestAgent("SERVER"); + agent.setDisconnectHandler(() -> { + MinecraftServer current = server; + if (current != null) { + current.halt(false); + } + }); + + ServerMultiLoader.getInstance().registerServerPlayerLogListener((loggedIn, player) -> { + if (server == null) { + //? if >=1.20 { + server = player.level().getServer(); + //?} else { + /*server = player.level.getServer(); + *///?} + } + }); + + Thread thread = new Thread(PatPatTestServerAgent::loop, "patpat-test-server-agent"); + thread.setContextClassLoader(PatPatTestServerAgent.class.getClassLoader()); + thread.setDaemon(true); + thread.start(); + } + + private static void loop() { + agent.connect("dedicated"); + + while (true) { + PatPatTestRequest request = agent.poll(); + if (request == null) { + sleep(); + continue; + } + try { + PatPatTestAgent.LOGGER.info("Starting command {} {}", request.command(), request.argument()); + handle(request); + PatPatTestAgent.LOGGER.info("Finished command {}", request.command()); + } catch (Exception e) { + PatPatTestAgent.LOGGER.error("Test command {} failed", request.command(), e); + agent.error(request, e.toString()); + } + } + } + + private static void handle(PatPatTestRequest request) throws Exception { + switch (request.command()) { + case "WAIT_PLAYERS" -> { + int expected = Integer.parseInt(request.argument().trim()); + while (server == null || server.getPlayerList().getPlayerCount() < expected) { + sleep(); + } + agent.ok(request, ""); + } + case "RUN_COMMAND" -> { + MinecraftServer current = awaitServer(); + CompletableFuture future = new CompletableFuture<>(); + current.execute(() -> { + try { + //? if >=1.19 { + current.getCommands().performPrefixedCommand(current.createCommandSourceStack(), request.argument()); + //?} else { + /*current.getCommands().performCommand(current.createCommandSourceStack(), request.argument()); + *///?} + future.complete(null); + } catch (Exception e) { + future.completeExceptionally(e); + } + }); + future.get(); + agent.ok(request, ""); + } + case "QUIT" -> { + MinecraftServer current = awaitServer(); + current.halt(false); + agent.ok(request, ""); + } + default -> agent.error(request, "Unknown command: " + request.command()); + } + } + + private static MinecraftServer awaitServer() { + while (server == null) { + sleep(); + } + return server; + } + + private static void sleep() { + try { + Thread.sleep(50L); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } +} diff --git a/src/main/java/net/lopymine/patpat/PatTranslation.java b/src/main/java/net/lopymine/patpat/translation/PatTranslation.java similarity index 62% rename from src/main/java/net/lopymine/patpat/PatTranslation.java rename to src/main/java/net/lopymine/patpat/translation/PatTranslation.java index 6ae684f2..21521a66 100644 --- a/src/main/java/net/lopymine/patpat/PatTranslation.java +++ b/src/main/java/net/lopymine/patpat/translation/PatTranslation.java @@ -1,8 +1,9 @@ -package net.lopymine.patpat; +package net.lopymine.patpat.translation; -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; +import net.lopymine.patpat.PatPat; import net.lopymine.patpat.dedicated.PatPatDedicatedServerTranslationManager; +import net.lopymine.patpat.entrypoint.*; +import net.lopymine.patpat.entrypoint.loader.IEarlyCommonModLoader.ModEnvironment; import net.lopymine.patpat.utils.TextUtils; import net.minecraft.network.chat.MutableComponent; @@ -11,7 +12,7 @@ public class PatTranslation { public static MutableComponent text(String path, Object... args) { String key = String.format("%s.%s", PatPat.MOD_ID, path); - return FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER ? + return EarlyCommonMultiLoader.getInstance().getEnvironment() == ModEnvironment.SERVER ? TextUtils.processWithArgs(PatPatDedicatedServerTranslationManager.getOrDefault(key), args) : TextUtils.translatable(key, args); diff --git a/src/main/java/net/lopymine/patpat/utils/ClientNetworkUtils.java b/src/main/java/net/lopymine/patpat/utils/ClientNetworkUtils.java index 64520482..90e8cbe5 100644 --- a/src/main/java/net/lopymine/patpat/utils/ClientNetworkUtils.java +++ b/src/main/java/net/lopymine/patpat/utils/ClientNetworkUtils.java @@ -2,6 +2,7 @@ import lombok.experimental.ExtensionMethod; import net.lopymine.patpat.extension.GameProfileExtension; +import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.multiplayer.PlayerInfo; @@ -9,7 +10,6 @@ import java.util.*; import java.util.stream.Stream; -import org.jetbrains.annotations.*; @ExtensionMethod(GameProfileExtension.class) public class ClientNetworkUtils { @@ -18,7 +18,8 @@ private ClientNetworkUtils() { throw new IllegalStateException("Utility class"); } - public static List getOnlinePlayersFromUuids(@Nullable ClientPacketListener networkHandler) { + public static List getOnlinePlayersFromUuids() { + ClientPacketListener networkHandler = Minecraft.getInstance().getConnection(); if (networkHandler == null) { return Collections.emptyList(); } diff --git a/src/main/java/net/lopymine/patpat/utils/CommandText.java b/src/main/java/net/lopymine/patpat/utils/CommandText.java index ed8bc3a8..14d8a315 100644 --- a/src/main/java/net/lopymine/patpat/utils/CommandText.java +++ b/src/main/java/net/lopymine/patpat/utils/CommandText.java @@ -1,7 +1,7 @@ package net.lopymine.patpat.utils; import java.util.*; -import net.lopymine.patpat.PatTranslation; +import net.lopymine.patpat.translation.PatTranslation; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; @@ -17,12 +17,12 @@ import java.io.File; import java.net.URI; import java.nio.file.Path; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.*; //?} //? if >=1.21.6 { import net.minecraft.server.dialog.Dialog; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.core.Holder; //?} @@ -102,7 +102,11 @@ public static HoverEvent getHoverEvent(Action/*? <=1.21.4 {*//**//*?}*/ a *//*?} else {*/ return switch (action) { case SHOW_TEXT -> new ShowText((Component) value); - case SHOW_ITEM -> new ShowItem((ItemStack) value); + //? if >=26.1 { + case SHOW_ITEM -> new ShowItem((ItemStackTemplate) value); + //?} else { + /*case SHOW_ITEM -> new ShowItem((ItemStack) value); + *///?} case SHOW_ENTITY -> new ShowEntity((EntityTooltipInfo) value); }; /*?}*/ @@ -129,7 +133,7 @@ public static ClickEvent getClickEvent(ClickEvent.Action action, Object value) { yield new OpenFile((String) value); } //? if >=1.21.6 { - case CUSTOM -> new Custom((ResourceLocation) value, Optional.empty()); + case CUSTOM -> new Custom((Identifier) value, Optional.empty()); case SHOW_DIALOG -> new ShowDialog((Holder

) value); //?} }; diff --git a/src/main/java/net/lopymine/patpat/utils/ConfigUtils.java b/src/main/java/net/lopymine/patpat/utils/ConfigUtils.java index 190be545..eea94427 100644 --- a/src/main/java/net/lopymine/patpat/utils/ConfigUtils.java +++ b/src/main/java/net/lopymine/patpat/utils/ConfigUtils.java @@ -9,6 +9,7 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.*; +import net.lopymine.patpat.logger.PatLogger; public class ConfigUtils { @@ -45,7 +46,7 @@ private static A create(Codec codec, File location, PatLogger logger) { return config; } try (FileWriter writer = new FileWriter(location, StandardCharsets.UTF_8)) { - String json = GSON.toJson(codec.encode(config, JsonOps.INSTANCE, JsonOps.INSTANCE.empty())/*? if >=1.20.5 {*/.getOrThrow());/*?} else*//*.getOrThrow(false, logger::error));*/ + String json = GSON.toJson(codec.encode(config, JsonOps.INSTANCE, JsonOps.INSTANCE.empty())/*? if >=1.20.5 {*/.getOrThrow());/*?} else*///.getOrThrow(false, logger::error)); writer.write(json); } catch (Exception e) { logger.error("Failed to create config", e); @@ -69,7 +70,7 @@ public static A readConfig(Codec codec, File location, PatLogger logger) public static void saveConfig(A config, Codec codec, File location, PatLogger logger) { logger.debug("Saving config..."); try (FileWriter writer = new FileWriter(location, StandardCharsets.UTF_8)) { - String json = GSON.toJson(codec.encode(config, JsonOps.INSTANCE, JsonOps.INSTANCE.empty())/*? if >=1.20.5 {*/.getOrThrow());/*?} else*//*.getOrThrow(false, logger::error));*/ + String json = GSON.toJson(codec.encode(config, JsonOps.INSTANCE, JsonOps.INSTANCE.empty())/*? if >=1.20.5 {*/.getOrThrow());/*?} else*///.getOrThrow(false, logger::error)); writer.write(json); } catch (Exception e) { logger.error("Failed to save config:", e); diff --git a/src/main/java/net/lopymine/patpat/utils/IdentifierUtils.java b/src/main/java/net/lopymine/patpat/utils/IdentifierUtils.java deleted file mode 100644 index 64fea4ca..00000000 --- a/src/main/java/net/lopymine/patpat/utils/IdentifierUtils.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lopymine.patpat.utils; - -import net.lopymine.patpat.PatPat; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.*; - -public class IdentifierUtils { - - private IdentifierUtils() { - throw new IllegalStateException("Utility class"); - } - - public static ResourceLocation modId(@NotNull String path) { - return IdentifierUtils.id(PatPat.MOD_ID, path); - } - - public static ResourceLocation vanillaId(@NotNull String path) { - return IdentifierUtils.id("minecraft", path); - } - - public static ResourceLocation id(String namespace, String path) { - String name = namespace; - String location = path; - - String[] split = path.split(":"); - if (split.length >= 2) { - name = split[0]; - location = split[1]; - } - - //? >=1.21 { - return ResourceLocation.fromNamespaceAndPath(name, location); - //?} else { - /*return new ResourceLocation(name, location); - *///?} - } -} diff --git a/src/main/java/net/lopymine/patpat/utils/ModMenuUtils.java b/src/main/java/net/lopymine/patpat/utils/ModMenuUtils.java index 04428228..53cdec6d 100644 --- a/src/main/java/net/lopymine/patpat/utils/ModMenuUtils.java +++ b/src/main/java/net/lopymine/patpat/utils/ModMenuUtils.java @@ -4,9 +4,9 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; -import net.lopymine.patpat.PatTranslation; +import net.lopymine.patpat.translation.PatTranslation; import java.util.function.Function; @@ -64,8 +64,8 @@ public static MutableComponent getModTitle() { return PatTranslation.text("modmenu.title"); } - public static ResourceLocation getContentId(String filename) { - return IdentifierUtils.modId("textures/config/" + filename); + public static Identifier getContentId(String filename) { + return RLUtils.modId("textures/config/" + filename); } public static Function getEnabledOrDisabledFormatter() { diff --git a/src/main/java/net/lopymine/patpat/utils/RLUtils.java b/src/main/java/net/lopymine/patpat/utils/RLUtils.java new file mode 100644 index 00000000..7625858f --- /dev/null +++ b/src/main/java/net/lopymine/patpat/utils/RLUtils.java @@ -0,0 +1,45 @@ +package net.lopymine.patpat.utils; + +import net.lopymine.patpat.PatPat; +import net.minecraft.resources.Identifier; +import org.jetbrains.annotations.*; + +public class RLUtils { + + private RLUtils() { + throw new IllegalStateException("Utility class"); + } + + public static Identifier parse(String string){ + /*? if >1.20.6 {*/ + return Identifier.parse(string); + /*?} else {*/ + /*return new Identifier(string); + *//*?}*/ + } + + public static Identifier modId(@NotNull String path) { + return RLUtils.id(PatPat.MOD_ID, path); + } + + public static Identifier vanillaId(@NotNull String path) { + return RLUtils.id("minecraft", path); + } + + public static Identifier id(String namespace, String path) { + String name = namespace; + String location = path; + + String[] split = path.split(":"); + if (split.length >= 2) { + name = split[0]; + location = split[1]; + } + + //? >=1.21 { + return Identifier.fromNamespaceAndPath(name, location); + //?} else { + /*return new Identifier(name, location); + *///?} + } +} diff --git a/src/main/java/net/lopymine/patpat/utils/ResourceLocationUtils.java b/src/main/java/net/lopymine/patpat/utils/ResourceLocationUtils.java deleted file mode 100644 index 3b72b0dc..00000000 --- a/src/main/java/net/lopymine/patpat/utils/ResourceLocationUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.lopymine.patpat.utils; - -import lombok.experimental.UtilityClass; -import net.minecraft.resources.ResourceLocation; - -@UtilityClass -public class ResourceLocationUtils { - - public static ResourceLocation parse(String string){ - /*? if >1.20.6 {*/ - return ResourceLocation.parse(string); - /*?} else {*/ - /*return new ResourceLocation(string); - *//*?}*/ - } - -} diff --git a/src/main/java/net/lopymine/patpat/utils/SoundUtils.java b/src/main/java/net/lopymine/patpat/utils/SoundUtils.java index 51fdbb2c..294e6d12 100644 --- a/src/main/java/net/lopymine/patpat/utils/SoundUtils.java +++ b/src/main/java/net/lopymine/patpat/utils/SoundUtils.java @@ -1,6 +1,6 @@ package net.lopymine.patpat.utils; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.sounds.SoundEvent; import org.jetbrains.annotations.*; @@ -12,7 +12,7 @@ private SoundUtils() { @NotNull public static SoundEvent getSoundEvent(@NotNull String value) { - ResourceLocation id = IdentifierUtils.modId(value); + Identifier id = RLUtils.modId(value); return /*? >=1.19.3 {*/SoundEvent.createVariableRangeEvent(id)/*?} else {*/ /*new SoundEvent(id)*//*?}*/; } diff --git a/src/main/java/net/lopymine/patpat/utils/mixin/ScreenWithPatPatKeybinding.java b/src/main/java/net/lopymine/patpat/utils/mixin/ScreenWithPatPatKeybinding.java index cec64adc..ed8ca0c3 100644 --- a/src/main/java/net/lopymine/patpat/utils/mixin/ScreenWithPatPatKeybinding.java +++ b/src/main/java/net/lopymine/patpat/utils/mixin/ScreenWithPatPatKeybinding.java @@ -2,6 +2,6 @@ public interface ScreenWithPatPatKeybinding { - void patPat$onKeyReleased(int keyCode, int scanCode, int modifiers); + void patPat$onKeyReleased(); } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..c0c46664 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,31 @@ +license = "${mod_license}" +issueTrackerURL = "https://github.com/${github_mod_author}/${mod_id}" +modLoader="javafml" +loaderVersion="[1,)" + +[[mods]] +modId = "${mod_id}" +version = "${mod_version}" +displayName = "${mod_name}" +side="${neoforge_trick_side}" +displayURL = "https://modrinth.com/mod/${mod_id}" +logoFile = "icon.png" +authors = "${mod_authors}" +description = '''${mod_description}''' + +${old_neoforge_trick_mixin_configs} + +[[dependencies.${mod_id}]] +modId = "${old_neoforge_id_trick}" +${required_forge_thing} +versionRange = "[1,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.${ mod_id }]] +modId = "minecraft" +${required_forge_thing} +versionRange = "${minecraft}" +ordering = "NONE" +side = "BOTH" + diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 00000000..eeab32ce --- /dev/null +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,40 @@ +license = "${mod_license}" +issueTrackerURL = "https://github.com/${github_mod_author}/${mod_id}" +modLoader="javafml" +loaderVersion="[1,)" + +[[mods]] +modId = "${mod_id}" +version = "${mod_version}" +displayName = "${mod_name}" +side="${neoforge_trick_side}" +displayURL = "https://modrinth.com/mod/${mod_id}" +logoFile = "icon.png" +credits = ''' + +Translators: + TastyPommesLul: Germany + Hamka: Polish + MrLemonHog: Ukrainian + Balojan: Vietnamese (46%) + okunamayanad: Turkish (25%) + Gallium: French (19%) +''' +authors = "${mod_authors}" +description = '''${mod_description}''' + +${neoforge_trick_mixin_configs} + +[[dependencies.${mod_id}]] +modId = "neoforge" +type = "required" +versionRange = "[1,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.${mod_id}]] +modId = "minecraft" +type = "required" +versionRange = "${minecraft}" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/src/main/resources/aws/1.19.3.accesswidener b/src/main/resources/aws/1.19.3.accesswidener deleted file mode 100644 index ca8200ae..00000000 --- a/src/main/resources/aws/1.19.3.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.19.3 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.19.4.accesswidener b/src/main/resources/aws/1.19.4.accesswidener deleted file mode 100644 index edebca49..00000000 --- a/src/main/resources/aws/1.19.4.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.19.4 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.20.1.accesswidener b/src/main/resources/aws/1.20.1.accesswidener deleted file mode 100644 index cd5b5115..00000000 --- a/src/main/resources/aws/1.20.1.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.20.1 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.20.2.accesswidener b/src/main/resources/aws/1.20.2.accesswidener deleted file mode 100644 index e448fcfc..00000000 --- a/src/main/resources/aws/1.20.2.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.20.2 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.20.3.accesswidener b/src/main/resources/aws/1.20.3.accesswidener deleted file mode 100644 index d34ec33b..00000000 --- a/src/main/resources/aws/1.20.3.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.20.3 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.20.4.accesswidener b/src/main/resources/aws/1.20.4.accesswidener deleted file mode 100644 index 3b6e067a..00000000 --- a/src/main/resources/aws/1.20.4.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.20.4 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.20.accesswidener b/src/main/resources/aws/1.20.accesswidener deleted file mode 100644 index 56e141b3..00000000 --- a/src/main/resources/aws/1.20.accesswidener +++ /dev/null @@ -1,5 +0,0 @@ -accessWidener v2 named -# 1.20 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F \ No newline at end of file diff --git a/src/main/resources/aws/1.21.2.accesswidener b/src/main/resources/aws/1.21.2.accesswidener deleted file mode 100644 index 12de189b..00000000 --- a/src/main/resources/aws/1.21.2.accesswidener +++ /dev/null @@ -1,7 +0,0 @@ -accessWidener v2 named -# 1.21.2 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F - -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/1.21.3.accesswidener b/src/main/resources/aws/1.21.3.accesswidener deleted file mode 100644 index 6e160726..00000000 --- a/src/main/resources/aws/1.21.3.accesswidener +++ /dev/null @@ -1,7 +0,0 @@ -accessWidener v2 named -# 1.21.3 AW - -accessible field net/minecraft/client/Camera eyeHeightOld F -accessible field net/minecraft/client/Camera eyeHeight F - -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/1.16.5.accesswidener b/src/main/resources/aws/fabric-1.16.5.accesswidener similarity index 91% rename from src/main/resources/aws/1.16.5.accesswidener rename to src/main/resources/aws/fabric-1.16.5.accesswidener index 42fc5f58..2ac85b39 100644 --- a/src/main/resources/aws/1.16.5.accesswidener +++ b/src/main/resources/aws/fabric-1.16.5.accesswidener @@ -9,3 +9,5 @@ mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraf accessible field net/minecraft/client/gui/screens/controls/ControlList controlsScreen Lnet/minecraft/client/gui/screens/controls/ControlsScreen; accessible method com/mojang/blaze3d/vertex/PoseStack$Pose (Lcom/mojang/math/Matrix4f;Lcom/mojang/math/Matrix3f;)V + +accessible field net/minecraft/client/KeyMapping clickCount I diff --git a/src/main/resources/aws/1.17.1.accesswidener b/src/main/resources/aws/fabric-1.17.1.accesswidener similarity index 87% rename from src/main/resources/aws/1.17.1.accesswidener rename to src/main/resources/aws/fabric-1.17.1.accesswidener index 45d88360..fca9ffcd 100644 --- a/src/main/resources/aws/1.17.1.accesswidener +++ b/src/main/resources/aws/fabric-1.17.1.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/ControlList controlsScreen Lnet/minecraft/client/gui/screens/controls/ControlsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/ControlList controlsScreen Lnet/minecraft/client/gui/screens/controls/ControlsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.17.accesswidener b/src/main/resources/aws/fabric-1.17.accesswidener similarity index 86% rename from src/main/resources/aws/1.17.accesswidener rename to src/main/resources/aws/fabric-1.17.accesswidener index aa48ff68..483c9233 100644 --- a/src/main/resources/aws/1.17.accesswidener +++ b/src/main/resources/aws/fabric-1.17.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/ControlList controlsScreen Lnet/minecraft/client/gui/screens/controls/ControlsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/ControlList controlsScreen Lnet/minecraft/client/gui/screens/controls/ControlsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.18.1.accesswidener b/src/main/resources/aws/fabric-1.18.1.accesswidener similarity index 86% rename from src/main/resources/aws/1.18.1.accesswidener rename to src/main/resources/aws/fabric-1.18.1.accesswidener index bbac3e16..0c80e056 100644 --- a/src/main/resources/aws/1.18.1.accesswidener +++ b/src/main/resources/aws/fabric-1.18.1.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.18.2.accesswidener b/src/main/resources/aws/fabric-1.18.2.accesswidener similarity index 86% rename from src/main/resources/aws/1.18.2.accesswidener rename to src/main/resources/aws/fabric-1.18.2.accesswidener index 1169efff..d26e8151 100644 --- a/src/main/resources/aws/1.18.2.accesswidener +++ b/src/main/resources/aws/fabric-1.18.2.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.18.accesswidener b/src/main/resources/aws/fabric-1.18.accesswidener similarity index 86% rename from src/main/resources/aws/1.18.accesswidener rename to src/main/resources/aws/fabric-1.18.accesswidener index 3ccd4a43..26a4cd74 100644 --- a/src/main/resources/aws/1.18.accesswidener +++ b/src/main/resources/aws/fabric-1.18.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.19.1.accesswidener b/src/main/resources/aws/fabric-1.19.1.accesswidener similarity index 86% rename from src/main/resources/aws/1.19.1.accesswidener rename to src/main/resources/aws/fabric-1.19.1.accesswidener index 99bd0e2d..e13a77f7 100644 --- a/src/main/resources/aws/1.19.1.accesswidener +++ b/src/main/resources/aws/fabric-1.19.1.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.19.2.accesswidener b/src/main/resources/aws/fabric-1.19.2.accesswidener similarity index 86% rename from src/main/resources/aws/1.19.2.accesswidener rename to src/main/resources/aws/fabric-1.19.2.accesswidener index 3b7ff14f..1d1d3f12 100644 --- a/src/main/resources/aws/1.19.2.accesswidener +++ b/src/main/resources/aws/fabric-1.19.2.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.19.3.accesswidener b/src/main/resources/aws/fabric-1.19.3.accesswidener new file mode 100644 index 00000000..a4b21265 --- /dev/null +++ b/src/main/resources/aws/fabric-1.19.3.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.19.3 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.19.4.accesswidener b/src/main/resources/aws/fabric-1.19.4.accesswidener new file mode 100644 index 00000000..d04c8d6b --- /dev/null +++ b/src/main/resources/aws/fabric-1.19.4.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.19.4 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.19.accesswidener b/src/main/resources/aws/fabric-1.19.accesswidener similarity index 86% rename from src/main/resources/aws/1.19.accesswidener rename to src/main/resources/aws/fabric-1.19.accesswidener index 7aa4cbb1..0fac52d2 100644 --- a/src/main/resources/aws/1.19.accesswidener +++ b/src/main/resources/aws/fabric-1.19.accesswidener @@ -6,4 +6,6 @@ accessible field net/minecraft/client/Camera eyeHeight F accessible field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; mutable field net/minecraft/client/gui/components/Button onTooltip Lnet/minecraft/client/gui/components/Button$OnTooltip; -accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; \ No newline at end of file +accessible field net/minecraft/client/gui/screens/controls/KeyBindsList keyBindsScreen Lnet/minecraft/client/gui/screens/controls/KeyBindsScreen; + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.20.1.accesswidener b/src/main/resources/aws/fabric-1.20.1.accesswidener new file mode 100644 index 00000000..b9dee54f --- /dev/null +++ b/src/main/resources/aws/fabric-1.20.1.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.20.1 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.20.2.accesswidener b/src/main/resources/aws/fabric-1.20.2.accesswidener new file mode 100644 index 00000000..30e70f5d --- /dev/null +++ b/src/main/resources/aws/fabric-1.20.2.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.20.2 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.20.3.accesswidener b/src/main/resources/aws/fabric-1.20.3.accesswidener new file mode 100644 index 00000000..38e3023a --- /dev/null +++ b/src/main/resources/aws/fabric-1.20.3.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.20.3 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.20.4.accesswidener b/src/main/resources/aws/fabric-1.20.4.accesswidener new file mode 100644 index 00000000..6e21564b --- /dev/null +++ b/src/main/resources/aws/fabric-1.20.4.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.20.4 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.20.5.accesswidener b/src/main/resources/aws/fabric-1.20.5.accesswidener similarity index 78% rename from src/main/resources/aws/1.20.5.accesswidener rename to src/main/resources/aws/fabric-1.20.5.accesswidener index e7b71c8e..6df4868d 100644 --- a/src/main/resources/aws/1.20.5.accesswidener +++ b/src/main/resources/aws/fabric-1.20.5.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.20.6.accesswidener b/src/main/resources/aws/fabric-1.20.6.accesswidener similarity index 78% rename from src/main/resources/aws/1.20.6.accesswidener rename to src/main/resources/aws/fabric-1.20.6.accesswidener index 86795ceb..492c684b 100644 --- a/src/main/resources/aws/1.20.6.accesswidener +++ b/src/main/resources/aws/fabric-1.20.6.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.20.accesswidener b/src/main/resources/aws/fabric-1.20.accesswidener new file mode 100644 index 00000000..483c456e --- /dev/null +++ b/src/main/resources/aws/fabric-1.20.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.20 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.1.accesswidener b/src/main/resources/aws/fabric-1.21.1.accesswidener similarity index 78% rename from src/main/resources/aws/1.21.1.accesswidener rename to src/main/resources/aws/fabric-1.21.1.accesswidener index 60019a8f..264e9971 100644 --- a/src/main/resources/aws/1.21.1.accesswidener +++ b/src/main/resources/aws/fabric-1.21.1.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.10.accesswidener b/src/main/resources/aws/fabric-1.21.10.accesswidener similarity index 78% rename from src/main/resources/aws/1.21.10.accesswidener rename to src/main/resources/aws/fabric-1.21.10.accesswidener index 8dab1523..da8cefd9 100644 --- a/src/main/resources/aws/1.21.10.accesswidener +++ b/src/main/resources/aws/fabric-1.21.10.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-1.21.11.accesswidener b/src/main/resources/aws/fabric-1.21.11.accesswidener new file mode 100644 index 00000000..eafe3566 --- /dev/null +++ b/src/main/resources/aws/fabric-1.21.11.accesswidener @@ -0,0 +1,7 @@ +accessWidener v2 named +# 1.21.11 AW + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.4.accesswidener b/src/main/resources/aws/fabric-1.21.4.accesswidener similarity index 78% rename from src/main/resources/aws/1.21.4.accesswidener rename to src/main/resources/aws/fabric-1.21.4.accesswidener index a9fa4da6..9fa82f0b 100644 --- a/src/main/resources/aws/1.21.4.accesswidener +++ b/src/main/resources/aws/fabric-1.21.4.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.5.accesswidener b/src/main/resources/aws/fabric-1.21.5.accesswidener similarity index 78% rename from src/main/resources/aws/1.21.5.accesswidener rename to src/main/resources/aws/fabric-1.21.5.accesswidener index b04c0102..d02100d4 100644 --- a/src/main/resources/aws/1.21.5.accesswidener +++ b/src/main/resources/aws/fabric-1.21.5.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.6.accesswidener b/src/main/resources/aws/fabric-1.21.6.accesswidener similarity index 78% rename from src/main/resources/aws/1.21.6.accesswidener rename to src/main/resources/aws/fabric-1.21.6.accesswidener index 53e99d45..e01aa8cb 100644 --- a/src/main/resources/aws/1.21.6.accesswidener +++ b/src/main/resources/aws/fabric-1.21.6.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.7.accesswidener b/src/main/resources/aws/fabric-1.21.7.accesswidener similarity index 82% rename from src/main/resources/aws/1.21.7.accesswidener rename to src/main/resources/aws/fabric-1.21.7.accesswidener index f8ad8479..8888806c 100644 --- a/src/main/resources/aws/1.21.7.accesswidener +++ b/src/main/resources/aws/fabric-1.21.7.accesswidener @@ -5,3 +5,4 @@ accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I diff --git a/src/main/resources/aws/1.21.8.accesswidener b/src/main/resources/aws/fabric-1.21.8.accesswidener similarity index 82% rename from src/main/resources/aws/1.21.8.accesswidener rename to src/main/resources/aws/fabric-1.21.8.accesswidener index 87b8c9ce..ca1090fb 100644 --- a/src/main/resources/aws/1.21.8.accesswidener +++ b/src/main/resources/aws/fabric-1.21.8.accesswidener @@ -5,3 +5,4 @@ accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I diff --git a/src/main/resources/aws/1.21.9.accesswidener b/src/main/resources/aws/fabric-1.21.9.accesswidener similarity index 78% rename from src/main/resources/aws/1.21.9.accesswidener rename to src/main/resources/aws/fabric-1.21.9.accesswidener index 27538580..4cff1278 100644 --- a/src/main/resources/aws/1.21.9.accesswidener +++ b/src/main/resources/aws/fabric-1.21.9.accesswidener @@ -4,4 +4,5 @@ accessWidener v2 named accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F -accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file +accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/1.21.accesswidener b/src/main/resources/aws/fabric-1.21.accesswidener similarity index 82% rename from src/main/resources/aws/1.21.accesswidener rename to src/main/resources/aws/fabric-1.21.accesswidener index 59d466f1..3e575293 100644 --- a/src/main/resources/aws/1.21.accesswidener +++ b/src/main/resources/aws/fabric-1.21.accesswidener @@ -5,3 +5,4 @@ accessible field net/minecraft/client/Camera eyeHeightOld F accessible field net/minecraft/client/Camera eyeHeight F accessible method net/minecraft/client/renderer/GameRenderer pick (Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/fabric-26.1.classTweaker b/src/main/resources/aws/fabric-26.1.classTweaker new file mode 100644 index 00000000..2d6ee191 --- /dev/null +++ b/src/main/resources/aws/fabric-26.1.classTweaker @@ -0,0 +1,7 @@ +classTweaker v1 official +# 26.1 AW(AT) + +accessible field net/minecraft/client/Camera eyeHeightOld F +accessible field net/minecraft/client/Camera eyeHeight F + +accessible field net/minecraft/client/KeyMapping clickCount I \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.16.5.cfg b/src/main/resources/aws/forge-1.16.5.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/forge-1.17.1.cfg b/src/main/resources/aws/forge-1.17.1.cfg new file mode 100644 index 00000000..c358c657 --- /dev/null +++ b/src/main/resources/aws/forge-1.17.1.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount + +public-f net.minecraft.client.gui.components.Button f_93718_ # onTooltip +public net.minecraft.client.gui.screens.controls.ControlList f_97396_ # controlsScreen \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.17.cfg b/src/main/resources/aws/forge-1.17.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/forge-1.18.1.cfg b/src/main/resources/aws/forge-1.18.1.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/forge-1.18.2.cfg b/src/main/resources/aws/forge-1.18.2.cfg new file mode 100644 index 00000000..c938a0f0 --- /dev/null +++ b/src/main/resources/aws/forge-1.18.2.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount + +public-f net.minecraft.client.gui.components.Button f_93718_ # onTooltip +public net.minecraft.client.gui.screens.controls.KeyBindsList f_193858_ # keyBindsScreen \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.18.cfg b/src/main/resources/aws/forge-1.18.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/forge-1.19.1.cfg b/src/main/resources/aws/forge-1.19.1.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/forge-1.19.2.cfg b/src/main/resources/aws/forge-1.19.2.cfg new file mode 100644 index 00000000..c938a0f0 --- /dev/null +++ b/src/main/resources/aws/forge-1.19.2.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount + +public-f net.minecraft.client.gui.components.Button f_93718_ # onTooltip +public net.minecraft.client.gui.screens.controls.KeyBindsList f_193858_ # keyBindsScreen \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.19.3.cfg b/src/main/resources/aws/forge-1.19.3.cfg new file mode 100644 index 00000000..2ca7602c --- /dev/null +++ b/src/main/resources/aws/forge-1.19.3.cfg @@ -0,0 +1,3 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.19.4.cfg b/src/main/resources/aws/forge-1.19.4.cfg new file mode 100644 index 00000000..2ca7602c --- /dev/null +++ b/src/main/resources/aws/forge-1.19.4.cfg @@ -0,0 +1,3 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.19.cfg b/src/main/resources/aws/forge-1.19.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/forge-1.20.1.cfg b/src/main/resources/aws/forge-1.20.1.cfg new file mode 100644 index 00000000..2ca7602c --- /dev/null +++ b/src/main/resources/aws/forge-1.20.1.cfg @@ -0,0 +1,3 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount \ No newline at end of file diff --git a/src/main/resources/aws/forge-1.20.cfg b/src/main/resources/aws/forge-1.20.cfg new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/aws/neoforge-1.20.2.cfg b/src/main/resources/aws/neoforge-1.20.2.cfg new file mode 100644 index 00000000..2ca7602c --- /dev/null +++ b/src/main/resources/aws/neoforge-1.20.2.cfg @@ -0,0 +1,3 @@ +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.KeyMapping f_90818_ # clickCount \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.20.3.cfg b/src/main/resources/aws/neoforge-1.20.3.cfg new file mode 100644 index 00000000..a27814ae --- /dev/null +++ b/src/main/resources/aws/neoforge-1.20.3.cfg @@ -0,0 +1,4 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.20.4.cfg b/src/main/resources/aws/neoforge-1.20.4.cfg new file mode 100644 index 00000000..a27814ae --- /dev/null +++ b/src/main/resources/aws/neoforge-1.20.4.cfg @@ -0,0 +1,4 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.20.6.cfg b/src/main/resources/aws/neoforge-1.20.6.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.20.6.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.1.cfg b/src/main/resources/aws/neoforge-1.21.1.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.1.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.10.cfg b/src/main/resources/aws/neoforge-1.21.10.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.10.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.11.cfg b/src/main/resources/aws/neoforge-1.21.11.cfg new file mode 100644 index 00000000..a27814ae --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.11.cfg @@ -0,0 +1,4 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.4.cfg b/src/main/resources/aws/neoforge-1.21.4.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.4.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.5.cfg b/src/main/resources/aws/neoforge-1.21.5.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.5.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.6.cfg b/src/main/resources/aws/neoforge-1.21.6.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.6.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.7.cfg b/src/main/resources/aws/neoforge-1.21.7.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.7.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.8.cfg b/src/main/resources/aws/neoforge-1.21.8.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.8.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-1.21.9.cfg b/src/main/resources/aws/neoforge-1.21.9.cfg new file mode 100644 index 00000000..b44cbc43 --- /dev/null +++ b/src/main/resources/aws/neoforge-1.21.9.cfg @@ -0,0 +1,6 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld + +public net.minecraft.client.renderer.GameRenderer pick(Lnet/minecraft/world/entity/Entity;DDF)Lnet/minecraft/world/phys/HitResult; \ No newline at end of file diff --git a/src/main/resources/aws/neoforge-26.1.cfg b/src/main/resources/aws/neoforge-26.1.cfg new file mode 100644 index 00000000..a27814ae --- /dev/null +++ b/src/main/resources/aws/neoforge-26.1.cfg @@ -0,0 +1,4 @@ +public net.minecraft.client.KeyMapping clickCount + +public net.minecraft.client.Camera eyeHeight +public net.minecraft.client.Camera eyeHeightOld \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0be4f52f..48463607 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,24 +9,24 @@ ], "contact": { "homepage": "https://modrinth.com/mod/${mod_id}", - "sources": "https://github.com/LopyMine/${mod_id}", - "issues": "https://github.com/LopyMine/${mod_id}/issues" + "sources": "https://github.com/${github_mod_author}/${mod_id}", + "issues": "https://github.com/${github_mod_author}/${mod_id}/issues" }, "license": "${mod_license}", - "icon": "icon/icon.png", - "environment": "*", + "icon": "icon.png", + "environment": "${fabric_trick_side}", "entrypoints": { "main": [ - "net.lopymine.patpat.PatPat" + "net.lopymine.patpat.entrypoint.impl.fabric.FabricCommonEntrypoint" ], "client": [ - "net.lopymine.patpat.client.PatPatClient" + "net.lopymine.patpat.entrypoint.impl.fabric.FabricClientEntrypoint" ], "server": [ - "net.lopymine.patpat.dedicated.PatPatDedicatedServer" + "net.lopymine.patpat.entrypoint.impl.fabric.FabricDedicatedEntrypoint" ], "modmenu": [ - "net.lopymine.patpat.modmenu.ModMenuIntegration" + "net.lopymine.patpat.modmenu.integration.PatPatModMenuIntegration" ] }, "depends": { @@ -35,14 +35,24 @@ "java": ">=${java}", "${fabric_api_id}": "*" }, - "accessWidener": "aws/${minecraft}.accesswidener", + "accessWidener": "${fabric_trick_accesswidener_id}", "mixins": [ - "${mod_id}.mixins.json", - "${mod_id}-geckolib.mixins.json" + "${fabric_trick_mixin_configs}" ], "custom": { "translators": { - "MrLemonHog": "Ukrainian" + "MrLemonHog": "Українська (Україна) (100%)", + "Nuts": "Español (España) (100%)", + "Baymaxawa": "简体中文 (中国大陆) (100%)", + "alinco8": "日本語 (日本) (99%)", + "TastyPommesLul, Clemens Schmidt": "Deutsch (Deutschland) (97%)", + "Hamka": "Polski (Polska) (90%)", + "승수": "한국어 (대한민국) (41%)", + "Balojan": "Tiếng Việt (Việt Nam) (42%)", + "Gallium, Matt TCL": "Français (France) (28%)", + "hectorg22": "Português (Brasil) (23%)", + "okunamayanad": "Türkçe (Türkiye) (23%)", + "Valdemras “a game” Chacha": "Lietuvių (Lietuva) (21%)" }, "modmenu": { "links": { diff --git a/src/main/resources/icon/icon.png b/src/main/resources/icon.png similarity index 100% rename from src/main/resources/icon/icon.png rename to src/main/resources/icon.png diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..145b1200 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "${mod_name}", + "pack_format": 14 + } +} \ No newline at end of file diff --git a/src/main/resources/patpat-controlling.mixins.json5 b/src/main/resources/patpat-controlling.mixins.json5 new file mode 100644 index 00000000..db9a47d2 --- /dev/null +++ b/src/main/resources/patpat-controlling.mixins.json5 @@ -0,0 +1,50 @@ +{ + "required": true, + "package": "net.lopymine.patpat.mixin.controlling", + "refmap": "${mod_id}.refmap.json", + "plugin": "net.lopymine.patpat.compat.controlling.ControllingCompatPlugin", + "compatibilityLevel": "JAVA_${java}", + "mixins": [ + ], + "client": [ + //? controlling && >=1.17.1 { + + //? if >=1.19.4 { + "KeyBindsScreenAccessor", + //?} + + //? if >=1.21 { + "NewKeyBindsScreenModernMixin", + //?} else { + /*"NewKeyBindsScreenMixin", + *///?} + + //? if <1.19.3 { + /*"NewKeyBindsListMixin", + *///?} + + //? if =1.17.1 { + /*"NewKeyBindsListAccessor", + *///?} + + "NewKeyEntryMixin" + //?} + + //? if controlling && <=1.17 { + + /*//? if =1.16.5 { + /^"ControllingKeyBindingListWidgetNewAccessor", + "ControllingKeyEntryMixin", + "ControlsSettingsGuiNewMixin", + ^///?} + + //? if <=1.17 { + /^"ControllingOptionsScreenMixin" + ^///?} + + *///?} + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/patpat.mixins.json5 b/src/main/resources/patpat.mixins.json5 index e9fa367a..5083ec95 100644 --- a/src/main/resources/patpat.mixins.json5 +++ b/src/main/resources/patpat.mixins.json5 @@ -4,33 +4,58 @@ "refmap": "${mod_id}.refmap.json", "compatibilityLevel": "JAVA_${java}", "plugin": "net.lopymine.patpat.compat.PatPatMixinConfigPlugin", - "mixins": [ - ], + "mixins": [], "client": [ "EntityRendererMixin", "LivingEntityRendererMixin", /*? if =1.16.5*/ - /*"TitleScreenMixin",*/ + //"TitleScreenMixin", /*? if >=1.21.2*/ "EntityRenderStateMixin", /*? if <1.19.3*/ - /*"ScreenMixin",*/ + //"ScreenMixin", "MinecraftClientMixin", "CameraMixin", "AbstractClientPlayerEntityMixin", - "ControlsListWidgetMixin", + "KeyEntryMixin", "KeybindingMixin", - "ParentElementMixin", + "KeyboardHandlerMixin", "KeyBindsScreenMixin", - "GameRendererMixin", - "EntityMixin", - "EnderDragonRendererMixin", + + //? if >=1.19.4 { + "KeyBindsScreenAccessor", + //?} + + //? if forge { + /*"forge.MinecraftMixin", + *///?} + + //? if fabric { "ModMenuMixin", - "MultiPlayerGameModeMixin", + //?} + + //? if <=1.21.10 { + /*"GameRendererMixin", + *///?} else { + "LocalPlayerMixin", + //?} + /*? if >=1.21.9 {*/ "LevelRendererMixin", - "FeatureRenderDispatcherMixin" + "FeatureRenderDispatcherMixin", /*?}*/ + + "EntityMixin", + "EnderDragonRendererMixin", + "MultiPlayerGameModeMixin", + + "tests.WindowMixin", + "tests.KeyboardHandlerMixin", + "tests.KeyboardHandlerInvoker", + "tests.MouseHandlerMixin", + "tests.MouseHandlerInvoker", + "tests.AbstractSelectionListInvoker", + "KeyMappingAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/src/test/java/net/lopymine/patpat/client/PatPatClientConfigMigrateTests.java b/src/test/java/net/lopymine/patpat/client/PatPatClientConfigMigrateTests.java index 735b2972..43f80837 100644 --- a/src/test/java/net/lopymine/patpat/client/PatPatClientConfigMigrateTests.java +++ b/src/test/java/net/lopymine/patpat/client/PatPatClientConfigMigrateTests.java @@ -1,6 +1,8 @@ -//? >=1.19.4 { + package net.lopymine.patpat.client; +//? >=1.19.4 && fabric { + import net.lopymine.patpat.client.config.list.PatPatClientPlayerListConfig; import net.minecraft.server.Bootstrap; import net.minecraft.SharedConstants; diff --git a/src/test/java/net/lopymine/patpat/modmenu/bridge/YACLBridgeTest.java b/src/test/java/net/lopymine/patpat/modmenu/bridge/YACLBridgeTest.java index 8174a224..4c289987 100644 --- a/src/test/java/net/lopymine/patpat/modmenu/bridge/YACLBridgeTest.java +++ b/src/test/java/net/lopymine/patpat/modmenu/bridge/YACLBridgeTest.java @@ -1,15 +1,16 @@ package net.lopymine.patpat.modmenu.bridge; -//? if >=1.20.1 { +//? if >=1.20.1 && fabric { import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import net.lopymine.patpat.modmenu.bridge.YACLBridge; class YACLBridgeTest { @Test void testYACLScreenCreate() { - Assertions.assertNotNull(YACLBridge.getScreen(null)); + //? if <=1.21.10 { + /*Assertions.assertNotNull(YACLBridge.getScreen(null)); + *///?} } } diff --git a/src/test/java/net/lopymine/patpat/server/PatPatServerConfigMigrateTests.java b/src/test/java/net/lopymine/patpat/server/PatPatServerConfigMigrateTests.java index 8cc14875..bf5481e3 100644 --- a/src/test/java/net/lopymine/patpat/server/PatPatServerConfigMigrateTests.java +++ b/src/test/java/net/lopymine/patpat/server/PatPatServerConfigMigrateTests.java @@ -1,6 +1,8 @@ -//? >=1.19.4 { + package net.lopymine.patpat.server; +//? >=1.19.4 && fabric{ + import net.lopymine.patpat.server.config.PatPatServerConfig; import net.lopymine.patpat.server.config.migrate.*; import net.lopymine.patpat.util.PathUtils; diff --git a/src/test/java/net/lopymine/patpat/tests/PatPatControllingTest.java b/src/test/java/net/lopymine/patpat/tests/PatPatControllingTest.java new file mode 100644 index 00000000..70403f38 --- /dev/null +++ b/src/test/java/net/lopymine/patpat/tests/PatPatControllingTest.java @@ -0,0 +1,56 @@ +package net.lopymine.patpat.tests; + +import java.nio.file.*; +import java.util.concurrent.TimeUnit; +import net.lopymine.patpat.tests.PatPatTestHarness.Agent; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@Tag("gameTest") +@Tag("controllingGameTest") +public class PatPatControllingTest { + + private static final String SUITE = "controlling"; + private static final String COMBINATION = "CAPS_LOCK+T"; + private static final String EXPECTED_COMBINATION = "key.keyboard.caps.lock+key.keyboard.t"; + + @Test + @Timeout(value = 30, unit = TimeUnit.MINUTES) + void keybindingIsReboundByRealInput() throws Exception { + Path projectDir = Path.of("").toAbsolutePath(); + Path root = projectDir.getParent().getParent(); + String project = projectDir.getFileName().toString(); + + assertTrue(Files.exists(root.resolve("gradlew.bat")) || Files.exists(root.resolve("gradlew")), "Project root not found at " + root); + + try (PatPatTestHarness harness = new PatPatTestHarness(root, project)) { + if (!harness.hasSuiteMods(SUITE)) { + harness.log("Skipping the shaders test, suite '%s' has no mods for this version", SUITE); + return; + } + + harness.prepareSingleplayerDirectory(); + harness.installSuiteAssets(SUITE); + + Agent client = harness.launchClientOne(); + + client.run("PREPARE", ""); + client.run("OPEN_KEY_BINDS", ""); + client.run("SCROLL_TO_KEYBINDING", ""); + client.run("CLICK_KEYBINDING", ""); + client.run("WAIT_TICKS", "10"); + + Path binding = harness.collectScreenshot(client.run("SCREENSHOT", "keybinding_1"), "keybinding_1"); + + client.run("PRESS_KEYS", COMBINATION); + client.run("WAIT_TICKS", "10"); + + Path bound = harness.collectScreenshot(client.run("SCREENSHOT", "keybinding_2"), "keybinding_2"); + + assertEquals(EXPECTED_COMBINATION, client.run("KEYBINDING", ""), "The PatPat keybinding was not rebound to " + COMBINATION); + assertTrue(Files.size(binding) > 0L, "Binding screenshot is empty: " + binding); + assertTrue(Files.size(bound) > 0L, "Bound screenshot is empty: " + bound); + } + } +} diff --git a/src/test/java/net/lopymine/patpat/tests/PatPatKeybindingChangeTest.java b/src/test/java/net/lopymine/patpat/tests/PatPatKeybindingChangeTest.java new file mode 100644 index 00000000..70467401 --- /dev/null +++ b/src/test/java/net/lopymine/patpat/tests/PatPatKeybindingChangeTest.java @@ -0,0 +1,49 @@ +package net.lopymine.patpat.tests; + +import java.nio.file.*; +import java.util.concurrent.TimeUnit; +import net.lopymine.patpat.tests.PatPatTestHarness.Agent; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("gameTest") +@Tag("keybindingGameTest") +public class PatPatKeybindingChangeTest { + + private static final String COMBINATION = "CAPS_LOCK+T"; + private static final String EXPECTED_COMBINATION = "key.keyboard.caps.lock+key.keyboard.t"; + + @Test + @Timeout(value = 30, unit = TimeUnit.MINUTES) + void keybindingIsReboundByRealInput() throws Exception { + Path projectDir = Path.of("").toAbsolutePath(); + Path root = projectDir.getParent().getParent(); + String project = projectDir.getFileName().toString(); + + assertTrue(Files.exists(root.resolve("gradlew.bat")) || Files.exists(root.resolve("gradlew")), "Project root not found at " + root); + + try (PatPatTestHarness harness = new PatPatTestHarness(root, project)) { + harness.prepareSingleplayerDirectory(); + + Agent client = harness.launchClientOne(); + + client.run("PREPARE", ""); + client.run("OPEN_KEY_BINDS", ""); + client.run("SCROLL_TO_KEYBINDING", ""); + client.run("CLICK_KEYBINDING", ""); + client.run("WAIT_TICKS", "10"); + + Path binding = harness.collectScreenshot(client.run("SCREENSHOT", "keybinding_1"), "keybinding_1"); + + client.run("PRESS_KEYS", COMBINATION); + client.run("WAIT_TICKS", "10"); + + Path bound = harness.collectScreenshot(client.run("SCREENSHOT", "keybinding_2"), "keybinding_2"); + + assertEquals(EXPECTED_COMBINATION, client.run("KEYBINDING", ""), "The PatPat keybinding was not rebound to " + COMBINATION); + assertTrue(Files.size(binding) > 0L, "Binding screenshot is empty: " + binding); + assertTrue(Files.size(bound) > 0L, "Bound screenshot is empty: " + bound); + } + } +} diff --git a/src/test/java/net/lopymine/patpat/tests/PatPatShadersPatTest.java b/src/test/java/net/lopymine/patpat/tests/PatPatShadersPatTest.java new file mode 100644 index 00000000..ef81ffa9 --- /dev/null +++ b/src/test/java/net/lopymine/patpat/tests/PatPatShadersPatTest.java @@ -0,0 +1,70 @@ +package net.lopymine.patpat.tests; + +import java.nio.file.*; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import net.lopymine.patpat.tests.PatPatTestHarness.Agent; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("gameTest") +@Tag("shadersGameTest") +public class PatPatShadersPatTest { + + private static final String SUITE = "shaders"; + private static final String SCREENSHOT_PREFIX = "shaders_pat"; + private static final String COW_NAME = "Cow"; + private static final String[] SIDES = {"~ ~ ~3", "~3 ~ ~", "~ ~ ~-3", "~-3 ~ ~"}; + private static final Map CLIENT_JVM_ARGS = Map.of("1.20.1", "-Dsodium.checks.issue2561=false"); + + @Test + @Timeout(value = 30, unit = TimeUnit.MINUTES) + void patIsRenderedFromEverySideWithShaders() throws Exception { + Path projectDir = Path.of("").toAbsolutePath(); + Path root = projectDir.getParent().getParent(); + String project = projectDir.getFileName().toString(); + + assertTrue(Files.exists(root.resolve("gradlew.bat")) || Files.exists(root.resolve("gradlew")), "Project root not found at " + root); + + try (PatPatTestHarness harness = new PatPatTestHarness(root, project)) { + if (!harness.hasSuiteMods(SUITE)) { + harness.log("Skipping the shaders test, suite '%s' has no mods for this version", SUITE); + return; + } + + harness.prepareSingleplayerDirectory(); + harness.installSuiteAssets(SUITE); + + String jvmArgs = CLIENT_JVM_ARGS.getOrDefault(harness.getVersion(), ""); + Agent client = jvmArgs.isEmpty() ? harness.launchClientOne() : harness.launchClientOne("-Ppatpat.test.jvmargs=" + jvmArgs); + + client.run("PREPARE", ""); + client.run("CREATE_WORLD", PatPatTestHarness.WORLD_NAME); + client.run("SETUP_WORLD", ""); + + client.run("RUN_COMMAND", "execute at @p run tp @p ~ ~ ~ 0 0"); + client.run("RUN_COMMAND", "execute at @p run summon minecraft:cow ~ ~ ~2 {NoAI:1b}"); + client.run("WAIT_TICKS", "20"); + + client.run("ENABLE_SHADERS", ""); + client.run("WAIT_TICKS", "20"); + + client.run("LOOK_AT", COW_NAME); + client.run("PAT", COW_NAME); + client.run("WAIT_TICKS", "5"); + + for (int side = 0; side < SIDES.length; side++) { + client.run("RUN_COMMAND", "execute at @e[type=minecraft:cow,limit=1] run tp @p %s".formatted(SIDES[side])); + client.run("WAIT_TICKS", "5"); + client.run("LOOK_AT", COW_NAME); + client.run("WAIT_TICKS", "20"); + + String name = "%s_%d".formatted(SCREENSHOT_PREFIX, side + 1); + String screenshotName = "%s+%s+%s_%d.png".formatted(SCREENSHOT_PREFIX, harness.getVersion(), harness.getLoader(), side + 1); + Path screenshot = harness.collectScreenshotWithCustomName(client.run("SCREENSHOT", name), screenshotName); + assertTrue(Files.size(screenshot) > 0L, "Screenshot is empty: " + screenshot); + } + } + } +} diff --git a/src/test/java/net/lopymine/patpat/tests/PatPatSingleplayerPatTest.java b/src/test/java/net/lopymine/patpat/tests/PatPatSingleplayerPatTest.java new file mode 100644 index 00000000..e70036e5 --- /dev/null +++ b/src/test/java/net/lopymine/patpat/tests/PatPatSingleplayerPatTest.java @@ -0,0 +1,48 @@ +package net.lopymine.patpat.tests; + +import java.nio.file.*; +import java.util.concurrent.TimeUnit; +import net.lopymine.patpat.tests.PatPatTestHarness.Agent; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("gameTest") +@Tag("singleplayerGameTest") +public class PatPatSingleplayerPatTest { + + private static final String SCREENSHOT_NAME = "singleplayer_pat"; + private static final String COW_NAME = "Cow"; + + @Test + @Timeout(value = 30, unit = TimeUnit.MINUTES) + void patOnEntityIsRenderedInSingleplayer() throws Exception { + Path projectDir = Path.of("").toAbsolutePath(); + Path root = projectDir.getParent().getParent(); + String project = projectDir.getFileName().toString(); + + assertTrue(Files.exists(root.resolve("gradlew.bat")) || Files.exists(root.resolve("gradlew")), "Project root not found at " + root); + + try (PatPatTestHarness harness = new PatPatTestHarness(root, project)) { + harness.prepareSingleplayerDirectory(); + + Agent client = harness.launchClientOne(); + + client.run("PREPARE", ""); + client.run("CREATE_WORLD", PatPatTestHarness.WORLD_NAME); + client.run("SETUP_WORLD", ""); + + client.run("RUN_COMMAND", "execute at @p run tp @p ~ ~ ~ 0 0"); + client.run("RUN_COMMAND", "execute at @p run summon minecraft:cow ~ ~ ~2 {NoAI:1b}"); + + client.run("WAIT_TICKS", "20"); + client.run("LOOK_AT", COW_NAME); + client.run("PAT", COW_NAME); + client.run("WAIT_TICKS", "5"); + + Path screenshot = harness.collectScreenshot(client.run("SCREENSHOT", SCREENSHOT_NAME), "singleplayer"); + + assertTrue(Files.size(screenshot) > 0L, "Screenshot is empty: " + screenshot); + } + } +} diff --git a/src/test/java/net/lopymine/patpat/tests/PatPatTestHarness.java b/src/test/java/net/lopymine/patpat/tests/PatPatTestHarness.java new file mode 100644 index 00000000..7e613c7e --- /dev/null +++ b/src/test/java/net/lopymine/patpat/tests/PatPatTestHarness.java @@ -0,0 +1,502 @@ +package net.lopymine.patpat.tests; + +import java.io.*; +import java.net.*; +import java.nio.channels.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.time.LocalTime; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Stream; + +public class PatPatTestHarness implements AutoCloseable { + + public static final String SERVER_HOST = "127.0.0.1"; + public static final int SERVER_PORT_BASE = 25599; + public static final String WORLD_NAME = "patpat_test_world"; + public static final String CLIENT_TWO_NAME = "nikita51"; + public static final String PORT_FILE_NAME = "patpat-test-port.txt"; + + private static final long CONNECT_TIMEOUT_SECONDS = 600L; + private static final long COMMAND_TIMEOUT_SECONDS = 300L; + + private final Path root; + private final String project; + private final String loader; + private final String version; + private final ServerSocket serverSocket; + private final List processes = new ArrayList<>(); + private final Map agents = new ConcurrentHashMap<>(); + private final CountDownLatch expectedAgents = new CountDownLatch(3); + private final FileChannel lockChannel; + private final FileLock lock; + private final int lane; + private Thread shutdownHook; + + public PatPatTestHarness(Path root, String project) throws IOException, InterruptedException { + this.root = root; + this.project = project; + this.loader = project.substring(0, project.indexOf('-')); + this.version = project.substring(project.indexOf('-') + 1); + + Files.createDirectories(root.resolve("build/patpat-tests")); + + int lanes = readParallelRuns(root); + FileLock acquired = null; + FileChannel channel = null; + int acquiredLane = -1; + + while (acquired == null) { + for (int candidate = 1; candidate <= lanes; candidate++) { + channel = FileChannel.open(root.resolve("build/patpat-tests/.lane-%d.lock".formatted(candidate)), + StandardOpenOption.CREATE, StandardOpenOption.WRITE); + acquired = channel.tryLock(); + if (acquired != null) { + acquiredLane = candidate; + break; + } + channel.close(); + } + if (acquired == null) { + Thread.sleep(1000L); + } + } + + this.lockChannel = channel; + this.lock = acquired; + this.lane = acquiredLane; + + this.serverSocket = new ServerSocket(0, 16, InetAddress.getByName(SERVER_HOST)); + this.log("Acquired lane %d of %d (minecraft port %d)", this.lane, lanes, this.getServerPort()); + + Thread acceptor = new Thread(this::acceptLoop, "patpat-test-harness-acceptor"); + acceptor.setDaemon(true); + acceptor.start(); + + this.shutdownHook = new Thread(this::forceCleanup, "patpat-test-harness-shutdown"); + Runtime.getRuntime().addShutdownHook(this.shutdownHook); + } + + private void forceCleanup() { + for (Process process : this.processes) { + destroyTree(process.toHandle()); + } + try { + deleteLanePortFiles(); + } catch (IOException ignored) { + // nothing to do + } + } + + public String getLoader() { + return this.loader; + } + + public String getVersion() { + return this.version; + } + + public int getServerPort() { + return SERVER_PORT_BASE + this.lane; + } + + private Path laneDir(String name) { + return this.root.resolve("runs/tests/%d_%s".formatted(this.lane, name)); + } + + private void deleteLanePortFiles() throws IOException { + for (String name : List.of("server", "client", "client_" + CLIENT_TWO_NAME)) { + Files.deleteIfExists(this.laneDir(name).resolve(PORT_FILE_NAME)); + } + } + + private static int readParallelRuns(Path root) throws IOException { + Properties properties = new Properties(); + try (InputStream stream = Files.newInputStream(root.resolve("gradle.properties"))) { + properties.load(stream); + } + try { + return Math.max(1, Integer.parseInt(properties.getProperty("tests.parallel_runs", "1").trim())); + } catch (NumberFormatException e) { + return 1; + } + } + + public void log(String message, Object... arguments) { + System.out.printf("[%s] [%s] %s%n", LocalTime.now().truncatedTo(ChronoUnit.MILLIS), this.project, message.formatted(arguments)); + } + + public int getPort() { + return this.serverSocket.getLocalPort(); + } + + public void awaitServerAcceptingConnections() throws InterruptedException { + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(CONNECT_TIMEOUT_SECONDS); + while (System.nanoTime() < deadline) { + try (Socket probe = new Socket()) { + probe.connect(new InetSocketAddress(SERVER_HOST, this.getServerPort()), 1000); + this.log("Minecraft server is accepting connections on %s:%d", SERVER_HOST, this.getServerPort()); + return; + } catch (IOException e) { + this.assertProcessesAlive(); + Thread.sleep(500L); + } + } + throw new AssertionError("Minecraft server did not start listening on %s:%d".formatted(SERVER_HOST, this.getServerPort())); + } + + public Path collectScreenshotWithCustomName(String sourcePath, String name) throws IOException { + Path target = this.root.resolve("runs-tests").resolve(name); + Files.createDirectories(target.getParent()); + Files.copy(Path.of(sourcePath), target, StandardCopyOption.REPLACE_EXISTING); + return target; + } + + public Path collectScreenshot(String sourcePath, String player) throws IOException { + Path target = this.root.resolve("runs-tests").resolve("%s+%s+%s.png".formatted(player, this.version, this.loader)); + Files.createDirectories(target.getParent()); + Files.copy(Path.of(sourcePath), target, StandardCopyOption.REPLACE_EXISTING); + return target; + } + + public void prepareServerDirectory() throws IOException { + for (String name : List.of("server", "client", "client_" + CLIENT_TWO_NAME)) { + Path dir = this.laneDir(name); + Files.createDirectories(dir); + deleteRecursively(dir.resolve("config")); + Files.writeString(dir.resolve(PORT_FILE_NAME), String.valueOf(this.getPort())); + } + + Path serverDir = this.laneDir("server"); + Files.writeString(serverDir.resolve("eula.txt"), "eula=true\n"); + + String properties = String.join("\n", + "online-mode=false", + "server-ip=" + SERVER_HOST, + "server-port=" + this.getServerPort(), + "level-name=" + WORLD_NAME, + "level-type=flat", + "generate-structures=false", + "level-seed=patpat", + "gamemode=creative", + "force-gamemode=true", + "difficulty=peaceful", + "spawn-monsters=false", + "spawn-animals=false", + "spawn-npcs=false", + "allow-flight=true", + "spawn-protection=0", + "max-players=4", + "view-distance=8", + "simulation-distance=8", + "sync-chunk-writes=false", + "enable-status=false", + "motd=PatPat Test" + ); + Files.writeString(serverDir.resolve("server.properties"), properties + "\n"); + + deleteRecursively(serverDir.resolve(WORLD_NAME)); + } + + public void prepareSingleplayerDirectory() throws IOException { + Path dir = this.laneDir("client"); + Files.createDirectories(dir); + deleteRecursively(dir.resolve("config")); + deleteRecursively(dir.resolve("mods")); + deleteRecursively(dir.resolve("shaderpacks")); + deleteRecursively(dir.resolve("saves").resolve(WORLD_NAME)); + Files.writeString(dir.resolve(PORT_FILE_NAME), String.valueOf(this.getPort())); + } + + private Path suiteDir(String suite) { + return this.root.resolve("versions").resolve(this.project).resolve("tests").resolve(suite); + } + + public boolean hasSuiteMods(String suite) { + Path mods = this.suiteDir(suite).resolve("mods"); + if (!Files.isDirectory(mods)) { + return false; + } + try (Stream stream = Files.list(mods)) { + return stream.anyMatch(path -> path.getFileName().toString().endsWith(".jar")); + } catch (IOException e) { + return false; + } + } + + public void installSuiteAssets(String suite) throws IOException { + Path source = this.suiteDir(suite); + if (!Files.isDirectory(source)) { + return; + } + Path dest = this.laneDir("client"); + try (Stream stream = Files.list(source)) { + List directories = stream.filter(Files::isDirectory).toList(); + for (Path directory : directories) { + Path target = dest.resolve(directory.getFileName().toString()); + deleteRecursively(target); + copyRecursively(directory, target); + } + } + this.log("Installed suite '%s' assets into %s", suite, dest); + } + + private static void copyRecursively(Path source, Path target) throws IOException { + try (Stream stream = Files.walk(source)) { + List entries = stream.toList(); + for (Path entry : entries) { + Path resolved = target.resolve(source.relativize(entry).toString()); + if (Files.isDirectory(entry)) { + Files.createDirectories(resolved); + } else { + Files.createDirectories(resolved.getParent()); + Files.copy(entry, resolved, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } + + public void assertServerPortIsFree() { + try (Socket probe = new Socket()) { + probe.connect(new InetSocketAddress(SERVER_HOST, this.getServerPort()), 1000); + } catch (IOException e) { + return; + } + throw new AssertionError("Port %d is already in use, a previous test run is probably still alive".formatted(this.getServerPort())); + } + + public Agent launchServer(String... arguments) throws IOException, InterruptedException { + this.processes.add(this.launch("runServerTest", "server", arguments)); + return this.awaitAgent("server"); + } + + public Agent launchClientOne(String... arguments) throws IOException, InterruptedException { + this.processes.add(this.launch("runClientTest", "client", arguments)); + return this.awaitAgent("client1"); + } + + public Agent launchClientTwo(String... arguments) throws IOException, InterruptedException { + this.processes.add(this.launch("runClientTest_" + CLIENT_TWO_NAME, "client2", arguments)); + return this.awaitAgent("client2"); + } + + private Process launch(String task, String logName, String... arguments) throws IOException { + String wrapper = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("win") ? "gradlew.bat" : "gradlew"; + + List command = new ArrayList<>(List.of( + this.root.resolve(wrapper).toString(), + ":%s:%s".formatted(this.project, task), + "-Ppatpat.test.port=" + this.getPort(), + "-Pmossy.lane=" + this.lane, + "--configure-on-demand", + "--console=plain" + )); + + command.addAll(List.of(arguments)); + + Path logDir = this.root.resolve("build/patpat-tests"); + Files.createDirectories(logDir); + + ProcessBuilder builder = new ProcessBuilder(command); + builder.directory(this.root.toFile()); + builder.redirectErrorStream(true); + builder.redirectOutput(logDir.resolve("%s-%s.log".formatted(this.project, logName)).toFile()); + + this.log("Launching %s (log: %s-%s.log)", task, this.project, logName); + return builder.start(); + } + + private void acceptLoop() { + while (!this.serverSocket.isClosed()) { + try { + Socket socket = this.serverSocket.accept(); + socket.setTcpNoDelay(true); + new Agent(socket); + } catch (IOException e) { + return; + } + } + } + + public Agent awaitAgent(String key) throws InterruptedException { + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(CONNECT_TIMEOUT_SECONDS); + while (System.nanoTime() < deadline) { + Agent agent = this.agents.get(key); + if (agent != null) { + this.log("Agent '%s' is ready", key); + return agent; + } + this.assertProcessesAlive(); + Thread.sleep(250L); + } + throw new AssertionError("Agent '%s' did not connect in time".formatted(key)); + } + + private void assertProcessesAlive() { + for (Process process : this.processes) { + if (!process.isAlive() && process.exitValue() != 0) { + throw new AssertionError("A game process died with exit code %d, see build/patpat-tests/*.log".formatted(process.exitValue())); + } + } + } + + private static void destroyTree(ProcessHandle handle) { + handle.descendants().forEach(ProcessHandle::destroyForcibly); + handle.destroyForcibly(); + } + + private static void deleteRecursively(Path path) throws IOException { + if (!Files.exists(path)) { + return; + } + try (Stream stream = Files.walk(path)) { + stream.sorted(Comparator.reverseOrder()).forEach(entry -> { + try { + Files.delete(entry); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + } + + @Override + public void close() { + try { + Runtime.getRuntime().removeShutdownHook(this.shutdownHook); + } catch (IllegalStateException ignored) { + // the JVM is already shutting down, the hook is running anyway + } + + for (Agent agent : this.agents.values()) { + try { + agent.send("QUIT", ""); + } catch (Exception ignored) { + // the process is going away anyway + } + } + for (Process process : this.processes) { + try { + if (process.waitFor(20L, TimeUnit.SECONDS)) { + continue; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + destroyTree(process.toHandle()); + } + for (Process process : this.processes) { + try { + process.waitFor(20L, TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + try { + deleteLanePortFiles(); + } catch (IOException ignored) { + // nothing to do + } + try { + this.lock.release(); + this.lockChannel.close(); + } catch (IOException ignored) { + // nothing to do + } + try { + this.serverSocket.close(); + } catch (IOException ignored) { + // nothing to do + } + } + + public class Agent { + + private final Socket socket; + private final BufferedWriter writer; + private final Map> pending = new ConcurrentHashMap<>(); + private String key = "?"; + private int nextId = 1; + + private Agent(Socket socket) throws IOException { + this.socket = socket; + this.writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)); + + Thread reader = new Thread(this::readLoop, "patpat-test-harness-reader"); + reader.setDaemon(true); + reader.start(); + } + + private void readLoop() { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + String[] parts = line.trim().split(" ", 3); + if (parts.length < 2) { + continue; + } + if ("HELLO".equals(parts[1])) { + this.register(parts.length > 2 ? parts[2] : ""); + continue; + } + CompletableFuture future = this.pending.remove(Integer.parseInt(parts[0])); + if (future == null) { + continue; + } + if ("OK".equals(parts[1])) { + future.complete(parts.length > 2 ? parts[2] : ""); + } else { + future.completeExceptionally(new AssertionError(parts.length > 2 ? parts[2] : "unknown error")); + } + } + } catch (IOException ignored) { + // connection closed + } + this.pending.values().forEach(future -> future.completeExceptionally(new AssertionError("Agent disconnected"))); + } + + private void register(String payload) { + String[] parts = payload.trim().split(" ", 2); + String role = parts[0]; + String name = parts.length > 1 ? parts[1] : ""; + + if ("SERVER".equals(role)) { + this.key = "server"; + } else { + this.key = CLIENT_TWO_NAME.equals(name) ? "client2" : "client1"; + } + PatPatTestHarness.this.log("Connected: %s (%s)", this.key, name); + PatPatTestHarness.this.agents.put(this.key, this); + PatPatTestHarness.this.expectedAgents.countDown(); + } + + public CompletableFuture send(String command, String argument) { + int id = this.nextId++; + CompletableFuture future = new CompletableFuture<>(); + this.pending.put(id, future); + PatPatTestHarness.this.log("%s <- %s %s", this.key, command, argument); + try { + this.writer.write("%d %s %s".formatted(id, command, argument)); + this.writer.write('\n'); + this.writer.flush(); + } catch (IOException e) { + future.completeExceptionally(e); + } + return future; + } + + public String run(String command, String argument) throws Exception { + long startedAt = System.nanoTime(); + try { + String result = this.send(command, argument).get(COMMAND_TIMEOUT_SECONDS, TimeUnit.SECONDS); + PatPatTestHarness.this.log("%s -> %s done in %d ms%s", this.key, command, (System.nanoTime() - startedAt) / 1_000_000L, result.isBlank() ? "" : " (" + result + ")"); + return result; + } catch (Exception e) { + PatPatTestHarness.this.log("%s -> %s FAILED: %s", this.key, command, e.getMessage()); + throw e; + } + } + } +} diff --git a/src/test/java/net/lopymine/patpat/tests/PatPatTwoPlayersPatTest.java b/src/test/java/net/lopymine/patpat/tests/PatPatTwoPlayersPatTest.java new file mode 100644 index 00000000..36cd80f9 --- /dev/null +++ b/src/test/java/net/lopymine/patpat/tests/PatPatTwoPlayersPatTest.java @@ -0,0 +1,91 @@ +package net.lopymine.patpat.tests; + +import java.nio.file.*; +import java.util.concurrent.*; +import net.lopymine.patpat.tests.PatPatTestHarness.Agent; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("gameTest") +@Tag("twoPlayersGameTest") +public class PatPatTwoPlayersPatTest { + + private static final String SCREENSHOT_NAME = "two_players_pat"; + private static final long PACKET_TIMEOUT_SECONDS = 5L; + + @Test + @Timeout(value = 30, unit = TimeUnit.MINUTES) + void patBetweenTwoPlayersIsRenderedOnTheReceiver() throws Exception { + Path projectDir = Path.of("").toAbsolutePath(); + Path root = projectDir.getParent().getParent(); + String project = projectDir.getFileName().toString(); + + assertTrue(Files.exists(root.resolve("gradlew.bat")) || Files.exists(root.resolve("gradlew")), "Project root not found at " + root); + + try (PatPatTestHarness harness = new PatPatTestHarness(root, project)) { + harness.assertServerPortIsFree(); + harness.prepareServerDirectory(); + + Agent server = harness.launchServer(); + harness.awaitServerAcceptingConnections(); + + Agent client1 = harness.launchClientOne(); + Agent client2 = harness.launchClientTwo(); + + client1.run("PREPARE", ""); + client2.run("PREPARE", ""); + + String address = "%s:%d".formatted(PatPatTestHarness.SERVER_HOST, harness.getServerPort()); + client1.run("JOIN", address); + client2.run("JOIN", address); + + server.run("WAIT_PLAYERS", "2"); + + for (String command : new String[]{ + "gamerule doDaylightCycle false", + "gamerule doWeatherCycle false", + "gamerule doMobSpawning false", + "gamerule randomTickSpeed 0", + "gamerule doFireTick false", + "gamerule sendCommandFeedback false", + "time set noon", + "weather clear" + }) { + server.run("RUN_COMMAND", command); + } + + String clientOneName = "LopyMine"; + client1.run("WAIT_TICKS", "20"); + client2.run("WAIT_TICKS", "20"); + + server.run("RUN_COMMAND", "execute at %s run tp %s 0.5 ~ 0.5".formatted(clientOneName, clientOneName)); + server.run("RUN_COMMAND", "execute at %s run tp %s 2.5 ~ 0.5".formatted(PatPatTestHarness.CLIENT_TWO_NAME, PatPatTestHarness.CLIENT_TWO_NAME)); + + client1.run("WAIT_TICKS", "20"); + client2.run("WAIT_TICKS", "20"); + + client2.run("CAMERA", "THIRD_PERSON_BACK"); + client2.run("LOOK_AT", clientOneName); + client1.run("LOOK_AT", PatPatTestHarness.CLIENT_TWO_NAME); + + CompletableFuture patReceived = client2.send("WAIT_PAT", "SELF"); + + client1.run("PAT", PatPatTestHarness.CLIENT_TWO_NAME); + + try { + patReceived.get(PACKET_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } catch (TimeoutException e) { + fail("Pat packet did not reach %s within %d seconds".formatted(PatPatTestHarness.CLIENT_TWO_NAME, PACKET_TIMEOUT_SECONDS)); + } + + client2.run("WAIT_TICKS", "5"); + + Path receiver = harness.collectScreenshot(client2.run("SCREENSHOT", SCREENSHOT_NAME), "player_2"); + Path sender = harness.collectScreenshot(client1.run("SCREENSHOT", SCREENSHOT_NAME), "player_1"); + + assertTrue(Files.size(receiver) > 0L, "Receiver screenshot is empty: " + receiver); + assertTrue(Files.size(sender) > 0L, "Sender screenshot is empty: " + sender); + } + } +} diff --git a/stonecutter.gradle b/stonecutter.gradle index 19880d1d..6bf776a6 100644 --- a/stonecutter.gradle +++ b/stonecutter.gradle @@ -1,5 +1,4 @@ plugins { id "dev.kikugie.stonecutter" - id "net.lopymine.mossy-plugin-stonecutter" + id "net.lopymine.mossy-plugin-stonecutter" version "$mossy_plugin_version" } -stonecutter.active "1.21.10" /* [SC] DO NOT EDIT */ diff --git a/versions/1.21.2/gradle.properties b/versions/1.21.2/gradle.properties deleted file mode 100644 index fe302f82..00000000 --- a/versions/1.21.2/gradle.properties +++ /dev/null @@ -1,24 +0,0 @@ -# Versioned Properties -# Tip: You can set any dependency value to "[UPDATE]" -# and reload Gradle to update only it's value. - -# Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.2+build.1 -build.fabric_api=0.106.1+1.21.2 -build.fabric-permissions-api = 0.3.3 - -# Additional Dependencies Properties -# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.2&l=fabric -dep.cloth-config=16.0.143+fabric -# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.2&l=fabric -dep.flashback=0.13.0 -# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.2&l=fabric -dep.modmenu=12.0.0 -# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.2&l=fabric -dep.yacl=3.6.6+1.21.3-fabric -# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.2&l=fabric -dep.replaymod=1.21.2-2.6.21 -# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.2&l=fabric -dep.geckolib=unknown -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.2&l=fabric -dep.proxlib=0.2.4+1.21 \ No newline at end of file diff --git a/versions/1.21.3/gradle.properties b/versions/1.21.3/gradle.properties deleted file mode 100644 index 5a1a3f61..00000000 --- a/versions/1.21.3/gradle.properties +++ /dev/null @@ -1,24 +0,0 @@ -# Versioned Properties -# Tip: You can set any dependency value to "[UPDATE]" -# and reload Gradle to update only it's value. - -# Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.3+build.2 -build.fabric_api=0.114.0+1.21.3 -build.fabric-permissions-api = 0.3.3 - -# Additional Dependencies Properties -# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.3&l=fabric -dep.cloth-config=16.0.143+fabric -# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.3&l=fabric -dep.flashback=0.13.0 -# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.3&l=fabric -dep.modmenu=12.0.0 -# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.3&l=fabric -dep.yacl=3.6.6+1.21.3-fabric -# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.3&l=fabric -dep.replaymod=1.21.2-2.6.21 -# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.3&l=fabric -dep.geckolib=4.7.1 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.3&l=fabric -dep.proxlib=0.2.4+1.21 \ No newline at end of file diff --git a/versions/LICENSE-NOTICE.md b/versions/LICENSE-NOTICE.md new file mode 100644 index 00000000..74fe8ff9 --- /dev/null +++ b/versions/LICENSE-NOTICE.md @@ -0,0 +1,2 @@ +PatPat is licensed under LGPL-3.0-only. That license does **not** cover anything inside `versions/*/tests/*`. +Those directories contain third-party artifacts (mods, shader packs and other assets) downloaded automatically to run the game tests. They are not part of PatPat, are not distributed with the mod, and each one remains the property of its respective authors under its own license and terms. diff --git a/versions/active.txt b/versions/active.txt new file mode 100644 index 00000000..91d5ae45 --- /dev/null +++ b/versions/active.txt @@ -0,0 +1 @@ +fabric-26.1 \ No newline at end of file diff --git a/versions/1.16.5/gradle.properties b/versions/fabric-1.16.5/gradle.properties similarity index 62% rename from versions/1.16.5/gradle.properties rename to versions/fabric-1.16.5/gradle.properties index 79a19f32..0a875764 100644 --- a/versions/1.16.5/gradle.properties +++ b/versions/fabric-1.16.5/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.16.5+build.10 build.fabric_api=0.42.0+1.16 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.16.5&l=fabric -dep.cloth-config=4.17.101 +dep.cloth-config=xMTUxQCV # flashback, check https://modrinth.com/mod/flashback/versions?g=1.16.5&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.16.5&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.16.5&l=fabric +dep.iris=1.4.5+1.16.5 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.16.5&l=fabric +dep.controlling=Qt19ymXV +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.16.5&l=fabric +dep.searchables=tRemkGX1 # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.16.5&l=fabric -dep.modmenu=1.16.23 +dep.modmenu=aShj7736 # yacl, check https://modrinth.com/mod/yacl/versions?g=1.16.5&l=fabric dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.16.5&l=fabric +dep.sodium=mc1.16.5-0.2.0 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.16.5&l=fabric -dep.replaymod=1.16.4-2.6.20 +dep.replaymod=9iPcalHg # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.16.5&l=fabric -dep.geckolib=3.0.106 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.16.5&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=UQGoJDhn diff --git a/versions/fabric-1.16.5/tests/commands/mods/LuckPerms-Fabric-5.3.9.jar b/versions/fabric-1.16.5/tests/commands/mods/LuckPerms-Fabric-5.3.9.jar new file mode 100644 index 00000000..a087a1c9 Binary files /dev/null and b/versions/fabric-1.16.5/tests/commands/mods/LuckPerms-Fabric-5.3.9.jar differ diff --git a/versions/fabric-1.16.5/tests/controlling/mods/Controlling-For-Fabric-1.1.3.jar b/versions/fabric-1.16.5/tests/controlling/mods/Controlling-For-Fabric-1.1.3.jar new file mode 100644 index 00000000..0742d134 Binary files /dev/null and b/versions/fabric-1.16.5/tests/controlling/mods/Controlling-For-Fabric-1.1.3.jar differ diff --git a/versions/fabric-1.16.5/tests/controlling/mods/Searchables-fabric-1.16.5-1.0.7-dev.jar b/versions/fabric-1.16.5/tests/controlling/mods/Searchables-fabric-1.16.5-1.0.7-dev.jar new file mode 100644 index 00000000..51a5a654 Binary files /dev/null and b/versions/fabric-1.16.5/tests/controlling/mods/Searchables-fabric-1.16.5-1.0.7-dev.jar differ diff --git a/versions/fabric-1.16.5/tests/shaders/mods/iris-mc1.16.5-1.4.5.jar b/versions/fabric-1.16.5/tests/shaders/mods/iris-mc1.16.5-1.4.5.jar new file mode 100644 index 00000000..324c3859 Binary files /dev/null and b/versions/fabric-1.16.5/tests/shaders/mods/iris-mc1.16.5-1.4.5.jar differ diff --git a/versions/fabric-1.16.5/tests/shaders/mods/sodium-fabric-mc1.16.5-0.2.0+build.4.jar b/versions/fabric-1.16.5/tests/shaders/mods/sodium-fabric-mc1.16.5-0.2.0+build.4.jar new file mode 100644 index 00000000..b515495a Binary files /dev/null and b/versions/fabric-1.16.5/tests/shaders/mods/sodium-fabric-mc1.16.5-0.2.0+build.4.jar differ diff --git a/versions/fabric-1.16.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.16.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.16.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.17.1/gradle.properties b/versions/fabric-1.17.1/gradle.properties similarity index 64% rename from versions/1.17.1/gradle.properties rename to versions/fabric-1.17.1/gradle.properties index b970f364..2a354dfe 100644 --- a/versions/1.17.1/gradle.properties +++ b/versions/fabric-1.17.1/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.17.1+build.65 build.fabric_api=0.46.1+1.17 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.17.1&l=fabric -dep.cloth-config=5.3.63 +dep.cloth-config=gb0cZ2Qp # flashback, check https://modrinth.com/mod/flashback/versions?g=1.17.1&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.17.1&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.17.1&l=fabric +dep.iris=pkGrlTNQ +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.17.1&l=fabric +dep.controlling=yhUO28QC +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.17.1&l=fabric +dep.searchables=YrZSPg5T # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.17.1&l=fabric -dep.modmenu=2.0.17 +dep.modmenu=7kh2ofyR # yacl, check https://modrinth.com/mod/yacl/versions?g=1.17.1&l=fabric dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.17.1&l=fabric +dep.sodium=mc1.17.1-0.3.4 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.17.1&l=fabric dep.replaymod=1.17.1-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.17.1&l=fabric -dep.geckolib=3.0.15 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.17.1&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=qL484XIi diff --git a/versions/fabric-1.17.1/tests/commands/mods/LuckPerms-Fabric-5.3.84.jar b/versions/fabric-1.17.1/tests/commands/mods/LuckPerms-Fabric-5.3.84.jar new file mode 100644 index 00000000..44c97cd9 Binary files /dev/null and b/versions/fabric-1.17.1/tests/commands/mods/LuckPerms-Fabric-5.3.84.jar differ diff --git a/versions/fabric-1.17.1/tests/controlling/mods/Controlling-fabric-1.17.1-8.0.12.jar b/versions/fabric-1.17.1/tests/controlling/mods/Controlling-fabric-1.17.1-8.0.12.jar new file mode 100644 index 00000000..dcb41462 Binary files /dev/null and b/versions/fabric-1.17.1/tests/controlling/mods/Controlling-fabric-1.17.1-8.0.12.jar differ diff --git a/versions/fabric-1.17.1/tests/controlling/mods/Searchables-fabric-1.17.1-1.0.1.jar b/versions/fabric-1.17.1/tests/controlling/mods/Searchables-fabric-1.17.1-1.0.1.jar new file mode 100644 index 00000000..423b2879 Binary files /dev/null and b/versions/fabric-1.17.1/tests/controlling/mods/Searchables-fabric-1.17.1-1.0.1.jar differ diff --git a/versions/fabric-1.17.1/tests/shaders/mods/iris-mc1.17.1-1.2.7.jar b/versions/fabric-1.17.1/tests/shaders/mods/iris-mc1.17.1-1.2.7.jar new file mode 100644 index 00000000..53ebb6cb Binary files /dev/null and b/versions/fabric-1.17.1/tests/shaders/mods/iris-mc1.17.1-1.2.7.jar differ diff --git a/versions/fabric-1.17.1/tests/shaders/mods/sodium-fabric-mc1.17.1-0.3.4+build.13.jar b/versions/fabric-1.17.1/tests/shaders/mods/sodium-fabric-mc1.17.1-0.3.4+build.13.jar new file mode 100644 index 00000000..4da4aa5d Binary files /dev/null and b/versions/fabric-1.17.1/tests/shaders/mods/sodium-fabric-mc1.17.1-0.3.4+build.13.jar differ diff --git a/versions/fabric-1.17.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.17.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.17.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.17/gradle.properties b/versions/fabric-1.17/gradle.properties similarity index 65% rename from versions/1.17/gradle.properties rename to versions/fabric-1.17/gradle.properties index 8d2948e8..e2872155 100644 --- a/versions/1.17/gradle.properties +++ b/versions/fabric-1.17/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.17+build.13 build.fabric_api=0.36.0+1.17 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.17&l=fabric -dep.cloth-config=5.3.63 +dep.cloth-config=gb0cZ2Qp # flashback, check https://modrinth.com/mod/flashback/versions?g=1.17&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.17&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.17&l=fabric +dep.iris=mc1.17-v1.1.1 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.17&l=fabric +dep.controlling=lmlQP29s +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.17&l=fabric +dep.searchables=unknown # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.17&l=fabric -dep.modmenu=2.0.17 +dep.modmenu=7kh2ofyR # yacl, check https://modrinth.com/mod/yacl/versions?g=1.17&l=fabric dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.17&l=fabric +dep.sodium=mc1.17.1-0.3.4 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.17&l=fabric dep.replaymod=1.17-2.6.11 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.17&l=fabric dep.geckolib=unknown -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.17&l=fabric -dep.proxlib=unknown \ No newline at end of file diff --git a/versions/fabric-1.17/libs/iris-mc1.17-1.1.1.jar b/versions/fabric-1.17/libs/iris-mc1.17-1.1.1.jar new file mode 100644 index 00000000..bc6cd359 Binary files /dev/null and b/versions/fabric-1.17/libs/iris-mc1.17-1.1.1.jar differ diff --git a/versions/fabric-1.17/tests/commands/mods/LuckPerms-Fabric-5.3.84.jar b/versions/fabric-1.17/tests/commands/mods/LuckPerms-Fabric-5.3.84.jar new file mode 100644 index 00000000..44c97cd9 Binary files /dev/null and b/versions/fabric-1.17/tests/commands/mods/LuckPerms-Fabric-5.3.84.jar differ diff --git a/versions/fabric-1.17/tests/controlling/mods/Controlling-For-Fabric-1.2.0.jar b/versions/fabric-1.17/tests/controlling/mods/Controlling-For-Fabric-1.2.0.jar new file mode 100644 index 00000000..ea92b543 Binary files /dev/null and b/versions/fabric-1.17/tests/controlling/mods/Controlling-For-Fabric-1.2.0.jar differ diff --git a/versions/fabric-1.17/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.17/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.17/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.18.1/gradle.properties b/versions/fabric-1.18.1/gradle.properties similarity index 65% rename from versions/1.18.1/gradle.properties rename to versions/fabric-1.18.1/gradle.properties index a3ed03c7..a1605e2a 100644 --- a/versions/1.18.1/gradle.properties +++ b/versions/fabric-1.18.1/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.18.1+build.22 build.fabric_api=0.46.6+1.18 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.18.1&l=fabric -dep.cloth-config=6.5.102 +dep.cloth-config=BLMp2TRt # flashback, check https://modrinth.com/mod/flashback/versions?g=1.18.1&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18.1&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.18.1&l=fabric +dep.iris=I6p5WO3q +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.18.1&l=fabric +dep.controlling=Rp48Zp8p +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.18.1&l=fabric +dep.searchables=unknown # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.18.1&l=fabric -dep.modmenu=3.0.1 +dep.modmenu=eueI9czw # yacl, check https://modrinth.com/mod/yacl/versions?g=1.18.1&l=fabric dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.18.1&l=fabric +dep.sodium=mc1.18.1-0.4.0-alpha6 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.18.1&l=fabric dep.replaymod=1.18.1-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.18.1&l=fabric dep.geckolib=unknown -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18.1&l=fabric -dep.proxlib=unknown \ No newline at end of file diff --git a/versions/fabric-1.18.1/tests/commands/mods/LuckPerms-Fabric-5.4.25.jar b/versions/fabric-1.18.1/tests/commands/mods/LuckPerms-Fabric-5.4.25.jar new file mode 100644 index 00000000..254a1228 Binary files /dev/null and b/versions/fabric-1.18.1/tests/commands/mods/LuckPerms-Fabric-5.4.25.jar differ diff --git a/versions/fabric-1.18.1/tests/controlling/mods/Controlling-fabric-1.18.1-9.0+15.jar b/versions/fabric-1.18.1/tests/controlling/mods/Controlling-fabric-1.18.1-9.0+15.jar new file mode 100644 index 00000000..b87475ec Binary files /dev/null and b/versions/fabric-1.18.1/tests/controlling/mods/Controlling-fabric-1.18.1-9.0+15.jar differ diff --git a/versions/fabric-1.18.1/tests/shaders/mods/iris-mc1.18.1-1.2.0-pre.jar b/versions/fabric-1.18.1/tests/shaders/mods/iris-mc1.18.1-1.2.0-pre.jar new file mode 100644 index 00000000..2620e949 Binary files /dev/null and b/versions/fabric-1.18.1/tests/shaders/mods/iris-mc1.18.1-1.2.0-pre.jar differ diff --git a/versions/fabric-1.18.1/tests/shaders/mods/sodium-fabric-mc1.18.1-0.4.0-alpha6+build.14.jar b/versions/fabric-1.18.1/tests/shaders/mods/sodium-fabric-mc1.18.1-0.4.0-alpha6+build.14.jar new file mode 100644 index 00000000..1a199374 Binary files /dev/null and b/versions/fabric-1.18.1/tests/shaders/mods/sodium-fabric-mc1.18.1-0.4.0-alpha6+build.14.jar differ diff --git a/versions/fabric-1.18.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.18.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.18.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.18.2/gradle.properties b/versions/fabric-1.18.2/gradle.properties similarity index 64% rename from versions/1.18.2/gradle.properties rename to versions/fabric-1.18.2/gradle.properties index 48774af4..6c0e1bc9 100644 --- a/versions/1.18.2/gradle.properties +++ b/versions/fabric-1.18.2/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.18.2+build.4 build.fabric_api=0.77.0+1.18.2 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.18.2&l=fabric -dep.cloth-config=6.5.102 +dep.cloth-config=BLMp2TRt # flashback, check https://modrinth.com/mod/flashback/versions?g=1.18.2&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18.2&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.18.2&l=fabric +dep.iris=1.6.11+1.18.2 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.18.2&l=fabric +dep.controlling=dK5FXxsD +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.18.2&l=fabric +dep.searchables=usRpLoA5 # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.18.2&l=fabric -dep.modmenu=3.2.5 +dep.modmenu=nVxObSbX # yacl, check https://modrinth.com/mod/yacl/versions?g=1.18.2&l=fabric dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.18.2&l=fabric +dep.sodium=mc1.18.2-0.4.1 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.18.2&l=fabric dep.replaymod=1.18.2-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.18.2&l=fabric -dep.geckolib=3.0.57 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18.2&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=wwh0ZFLu diff --git a/versions/fabric-1.18.2/tests/commands/mods/LuckPerms-Fabric-5.4.25.jar b/versions/fabric-1.18.2/tests/commands/mods/LuckPerms-Fabric-5.4.25.jar new file mode 100644 index 00000000..254a1228 Binary files /dev/null and b/versions/fabric-1.18.2/tests/commands/mods/LuckPerms-Fabric-5.4.25.jar differ diff --git a/versions/fabric-1.18.2/tests/controlling/mods/Controlling-fabric-1.18.2-9.0+23.jar b/versions/fabric-1.18.2/tests/controlling/mods/Controlling-fabric-1.18.2-9.0+23.jar new file mode 100644 index 00000000..31d633bd Binary files /dev/null and b/versions/fabric-1.18.2/tests/controlling/mods/Controlling-fabric-1.18.2-9.0+23.jar differ diff --git a/versions/fabric-1.18.2/tests/controlling/mods/Searchables-fabric-1.18.2-1.0.1.jar b/versions/fabric-1.18.2/tests/controlling/mods/Searchables-fabric-1.18.2-1.0.1.jar new file mode 100644 index 00000000..4630b8b6 Binary files /dev/null and b/versions/fabric-1.18.2/tests/controlling/mods/Searchables-fabric-1.18.2-1.0.1.jar differ diff --git a/versions/fabric-1.18.2/tests/shaders/mods/iris-mc1.18.2-1.6.11.jar b/versions/fabric-1.18.2/tests/shaders/mods/iris-mc1.18.2-1.6.11.jar new file mode 100644 index 00000000..8bb1400e Binary files /dev/null and b/versions/fabric-1.18.2/tests/shaders/mods/iris-mc1.18.2-1.6.11.jar differ diff --git a/versions/fabric-1.18.2/tests/shaders/mods/sodium-fabric-mc1.18.2-0.4.1+build.15.jar b/versions/fabric-1.18.2/tests/shaders/mods/sodium-fabric-mc1.18.2-0.4.1+build.15.jar new file mode 100644 index 00000000..4718295e Binary files /dev/null and b/versions/fabric-1.18.2/tests/shaders/mods/sodium-fabric-mc1.18.2-0.4.1+build.15.jar differ diff --git a/versions/fabric-1.18.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.18.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.18.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.18/gradle.properties b/versions/fabric-1.18/gradle.properties similarity index 65% rename from versions/1.18/gradle.properties rename to versions/fabric-1.18/gradle.properties index 03744f40..b8eb0450 100644 --- a/versions/1.18/gradle.properties +++ b/versions/fabric-1.18/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.18+build.1 build.fabric_api=0.44.0+1.18 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.18&l=fabric -dep.cloth-config=6.5.102 +dep.cloth-config=BLMp2TRt # flashback, check https://modrinth.com/mod/flashback/versions?g=1.18&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.18&l=fabric +dep.iris=mc1.18.1-1.1.3 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.18&l=fabric +dep.controlling=QOYsDWIJ +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.18&l=fabric +dep.searchables=unknown # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.18&l=fabric -dep.modmenu=3.0.1 +dep.modmenu=eueI9czw # yacl, check https://modrinth.com/mod/yacl/versions?g=1.18&l=fabric dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.18&l=fabric +dep.sodium=mc1.18-0.4.0-alpha5 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.18&l=fabric dep.replaymod=1.18.1-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.18&l=fabric dep.geckolib=unknown -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18&l=fabric -dep.proxlib=unknown \ No newline at end of file diff --git a/versions/fabric-1.18/tests/commands/mods/LuckPerms-Fabric-5.3.86.jar b/versions/fabric-1.18/tests/commands/mods/LuckPerms-Fabric-5.3.86.jar new file mode 100644 index 00000000..1b938de5 Binary files /dev/null and b/versions/fabric-1.18/tests/commands/mods/LuckPerms-Fabric-5.3.86.jar differ diff --git a/versions/fabric-1.18/tests/controlling/mods/Controlling-fabric-1.18-9.0.4.jar b/versions/fabric-1.18/tests/controlling/mods/Controlling-fabric-1.18-9.0.4.jar new file mode 100644 index 00000000..c8f13f65 Binary files /dev/null and b/versions/fabric-1.18/tests/controlling/mods/Controlling-fabric-1.18-9.0.4.jar differ diff --git a/versions/fabric-1.18/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.18/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.18/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.19.1/gradle.properties b/versions/fabric-1.19.1/gradle.properties similarity index 63% rename from versions/1.19.1/gradle.properties rename to versions/fabric-1.19.1/gradle.properties index 6a26e312..a5566bc2 100644 --- a/versions/1.19.1/gradle.properties +++ b/versions/fabric-1.19.1/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.19.1+build.6 build.fabric_api=0.58.5+1.19.1 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.1&l=fabric -dep.cloth-config=8.3.134+fabric +dep.cloth-config=ZpV0fKbO # flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.1&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.1&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.1&l=fabric +dep.iris=LgOJIpIS +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.1&l=fabric +dep.controlling=WfFtQ8gK +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.1&l=fabric +dep.searchables=o21YP3As # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.1&l=fabric -dep.modmenu=4.0.5 +dep.modmenu=2Ys0a7JE # yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.1&l=fabric -dep.yacl=1.7.1 +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.1&l=fabric +dep.sodium=rAfhHfow # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.1&l=fabric dep.replaymod=1.19.1-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.1&l=fabric -dep.geckolib=3.1.14 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.1&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=FQM6xvXj diff --git a/versions/fabric-1.19.1/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar b/versions/fabric-1.19.1/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar new file mode 100644 index 00000000..94c69ab4 Binary files /dev/null and b/versions/fabric-1.19.1/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar differ diff --git a/versions/fabric-1.19.1/tests/controlling/mods/Controlling-fabric-1.19.1-10.0+4.jar b/versions/fabric-1.19.1/tests/controlling/mods/Controlling-fabric-1.19.1-10.0+4.jar new file mode 100644 index 00000000..8a089cd7 Binary files /dev/null and b/versions/fabric-1.19.1/tests/controlling/mods/Controlling-fabric-1.19.1-10.0+4.jar differ diff --git a/versions/fabric-1.19.1/tests/controlling/mods/Searchables-fabric-1.19.1-1.0.1.jar b/versions/fabric-1.19.1/tests/controlling/mods/Searchables-fabric-1.19.1-1.0.1.jar new file mode 100644 index 00000000..ab90fb94 Binary files /dev/null and b/versions/fabric-1.19.1/tests/controlling/mods/Searchables-fabric-1.19.1-1.0.1.jar differ diff --git a/versions/fabric-1.19.1/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar b/versions/fabric-1.19.1/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar new file mode 100644 index 00000000..a4010966 Binary files /dev/null and b/versions/fabric-1.19.1/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar differ diff --git a/versions/fabric-1.19.1/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar b/versions/fabric-1.19.1/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar new file mode 100644 index 00000000..c047316d Binary files /dev/null and b/versions/fabric-1.19.1/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar differ diff --git a/versions/fabric-1.19.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.19.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.19.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.19.2/gradle.properties b/versions/fabric-1.19.2/gradle.properties similarity index 63% rename from versions/1.19.2/gradle.properties rename to versions/fabric-1.19.2/gradle.properties index 0e4bec1a..48682453 100644 --- a/versions/1.19.2/gradle.properties +++ b/versions/fabric-1.19.2/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.19.2+build.28 build.fabric_api=0.77.0+1.19.2 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.2&l=fabric -dep.cloth-config=8.3.134+fabric +dep.cloth-config=ZpV0fKbO # flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.2&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.2&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.2&l=fabric +dep.iris=1.6.11+1.19.2 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.2&l=fabric +dep.controlling=7mGcFotW +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.2&l=fabric +dep.searchables=YtzPnOQv # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.2&l=fabric -dep.modmenu=4.2.0-beta.2 +dep.modmenu=gSoPJyVn # yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.2&l=fabric -dep.yacl=2.2.0-for-1.19.2 +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.2&l=fabric +dep.sodium=mc1.19.2-0.4.4 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.2&l=fabric dep.replaymod=1.19.2-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.2&l=fabric -dep.geckolib=3.1.40 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.2&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=ATPZfRS1 diff --git a/versions/fabric-1.19.2/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar b/versions/fabric-1.19.2/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar new file mode 100644 index 00000000..94c69ab4 Binary files /dev/null and b/versions/fabric-1.19.2/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar differ diff --git a/versions/fabric-1.19.2/tests/controlling/mods/Controlling-fabric-1.19.2-10.0+7.jar b/versions/fabric-1.19.2/tests/controlling/mods/Controlling-fabric-1.19.2-10.0+7.jar new file mode 100644 index 00000000..892d3a7b Binary files /dev/null and b/versions/fabric-1.19.2/tests/controlling/mods/Controlling-fabric-1.19.2-10.0+7.jar differ diff --git a/versions/fabric-1.19.2/tests/controlling/mods/Searchables-fabric-1.19.2-1.0.2.jar b/versions/fabric-1.19.2/tests/controlling/mods/Searchables-fabric-1.19.2-1.0.2.jar new file mode 100644 index 00000000..065d075b Binary files /dev/null and b/versions/fabric-1.19.2/tests/controlling/mods/Searchables-fabric-1.19.2-1.0.2.jar differ diff --git a/versions/fabric-1.19.2/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar b/versions/fabric-1.19.2/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar new file mode 100644 index 00000000..a4010966 Binary files /dev/null and b/versions/fabric-1.19.2/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar differ diff --git a/versions/fabric-1.19.2/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar b/versions/fabric-1.19.2/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar new file mode 100644 index 00000000..c047316d Binary files /dev/null and b/versions/fabric-1.19.2/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar differ diff --git a/versions/fabric-1.19.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.19.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.19.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.19.3/gradle.properties b/versions/fabric-1.19.3/gradle.properties similarity index 63% rename from versions/1.19.3/gradle.properties rename to versions/fabric-1.19.3/gradle.properties index 505dd362..cea31472 100644 --- a/versions/1.19.3/gradle.properties +++ b/versions/fabric-1.19.3/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.19.3+build.5 build.fabric_api=0.76.1+1.19.3 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.3&l=fabric -dep.cloth-config=9.1.104+fabric +dep.cloth-config=w2VZSLTf # flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.3&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.3&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.3&l=fabric +dep.iris=1.5.2+1.19.3 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.3&l=fabric +dep.controlling=jsC1DP4W +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.3&l=fabric +dep.searchables=mhqbneQi # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.3&l=fabric -dep.modmenu=5.1.0 +dep.modmenu=id0aLmxO # yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.3&l=fabric -dep.yacl=2.2.0 +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.3&l=fabric +dep.sodium=mc1.19.3-0.4.9 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.3&l=fabric dep.replaymod=1.19.3-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.3&l=fabric -dep.geckolib=4.0.6 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.3&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=cYRFw6kc diff --git a/versions/fabric-1.19.3/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar b/versions/fabric-1.19.3/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar new file mode 100644 index 00000000..94c69ab4 Binary files /dev/null and b/versions/fabric-1.19.3/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar differ diff --git a/versions/fabric-1.19.3/tests/controlling/mods/Controlling-fabric-1.19.3-10.0+2.jar b/versions/fabric-1.19.3/tests/controlling/mods/Controlling-fabric-1.19.3-10.0+2.jar new file mode 100644 index 00000000..ce20add2 Binary files /dev/null and b/versions/fabric-1.19.3/tests/controlling/mods/Controlling-fabric-1.19.3-10.0+2.jar differ diff --git a/versions/fabric-1.19.3/tests/controlling/mods/Searchables-fabric-1.19.3-1.0.1.jar b/versions/fabric-1.19.3/tests/controlling/mods/Searchables-fabric-1.19.3-1.0.1.jar new file mode 100644 index 00000000..29d81ca9 Binary files /dev/null and b/versions/fabric-1.19.3/tests/controlling/mods/Searchables-fabric-1.19.3-1.0.1.jar differ diff --git a/versions/fabric-1.19.3/tests/shaders/mods/iris-mc1.19.3-1.5.2.jar b/versions/fabric-1.19.3/tests/shaders/mods/iris-mc1.19.3-1.5.2.jar new file mode 100644 index 00000000..f13d7b3f Binary files /dev/null and b/versions/fabric-1.19.3/tests/shaders/mods/iris-mc1.19.3-1.5.2.jar differ diff --git a/versions/fabric-1.19.3/tests/shaders/mods/sodium-fabric-mc1.19.3-0.4.9+build.23.jar b/versions/fabric-1.19.3/tests/shaders/mods/sodium-fabric-mc1.19.3-0.4.9+build.23.jar new file mode 100644 index 00000000..8e5be12f Binary files /dev/null and b/versions/fabric-1.19.3/tests/shaders/mods/sodium-fabric-mc1.19.3-0.4.9+build.23.jar differ diff --git a/versions/fabric-1.19.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.19.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.19.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.19.4/gradle.properties b/versions/fabric-1.19.4/gradle.properties similarity index 63% rename from versions/1.19.4/gradle.properties rename to versions/fabric-1.19.4/gradle.properties index 3419c4fc..4c9f5357 100644 --- a/versions/1.19.4/gradle.properties +++ b/versions/fabric-1.19.4/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.19.4+build.2 build.fabric_api=0.87.2+1.19.4 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.4&l=fabric -dep.cloth-config=10.1.135+fabric +dep.cloth-config=ZTMfeJij # flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.4&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.4&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.4&l=fabric +dep.iris=1.6.11+1.19.4 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.4&l=fabric +dep.controlling=yM2MSDnc +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.4&l=fabric +dep.searchables=ve9kcBZR # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.4&l=fabric -dep.modmenu=6.3.1 +dep.modmenu=lMqXEzUw # yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.4&l=fabric -dep.yacl=3.1.1+1.19.4-fabric +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.4&l=fabric +dep.sodium=mc1.19.4-0.4.10 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.4&l=fabric dep.replaymod=1.19.4-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.4&l=fabric -dep.geckolib=4.2 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.4&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.geckolib=fWtfrvf2 diff --git a/versions/fabric-1.19.4/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar b/versions/fabric-1.19.4/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar new file mode 100644 index 00000000..94c69ab4 Binary files /dev/null and b/versions/fabric-1.19.4/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar differ diff --git a/versions/fabric-1.19.4/tests/controlling/mods/Controlling-fabric-1.19.4-11.1.5.jar b/versions/fabric-1.19.4/tests/controlling/mods/Controlling-fabric-1.19.4-11.1.5.jar new file mode 100644 index 00000000..8a2f8001 Binary files /dev/null and b/versions/fabric-1.19.4/tests/controlling/mods/Controlling-fabric-1.19.4-11.1.5.jar differ diff --git a/versions/fabric-1.19.4/tests/controlling/mods/Searchables-fabric-1.19.4-1.0.3.jar b/versions/fabric-1.19.4/tests/controlling/mods/Searchables-fabric-1.19.4-1.0.3.jar new file mode 100644 index 00000000..0bcf56ca Binary files /dev/null and b/versions/fabric-1.19.4/tests/controlling/mods/Searchables-fabric-1.19.4-1.0.3.jar differ diff --git a/versions/fabric-1.19.4/tests/shaders/mods/iris-mc1.19.4-1.6.11.jar b/versions/fabric-1.19.4/tests/shaders/mods/iris-mc1.19.4-1.6.11.jar new file mode 100644 index 00000000..ec1e7f25 Binary files /dev/null and b/versions/fabric-1.19.4/tests/shaders/mods/iris-mc1.19.4-1.6.11.jar differ diff --git a/versions/fabric-1.19.4/tests/shaders/mods/sodium-fabric-mc1.19.4-0.4.10+build.24.jar b/versions/fabric-1.19.4/tests/shaders/mods/sodium-fabric-mc1.19.4-0.4.10+build.24.jar new file mode 100644 index 00000000..665d5259 Binary files /dev/null and b/versions/fabric-1.19.4/tests/shaders/mods/sodium-fabric-mc1.19.4-0.4.10+build.24.jar differ diff --git a/versions/fabric-1.19.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.19.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.19.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.19/gradle.properties b/versions/fabric-1.19/gradle.properties similarity index 64% rename from versions/1.19/gradle.properties rename to versions/fabric-1.19/gradle.properties index 2d9220a8..fd3b1d0f 100644 --- a/versions/1.19/gradle.properties +++ b/versions/fabric-1.19/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.19+build.4 build.fabric_api=0.58.0+1.19 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19&l=fabric -dep.cloth-config=8.3.134+fabric +dep.cloth-config=ZpV0fKbO # flashback, check https://modrinth.com/mod/flashback/versions?g=1.19&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19&l=fabric +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19&l=fabric +dep.iris=1.6.11+1.19.2 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19&l=fabric +dep.controlling=ZxUMXo6Z +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19&l=fabric +dep.searchables=unknown # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19&l=fabric -dep.modmenu=4.0.4 +dep.modmenu=oU5qfeR6 # yacl, check https://modrinth.com/mod/yacl/versions?g=1.19&l=fabric -dep.yacl=1.7.1 +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19&l=fabric +dep.sodium=mc1.19.2-0.4.4 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19&l=fabric dep.replaymod=1.19-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19&l=fabric dep.geckolib=unknown -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19&l=fabric -dep.proxlib=unknown \ No newline at end of file diff --git a/versions/fabric-1.19/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar b/versions/fabric-1.19/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar new file mode 100644 index 00000000..94c69ab4 Binary files /dev/null and b/versions/fabric-1.19/tests/commands/mods/LuckPerms-Fabric-5.4.66.jar differ diff --git a/versions/fabric-1.19/tests/controlling/mods/Controlling-fabric-1.19-10.0+3.jar b/versions/fabric-1.19/tests/controlling/mods/Controlling-fabric-1.19-10.0+3.jar new file mode 100644 index 00000000..0bb7ce45 Binary files /dev/null and b/versions/fabric-1.19/tests/controlling/mods/Controlling-fabric-1.19-10.0+3.jar differ diff --git a/versions/fabric-1.19/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar b/versions/fabric-1.19/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar new file mode 100644 index 00000000..a4010966 Binary files /dev/null and b/versions/fabric-1.19/tests/shaders/mods/iris-mc1.19.2-1.6.11.jar differ diff --git a/versions/fabric-1.19/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar b/versions/fabric-1.19/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar new file mode 100644 index 00000000..c047316d Binary files /dev/null and b/versions/fabric-1.19/tests/shaders/mods/sodium-fabric-mc1.19.2-0.4.4+build.18.jar differ diff --git a/versions/fabric-1.19/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.19/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.19/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20.1/gradle.properties b/versions/fabric-1.20.1/gradle.properties similarity index 67% rename from versions/1.20.1/gradle.properties rename to versions/fabric-1.20.1/gradle.properties index 525d79cf..a453aee2 100644 --- a/versions/1.20.1/gradle.properties +++ b/versions/fabric-1.20.1/gradle.properties @@ -4,7 +4,7 @@ # Fabric Properties, check https://fabricmc.net/develop/ build.yarn=1.20.1+build.10 -build.fabric_api=0.92.5+1.20.1 +build.fabric_api=0.92.6+1.20.1 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties @@ -21,4 +21,12 @@ dep.replaymod=1.20.1-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.1&l=fabric dep.geckolib=4.7.1.2 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.1&l=fabric -dep.proxlib=0.2.4+1.20.1 \ No newline at end of file +dep.proxlib=0.2.4+1.20.1 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.1&l=fabric +dep.controlling=6ipZLQSK +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.1&l=fabric +dep.searchables=eh4IBlu2 +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.1&l=fabric +dep.iris=1.7.6+1.20.1 +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.1&l=fabric +dep.sodium=mc1.20.1-0.5.13-fabric diff --git a/versions/fabric-1.20.1/tests/commands/mods/LuckPerms-Fabric-5.4.102.jar b/versions/fabric-1.20.1/tests/commands/mods/LuckPerms-Fabric-5.4.102.jar new file mode 100644 index 00000000..3638f71d Binary files /dev/null and b/versions/fabric-1.20.1/tests/commands/mods/LuckPerms-Fabric-5.4.102.jar differ diff --git a/versions/fabric-1.20.1/tests/controlling/mods/Controlling-fabric-1.20.1-12.0.2.jar b/versions/fabric-1.20.1/tests/controlling/mods/Controlling-fabric-1.20.1-12.0.2.jar new file mode 100644 index 00000000..debf5e67 Binary files /dev/null and b/versions/fabric-1.20.1/tests/controlling/mods/Controlling-fabric-1.20.1-12.0.2.jar differ diff --git a/versions/fabric-1.20.1/tests/controlling/mods/Searchables-fabric-1.20.1-1.0.3.jar b/versions/fabric-1.20.1/tests/controlling/mods/Searchables-fabric-1.20.1-1.0.3.jar new file mode 100644 index 00000000..899d9ccc Binary files /dev/null and b/versions/fabric-1.20.1/tests/controlling/mods/Searchables-fabric-1.20.1-1.0.3.jar differ diff --git a/versions/fabric-1.20.1/tests/shaders/mods/iris-1.7.6+mc1.20.1.jar b/versions/fabric-1.20.1/tests/shaders/mods/iris-1.7.6+mc1.20.1.jar new file mode 100644 index 00000000..056bc09c Binary files /dev/null and b/versions/fabric-1.20.1/tests/shaders/mods/iris-1.7.6+mc1.20.1.jar differ diff --git a/versions/fabric-1.20.1/tests/shaders/mods/sodium-fabric-0.5.13+mc1.20.1.jar b/versions/fabric-1.20.1/tests/shaders/mods/sodium-fabric-0.5.13+mc1.20.1.jar new file mode 100644 index 00000000..63ea9949 Binary files /dev/null and b/versions/fabric-1.20.1/tests/shaders/mods/sodium-fabric-0.5.13+mc1.20.1.jar differ diff --git a/versions/fabric-1.20.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20.2/gradle.properties b/versions/fabric-1.20.2/gradle.properties similarity index 70% rename from versions/1.20.2/gradle.properties rename to versions/fabric-1.20.2/gradle.properties index e1149950..ec4b7f2f 100644 --- a/versions/1.20.2/gradle.properties +++ b/versions/fabric-1.20.2/gradle.properties @@ -21,4 +21,12 @@ dep.replaymod=1.20.2-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.2&l=fabric dep.geckolib=4.3.1 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.2&l=fabric -dep.proxlib=unknown \ No newline at end of file +dep.proxlib=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.2&l=fabric +dep.controlling=YsBamiIM +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.2&l=fabric +dep.searchables=gcqBz3gR +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.2&l=fabric +dep.iris=1.6.14+1.20.2 +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.2&l=fabric +dep.sodium=mc1.20.2-0.5.5 diff --git a/versions/fabric-1.20.2/tests/commands/mods/LuckPerms-Fabric-5.4.109.jar b/versions/fabric-1.20.2/tests/commands/mods/LuckPerms-Fabric-5.4.109.jar new file mode 100644 index 00000000..890267da Binary files /dev/null and b/versions/fabric-1.20.2/tests/commands/mods/LuckPerms-Fabric-5.4.109.jar differ diff --git a/versions/fabric-1.20.2/tests/controlling/mods/Controlling-fabric-1.20.2-13.0.8.jar b/versions/fabric-1.20.2/tests/controlling/mods/Controlling-fabric-1.20.2-13.0.8.jar new file mode 100644 index 00000000..7cd26fc7 Binary files /dev/null and b/versions/fabric-1.20.2/tests/controlling/mods/Controlling-fabric-1.20.2-13.0.8.jar differ diff --git a/versions/fabric-1.20.2/tests/controlling/mods/Searchables-fabric-1.20.2-1.0.16.jar b/versions/fabric-1.20.2/tests/controlling/mods/Searchables-fabric-1.20.2-1.0.16.jar new file mode 100644 index 00000000..cb04599b Binary files /dev/null and b/versions/fabric-1.20.2/tests/controlling/mods/Searchables-fabric-1.20.2-1.0.16.jar differ diff --git a/versions/fabric-1.20.2/tests/shaders/mods/iris-mc1.20.2-1.6.14.jar b/versions/fabric-1.20.2/tests/shaders/mods/iris-mc1.20.2-1.6.14.jar new file mode 100644 index 00000000..a6d7679c Binary files /dev/null and b/versions/fabric-1.20.2/tests/shaders/mods/iris-mc1.20.2-1.6.14.jar differ diff --git a/versions/fabric-1.20.2/tests/shaders/mods/sodium-fabric-mc1.20.2-0.5.5.jar b/versions/fabric-1.20.2/tests/shaders/mods/sodium-fabric-mc1.20.2-0.5.5.jar new file mode 100644 index 00000000..b759206e Binary files /dev/null and b/versions/fabric-1.20.2/tests/shaders/mods/sodium-fabric-mc1.20.2-0.5.5.jar differ diff --git a/versions/fabric-1.20.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20.3/gradle.properties b/versions/fabric-1.20.3/gradle.properties similarity index 70% rename from versions/1.20.3/gradle.properties rename to versions/fabric-1.20.3/gradle.properties index 71e656b7..e9b84f65 100644 --- a/versions/1.20.3/gradle.properties +++ b/versions/fabric-1.20.3/gradle.properties @@ -21,4 +21,12 @@ dep.replaymod=1.20.4-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.3&l=fabric dep.geckolib=4.3.1 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.3&l=fabric -dep.proxlib=0.2.4+1.20.4 \ No newline at end of file +dep.proxlib=0.2.4+1.20.4 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.3&l=fabric +dep.controlling=lJ4HK2Pd +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.3&l=fabric +dep.searchables=xTkfl3Dx +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.3&l=fabric +dep.iris=hq98tuSS +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.3&l=fabric +dep.sodium=4GyXKCLd diff --git a/versions/fabric-1.20.3/tests/commands/mods/LuckPerms-Fabric-5.4.113.jar b/versions/fabric-1.20.3/tests/commands/mods/LuckPerms-Fabric-5.4.113.jar new file mode 100644 index 00000000..911a0243 Binary files /dev/null and b/versions/fabric-1.20.3/tests/commands/mods/LuckPerms-Fabric-5.4.113.jar differ diff --git a/versions/fabric-1.20.3/tests/controlling/mods/Controlling-fabric-1.20.3-13.0.4.jar b/versions/fabric-1.20.3/tests/controlling/mods/Controlling-fabric-1.20.3-13.0.4.jar new file mode 100644 index 00000000..4cf0ef54 Binary files /dev/null and b/versions/fabric-1.20.3/tests/controlling/mods/Controlling-fabric-1.20.3-13.0.4.jar differ diff --git a/versions/fabric-1.20.3/tests/controlling/mods/Searchables-fabric-1.20.3-1.0.2.jar b/versions/fabric-1.20.3/tests/controlling/mods/Searchables-fabric-1.20.3-1.0.2.jar new file mode 100644 index 00000000..02b1c9f2 Binary files /dev/null and b/versions/fabric-1.20.3/tests/controlling/mods/Searchables-fabric-1.20.3-1.0.2.jar differ diff --git a/versions/fabric-1.20.3/tests/shaders/mods/iris-1.7.2+mc1.20.4.jar b/versions/fabric-1.20.3/tests/shaders/mods/iris-1.7.2+mc1.20.4.jar new file mode 100644 index 00000000..57b4bd58 Binary files /dev/null and b/versions/fabric-1.20.3/tests/shaders/mods/iris-1.7.2+mc1.20.4.jar differ diff --git a/versions/fabric-1.20.3/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.4.jar b/versions/fabric-1.20.3/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.4.jar new file mode 100644 index 00000000..a9c69876 Binary files /dev/null and b/versions/fabric-1.20.3/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.4.jar differ diff --git a/versions/fabric-1.20.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20.4/gradle.properties b/versions/fabric-1.20.4/gradle.properties similarity index 69% rename from versions/1.20.4/gradle.properties rename to versions/fabric-1.20.4/gradle.properties index bdce9ef8..9dbb0fa5 100644 --- a/versions/1.20.4/gradle.properties +++ b/versions/fabric-1.20.4/gradle.properties @@ -21,4 +21,12 @@ dep.replaymod=1.20.4-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.4&l=fabric dep.geckolib=4.4.4 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.4&l=fabric -dep.proxlib=0.2.4+1.20.4 \ No newline at end of file +dep.proxlib=0.2.4+1.20.4 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.4&l=fabric +dep.controlling=LfVlaR2u +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.4&l=fabric +dep.searchables=CESw4Xj5 +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.4&l=fabric +dep.iris=1.7.2+1.20.4 +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.4&l=fabric +dep.sodium=mc1.20.4-0.5.8 diff --git a/versions/fabric-1.20.4/tests/commands/mods/LuckPerms-Fabric-5.4.113.jar b/versions/fabric-1.20.4/tests/commands/mods/LuckPerms-Fabric-5.4.113.jar new file mode 100644 index 00000000..911a0243 Binary files /dev/null and b/versions/fabric-1.20.4/tests/commands/mods/LuckPerms-Fabric-5.4.113.jar differ diff --git a/versions/fabric-1.20.4/tests/controlling/mods/Controlling-fabric-1.20.4-15.0.5.jar b/versions/fabric-1.20.4/tests/controlling/mods/Controlling-fabric-1.20.4-15.0.5.jar new file mode 100644 index 00000000..6e4312ee Binary files /dev/null and b/versions/fabric-1.20.4/tests/controlling/mods/Controlling-fabric-1.20.4-15.0.5.jar differ diff --git a/versions/fabric-1.20.4/tests/controlling/mods/Searchables-fabric-1.20.4-1.0.6.jar b/versions/fabric-1.20.4/tests/controlling/mods/Searchables-fabric-1.20.4-1.0.6.jar new file mode 100644 index 00000000..201ae4d9 Binary files /dev/null and b/versions/fabric-1.20.4/tests/controlling/mods/Searchables-fabric-1.20.4-1.0.6.jar differ diff --git a/versions/fabric-1.20.4/tests/shaders/mods/iris-1.7.2+mc1.20.4.jar b/versions/fabric-1.20.4/tests/shaders/mods/iris-1.7.2+mc1.20.4.jar new file mode 100644 index 00000000..57b4bd58 Binary files /dev/null and b/versions/fabric-1.20.4/tests/shaders/mods/iris-1.7.2+mc1.20.4.jar differ diff --git a/versions/fabric-1.20.4/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.4.jar b/versions/fabric-1.20.4/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.4.jar new file mode 100644 index 00000000..a9c69876 Binary files /dev/null and b/versions/fabric-1.20.4/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.4.jar differ diff --git a/versions/fabric-1.20.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20.5/gradle.properties b/versions/fabric-1.20.5/gradle.properties similarity index 70% rename from versions/1.20.5/gradle.properties rename to versions/fabric-1.20.5/gradle.properties index 7a576d66..a3b467a6 100644 --- a/versions/1.20.5/gradle.properties +++ b/versions/fabric-1.20.5/gradle.properties @@ -21,4 +21,12 @@ dep.replaymod=unknown # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.5&l=fabric dep.geckolib=4.5 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.5&l=fabric -dep.proxlib=0.2.4+1.20.6 \ No newline at end of file +dep.proxlib=0.2.4+1.20.6 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.5&l=fabric +dep.controlling=a2IDHJHE +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.5&l=fabric +dep.searchables=LkVw14ih +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.5&l=fabric +dep.iris=1bvcmYOc +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.5&l=fabric +dep.sodium=IZskON6d diff --git a/versions/fabric-1.20.5/tests/commands/mods/LuckPerms-Fabric-5.4.125.jar b/versions/fabric-1.20.5/tests/commands/mods/LuckPerms-Fabric-5.4.125.jar new file mode 100644 index 00000000..02ac9ad3 Binary files /dev/null and b/versions/fabric-1.20.5/tests/commands/mods/LuckPerms-Fabric-5.4.125.jar differ diff --git a/versions/fabric-1.20.5/tests/controlling/mods/Controlling-fabric-1.20.5-16.0.2.jar b/versions/fabric-1.20.5/tests/controlling/mods/Controlling-fabric-1.20.5-16.0.2.jar new file mode 100644 index 00000000..ed1b487a Binary files /dev/null and b/versions/fabric-1.20.5/tests/controlling/mods/Controlling-fabric-1.20.5-16.0.2.jar differ diff --git a/versions/fabric-1.20.5/tests/controlling/mods/Searchables-fabric-1.20.5-1.0.5.jar b/versions/fabric-1.20.5/tests/controlling/mods/Searchables-fabric-1.20.5-1.0.5.jar new file mode 100644 index 00000000..72ce8b3f Binary files /dev/null and b/versions/fabric-1.20.5/tests/controlling/mods/Searchables-fabric-1.20.5-1.0.5.jar differ diff --git a/versions/fabric-1.20.5/tests/shaders/mods/iris-1.7.0+mc1.20.6.jar b/versions/fabric-1.20.5/tests/shaders/mods/iris-1.7.0+mc1.20.6.jar new file mode 100644 index 00000000..2026fb5d Binary files /dev/null and b/versions/fabric-1.20.5/tests/shaders/mods/iris-1.7.0+mc1.20.6.jar differ diff --git a/versions/fabric-1.20.5/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.6.jar b/versions/fabric-1.20.5/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.6.jar new file mode 100644 index 00000000..e4dc9cd2 Binary files /dev/null and b/versions/fabric-1.20.5/tests/shaders/mods/sodium-fabric-0.5.8+mc1.20.6.jar differ diff --git a/versions/fabric-1.20.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20.6/gradle.properties b/versions/fabric-1.20.6/gradle.properties similarity index 69% rename from versions/1.20.6/gradle.properties rename to versions/fabric-1.20.6/gradle.properties index 31a0af4f..6e1606a1 100644 --- a/versions/1.20.6/gradle.properties +++ b/versions/fabric-1.20.6/gradle.properties @@ -21,4 +21,12 @@ dep.replaymod=1.20.6-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.6&l=fabric dep.geckolib=4.5.4 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.6&l=fabric -dep.proxlib=0.2.4+1.20.6 \ No newline at end of file +dep.proxlib=0.2.4+1.20.6 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.6&l=fabric +dep.controlling=Nnw4hU10 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.6&l=fabric +dep.searchables=8O5zvtt2 +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.6&l=fabric +dep.iris=1.7.2+1.20.6 +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.6&l=fabric +dep.sodium=mc1.20.6-0.5.11 diff --git a/versions/fabric-1.20.6/tests/commands/mods/LuckPerms-Fabric-5.4.125.jar b/versions/fabric-1.20.6/tests/commands/mods/LuckPerms-Fabric-5.4.125.jar new file mode 100644 index 00000000..02ac9ad3 Binary files /dev/null and b/versions/fabric-1.20.6/tests/commands/mods/LuckPerms-Fabric-5.4.125.jar differ diff --git a/versions/fabric-1.20.6/tests/controlling/mods/Controlling-fabric-1.20.6-17.0.1.jar b/versions/fabric-1.20.6/tests/controlling/mods/Controlling-fabric-1.20.6-17.0.1.jar new file mode 100644 index 00000000..9678edb2 Binary files /dev/null and b/versions/fabric-1.20.6/tests/controlling/mods/Controlling-fabric-1.20.6-17.0.1.jar differ diff --git a/versions/fabric-1.20.6/tests/controlling/mods/Searchables-fabric-1.20.6-1.0.1.jar b/versions/fabric-1.20.6/tests/controlling/mods/Searchables-fabric-1.20.6-1.0.1.jar new file mode 100644 index 00000000..730e7184 Binary files /dev/null and b/versions/fabric-1.20.6/tests/controlling/mods/Searchables-fabric-1.20.6-1.0.1.jar differ diff --git a/versions/fabric-1.20.6/tests/shaders/mods/iris-1.7.2+mc1.20.6.jar b/versions/fabric-1.20.6/tests/shaders/mods/iris-1.7.2+mc1.20.6.jar new file mode 100644 index 00000000..6c6b2c6a Binary files /dev/null and b/versions/fabric-1.20.6/tests/shaders/mods/iris-1.7.2+mc1.20.6.jar differ diff --git a/versions/fabric-1.20.6/tests/shaders/mods/sodium-fabric-0.5.11+mc1.20.6.jar b/versions/fabric-1.20.6/tests/shaders/mods/sodium-fabric-0.5.11+mc1.20.6.jar new file mode 100644 index 00000000..460524c5 Binary files /dev/null and b/versions/fabric-1.20.6/tests/shaders/mods/sodium-fabric-0.5.11+mc1.20.6.jar differ diff --git a/versions/fabric-1.20.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.20/gradle.properties b/versions/fabric-1.20/gradle.properties similarity index 60% rename from versions/1.20/gradle.properties rename to versions/fabric-1.20/gradle.properties index 9a29a7e8..dcc4e052 100644 --- a/versions/1.20/gradle.properties +++ b/versions/fabric-1.20/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.20+build.1 build.fabric_api=0.83.0+1.20 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.20&l=fabric -dep.cloth-config=11.1.136+fabric +dep.cloth-config=2xQdCMyG # flashback, check https://modrinth.com/mod/flashback/versions?g=1.20&l=fabric dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20&l=fabric +dep.proxlib=0.2.4+1.20.1 +# iris, check https://modrinth.com/mod/iris/versions?g=1.20&l=fabric +dep.iris=1.6.11+1.20.1 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20&l=fabric +dep.controlling=h9rn8nia +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20&l=fabric +dep.searchables=KssuuPQj # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.20&l=fabric -dep.modmenu=7.0.1 +dep.modmenu=RTFDnTKf # yacl, check https://modrinth.com/mod/yacl/versions?g=1.20&l=fabric -dep.yacl=3.2.2+1.20-fabric +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20&l=fabric +dep.sodium=mc1.20-0.4.10 # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.20&l=fabric -dep.replaymod=1.20.1-2.6.20 +dep.replaymod=1.20.1-2.6.23 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20&l=fabric -dep.geckolib=4.2.2 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20&l=fabric -dep.proxlib=0.2.4+1.20.1 \ No newline at end of file +dep.geckolib=V5QnDeov diff --git a/versions/fabric-1.20/tests/commands/mods/LuckPerms-Fabric-5.4.102.jar b/versions/fabric-1.20/tests/commands/mods/LuckPerms-Fabric-5.4.102.jar new file mode 100644 index 00000000..3638f71d Binary files /dev/null and b/versions/fabric-1.20/tests/commands/mods/LuckPerms-Fabric-5.4.102.jar differ diff --git a/versions/fabric-1.20/tests/controlling/mods/Controlling-fabric-1.20-12.0.2.jar b/versions/fabric-1.20/tests/controlling/mods/Controlling-fabric-1.20-12.0.2.jar new file mode 100644 index 00000000..08e9cd56 Binary files /dev/null and b/versions/fabric-1.20/tests/controlling/mods/Controlling-fabric-1.20-12.0.2.jar differ diff --git a/versions/fabric-1.20/tests/controlling/mods/Searchables-fabric-1.20-1.0.2.jar b/versions/fabric-1.20/tests/controlling/mods/Searchables-fabric-1.20-1.0.2.jar new file mode 100644 index 00000000..d34206e8 Binary files /dev/null and b/versions/fabric-1.20/tests/controlling/mods/Searchables-fabric-1.20-1.0.2.jar differ diff --git a/versions/fabric-1.20/tests/shaders/mods/iris-mc1.20-1.6.4.jar b/versions/fabric-1.20/tests/shaders/mods/iris-mc1.20-1.6.4.jar new file mode 100644 index 00000000..2043d5bd Binary files /dev/null and b/versions/fabric-1.20/tests/shaders/mods/iris-mc1.20-1.6.4.jar differ diff --git a/versions/fabric-1.20/tests/shaders/mods/sodium-fabric-mc1.20-0.4.10+build.27.jar b/versions/fabric-1.20/tests/shaders/mods/sodium-fabric-mc1.20-0.4.10+build.27.jar new file mode 100644 index 00000000..0f438c2e Binary files /dev/null and b/versions/fabric-1.20/tests/shaders/mods/sodium-fabric-mc1.20-0.4.10+build.27.jar differ diff --git a/versions/fabric-1.20/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.20/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.20/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.1/gradle.properties b/versions/fabric-1.21.1/gradle.properties similarity index 66% rename from versions/1.21.1/gradle.properties rename to versions/fabric-1.21.1/gradle.properties index 782ee1d3..41e95a23 100644 --- a/versions/1.21.1/gradle.properties +++ b/versions/fabric-1.21.1/gradle.properties @@ -3,8 +3,7 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.1+build.3 -build.fabric_api=0.115.4+1.21.1 +build.fabric_api=0.116.7+1.21.1 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties @@ -21,4 +20,12 @@ dep.replaymod=1.21-2.6.20 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.1&l=fabric dep.geckolib=4.7.5.1 # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.1&l=fabric -dep.proxlib=0.2.4+1.21 \ No newline at end of file +dep.proxlib=0.2.4+1.21 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.1&l=fabric +dep.controlling=hGJDoW2W +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.1&l=fabric +dep.searchables=tRdr8Bg3 +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.1&l=fabric +dep.iris=1.8.8+1.21.1-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.1&l=fabric +dep.sodium=mc1.21.1-0.6.13-fabric diff --git a/versions/fabric-1.21.1/tests/commands/mods/LuckPerms-Fabric-5.4.140.jar b/versions/fabric-1.21.1/tests/commands/mods/LuckPerms-Fabric-5.4.140.jar new file mode 100644 index 00000000..6ddc1787 Binary files /dev/null and b/versions/fabric-1.21.1/tests/commands/mods/LuckPerms-Fabric-5.4.140.jar differ diff --git a/versions/fabric-1.21.1/tests/controlling/mods/Controlling-fabric-1.21.1-19.0.5.jar b/versions/fabric-1.21.1/tests/controlling/mods/Controlling-fabric-1.21.1-19.0.5.jar new file mode 100644 index 00000000..f56d786e Binary files /dev/null and b/versions/fabric-1.21.1/tests/controlling/mods/Controlling-fabric-1.21.1-19.0.5.jar differ diff --git a/versions/fabric-1.21.1/tests/controlling/mods/Searchables-fabric-1.21.1-1.0.2.jar b/versions/fabric-1.21.1/tests/controlling/mods/Searchables-fabric-1.21.1-1.0.2.jar new file mode 100644 index 00000000..b6364ce3 Binary files /dev/null and b/versions/fabric-1.21.1/tests/controlling/mods/Searchables-fabric-1.21.1-1.0.2.jar differ diff --git a/versions/fabric-1.21.1/tests/shaders/mods/iris-fabric-1.8.14-beta.1+mc1.21.1.jar b/versions/fabric-1.21.1/tests/shaders/mods/iris-fabric-1.8.14-beta.1+mc1.21.1.jar new file mode 100644 index 00000000..730828d4 Binary files /dev/null and b/versions/fabric-1.21.1/tests/shaders/mods/iris-fabric-1.8.14-beta.1+mc1.21.1.jar differ diff --git a/versions/fabric-1.21.1/tests/shaders/mods/sodium-fabric-0.8.12+mc1.21.1.jar b/versions/fabric-1.21.1/tests/shaders/mods/sodium-fabric-0.8.12+mc1.21.1.jar new file mode 100644 index 00000000..afe84912 Binary files /dev/null and b/versions/fabric-1.21.1/tests/shaders/mods/sodium-fabric-0.8.12+mc1.21.1.jar differ diff --git a/versions/fabric-1.21.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.10/gradle.properties b/versions/fabric-1.21.10/gradle.properties similarity index 56% rename from versions/1.21.10/gradle.properties rename to versions/fabric-1.21.10/gradle.properties index 2a6842ae..e5ad4610 100644 --- a/versions/1.21.10/gradle.properties +++ b/versions/fabric-1.21.10/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.10+build.2 -build.fabric_api=0.135.0+1.21.10 +build.fabric_api=0.138.4+1.21.10 build.fabric-permissions-api = 0.5.0 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.10&l=fabric -dep.cloth-config=19.0.147+fabric +dep.cloth-config=qMxkrrmq # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.10&l=fabric -dep.flashback=0.35.2 +dep.flashback=QpNVXwcn # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.10&l=fabric -dep.proxlib=0.2.4+1.21 +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.10&l=fabric +dep.iris=1.9.7+1.21.10-fabric +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.10&l=fabric +dep.controlling=FEy417jo +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.10&l=fabric +dep.searchables=tV7Ai2Tq # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.10&l=fabric -dep.modmenu=16.0.0-rc.1 +dep.modmenu=pYbFlVtR # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.10&l=fabric -dep.yacl=3.8.0+1.21.9-fabric +dep.yacl=3.8.2+1.21.10-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.10&l=fabric +dep.sodium=mc1.21.10-0.7.3-fabric # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.10&l=fabric -dep.replaymod=1.21.7-2.6.23 +dep.replaymod=1.21.10-2.6.25 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.10&l=fabric -dep.geckolib=5.3-alpha-1 +dep.geckolib=7qjQQSWv diff --git a/versions/fabric-1.21.10/tests/commands/mods/LuckPerms-Fabric-5.5.17.jar b/versions/fabric-1.21.10/tests/commands/mods/LuckPerms-Fabric-5.5.17.jar new file mode 100644 index 00000000..a0845c20 Binary files /dev/null and b/versions/fabric-1.21.10/tests/commands/mods/LuckPerms-Fabric-5.5.17.jar differ diff --git a/versions/fabric-1.21.10/tests/controlling/mods/Controlling-fabric-1.21.10-28.0.2.jar b/versions/fabric-1.21.10/tests/controlling/mods/Controlling-fabric-1.21.10-28.0.2.jar new file mode 100644 index 00000000..a7d3abe4 Binary files /dev/null and b/versions/fabric-1.21.10/tests/controlling/mods/Controlling-fabric-1.21.10-28.0.2.jar differ diff --git a/versions/fabric-1.21.10/tests/controlling/mods/Searchables-fabric-1.21.10-1.0.2.jar b/versions/fabric-1.21.10/tests/controlling/mods/Searchables-fabric-1.21.10-1.0.2.jar new file mode 100644 index 00000000..2ad1b7de Binary files /dev/null and b/versions/fabric-1.21.10/tests/controlling/mods/Searchables-fabric-1.21.10-1.0.2.jar differ diff --git a/versions/fabric-1.21.10/tests/shaders/mods/iris-fabric-1.9.7+mc1.21.10.jar b/versions/fabric-1.21.10/tests/shaders/mods/iris-fabric-1.9.7+mc1.21.10.jar new file mode 100644 index 00000000..6559dad1 Binary files /dev/null and b/versions/fabric-1.21.10/tests/shaders/mods/iris-fabric-1.9.7+mc1.21.10.jar differ diff --git a/versions/fabric-1.21.10/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.10.jar b/versions/fabric-1.21.10/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.10.jar new file mode 100644 index 00000000..182df852 Binary files /dev/null and b/versions/fabric-1.21.10/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.10.jar differ diff --git a/versions/fabric-1.21.10/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.10/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.10/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/fabric-1.21.11/gradle.properties b/versions/fabric-1.21.11/gradle.properties new file mode 100644 index 00000000..33ca98a2 --- /dev/null +++ b/versions/fabric-1.21.11/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Fabric Properties, check https://fabricmc.net/develop/ +build.fabric_api=0.140.2+1.21.11 +build.fabric-permissions-api = 0.6.0 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.11&l=fabric +dep.cloth-config=21.11.153+fabric +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.11&l=fabric +dep.flashback=0.39.1 +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.11&l=fabric +dep.proxlib=0.2.4+1.21 +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.11&l=fabric +dep.modmenu=17.0.0-beta.1 +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.11&l=fabric +dep.yacl=3.8.1+1.21.11-fabric +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.11&l=fabric +dep.replaymod=1.21.11-2.6.25 +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.11&l=fabric +dep.geckolib=5.4-alpha-1 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.11&l=fabric +dep.controlling=A6W4m3vi +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.11&l=fabric +dep.searchables=lBaUf76M +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.11&l=fabric +dep.iris=1.10.7+1.21.11-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.11&l=fabric +dep.sodium=mc1.21.11-0.8.7-fabric diff --git a/versions/fabric-1.21.11/tests/commands/mods/LuckPerms-Fabric-5.5.21.jar b/versions/fabric-1.21.11/tests/commands/mods/LuckPerms-Fabric-5.5.21.jar new file mode 100644 index 00000000..5733f9cf Binary files /dev/null and b/versions/fabric-1.21.11/tests/commands/mods/LuckPerms-Fabric-5.5.21.jar differ diff --git a/versions/fabric-1.21.11/tests/controlling/mods/Controlling-fabric-1.21.11-29.0.1.jar b/versions/fabric-1.21.11/tests/controlling/mods/Controlling-fabric-1.21.11-29.0.1.jar new file mode 100644 index 00000000..b44ef91c Binary files /dev/null and b/versions/fabric-1.21.11/tests/controlling/mods/Controlling-fabric-1.21.11-29.0.1.jar differ diff --git a/versions/fabric-1.21.11/tests/controlling/mods/Searchables-fabric-1.21.11-1.0.4.jar b/versions/fabric-1.21.11/tests/controlling/mods/Searchables-fabric-1.21.11-1.0.4.jar new file mode 100644 index 00000000..d1c261ab Binary files /dev/null and b/versions/fabric-1.21.11/tests/controlling/mods/Searchables-fabric-1.21.11-1.0.4.jar differ diff --git a/versions/fabric-1.21.11/tests/shaders/mods/iris-fabric-1.10.7+mc1.21.11.jar b/versions/fabric-1.21.11/tests/shaders/mods/iris-fabric-1.10.7+mc1.21.11.jar new file mode 100644 index 00000000..e2f0a819 Binary files /dev/null and b/versions/fabric-1.21.11/tests/shaders/mods/iris-fabric-1.10.7+mc1.21.11.jar differ diff --git a/versions/fabric-1.21.11/tests/shaders/mods/sodium-fabric-0.8.7+mc1.21.11.jar b/versions/fabric-1.21.11/tests/shaders/mods/sodium-fabric-0.8.7+mc1.21.11.jar new file mode 100644 index 00000000..39e66304 Binary files /dev/null and b/versions/fabric-1.21.11/tests/shaders/mods/sodium-fabric-0.8.7+mc1.21.11.jar differ diff --git a/versions/fabric-1.21.11/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.11/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.11/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.4/gradle.properties b/versions/fabric-1.21.4/gradle.properties similarity index 56% rename from versions/1.21.4/gradle.properties rename to versions/fabric-1.21.4/gradle.properties index 4cc7f16f..05663da2 100644 --- a/versions/1.21.4/gradle.properties +++ b/versions/fabric-1.21.4/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.4+build.8 -build.fabric_api=0.119.2+1.21.4 +build.fabric_api=0.119.4+1.21.4 build.fabric-permissions-api = 0.3.3 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.4&l=fabric -dep.cloth-config=17.0.144+fabric +dep.cloth-config=TJ6o2sr4 # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.4&l=fabric -dep.flashback=c6QAhUd4 +dep.flashback=nIGZFcwW +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.4&l=fabric +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.4&l=fabric +dep.iris=1.8.8+1.21.4-fabric +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.4&l=fabric +dep.controlling=sLtmudOk +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.4&l=fabric +dep.searchables=7QUINkOj # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.4&l=fabric -dep.modmenu=13.0.3 +dep.modmenu=qEKKsTqd # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.4&l=fabric -dep.yacl=3.6.6+1.21.4-fabric +dep.yacl=3.8.2+1.21.4-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.4&l=fabric +dep.sodium=mc1.21.4-0.6.13-fabric # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.4&l=fabric -dep.replaymod=1.21.4-2.6.21 +dep.replaymod=1.21.4-2.6.23 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.4&l=fabric -dep.geckolib=4.8.4 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.4&l=fabric -dep.proxlib=0.2.4+1.21 \ No newline at end of file +dep.geckolib=HFSs3Co0 diff --git a/versions/fabric-1.21.4/tests/commands/mods/LuckPerms-Fabric-5.4.150.jar b/versions/fabric-1.21.4/tests/commands/mods/LuckPerms-Fabric-5.4.150.jar new file mode 100644 index 00000000..208bfe94 Binary files /dev/null and b/versions/fabric-1.21.4/tests/commands/mods/LuckPerms-Fabric-5.4.150.jar differ diff --git a/versions/fabric-1.21.4/tests/controlling/mods/Controlling-fabric-1.21.4-22.0.5.jar b/versions/fabric-1.21.4/tests/controlling/mods/Controlling-fabric-1.21.4-22.0.5.jar new file mode 100644 index 00000000..63c6895a Binary files /dev/null and b/versions/fabric-1.21.4/tests/controlling/mods/Controlling-fabric-1.21.4-22.0.5.jar differ diff --git a/versions/fabric-1.21.4/tests/controlling/mods/Searchables-fabric-1.21.4-1.0.5.jar b/versions/fabric-1.21.4/tests/controlling/mods/Searchables-fabric-1.21.4-1.0.5.jar new file mode 100644 index 00000000..c03f24d5 Binary files /dev/null and b/versions/fabric-1.21.4/tests/controlling/mods/Searchables-fabric-1.21.4-1.0.5.jar differ diff --git a/versions/fabric-1.21.4/tests/shaders/mods/iris-fabric-1.8.8+mc1.21.4.jar b/versions/fabric-1.21.4/tests/shaders/mods/iris-fabric-1.8.8+mc1.21.4.jar new file mode 100644 index 00000000..47170b3a Binary files /dev/null and b/versions/fabric-1.21.4/tests/shaders/mods/iris-fabric-1.8.8+mc1.21.4.jar differ diff --git a/versions/fabric-1.21.4/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.4.jar b/versions/fabric-1.21.4/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.4.jar new file mode 100644 index 00000000..b3179fba Binary files /dev/null and b/versions/fabric-1.21.4/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.4.jar differ diff --git a/versions/fabric-1.21.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.5/gradle.properties b/versions/fabric-1.21.5/gradle.properties similarity index 56% rename from versions/1.21.5/gradle.properties rename to versions/fabric-1.21.5/gradle.properties index 7736d3ef..7d140343 100644 --- a/versions/1.21.5/gradle.properties +++ b/versions/fabric-1.21.5/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.5+build.1 -build.fabric_api=0.119.9+1.21.5 +build.fabric_api=0.128.2+1.21.5 build.fabric-permissions-api = 0.3.3 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.5&l=fabric -dep.cloth-config=18.0.145+fabric +dep.cloth-config=qA00xo1O # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.5&l=fabric -dep.flashback=0.31.1 +dep.flashback=JUF5ddLV +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.5&l=fabric +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.5&l=fabric +dep.iris=1.8.11+1.21.5-fabric +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.5&l=fabric +dep.controlling=3qTTC7U1 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.5&l=fabric +dep.searchables=Z4JnRLbU # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.5&l=fabric -dep.modmenu=14.0.0-rc.2 +dep.modmenu=2ZvBR7XI # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.5&l=fabric -dep.yacl=3.6.6+1.21.5-fabric +dep.yacl=3.8.2+1.21.5-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.5&l=fabric +dep.sodium=mc1.21.5-0.6.13-fabric # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.5&l=fabric -dep.replaymod=1.21.4-2.6.21 +dep.replaymod=1.21.5-2.6.23 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.5&l=fabric -dep.geckolib=5.0-alpha1 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.5&l=fabric -dep.proxlib=0.2.4+1.21 \ No newline at end of file +dep.geckolib=AyXpbm2h diff --git a/versions/fabric-1.21.5/tests/commands/mods/LuckPerms-Fabric-5.5.4.jar b/versions/fabric-1.21.5/tests/commands/mods/LuckPerms-Fabric-5.5.4.jar new file mode 100644 index 00000000..1b2bfc49 Binary files /dev/null and b/versions/fabric-1.21.5/tests/commands/mods/LuckPerms-Fabric-5.5.4.jar differ diff --git a/versions/fabric-1.21.5/tests/controlling/mods/Controlling-fabric-1.21.5-23.0.2.jar b/versions/fabric-1.21.5/tests/controlling/mods/Controlling-fabric-1.21.5-23.0.2.jar new file mode 100644 index 00000000..32479378 Binary files /dev/null and b/versions/fabric-1.21.5/tests/controlling/mods/Controlling-fabric-1.21.5-23.0.2.jar differ diff --git a/versions/fabric-1.21.5/tests/controlling/mods/Searchables-fabric-1.21.5-1.0.3.jar b/versions/fabric-1.21.5/tests/controlling/mods/Searchables-fabric-1.21.5-1.0.3.jar new file mode 100644 index 00000000..a1ca81be Binary files /dev/null and b/versions/fabric-1.21.5/tests/controlling/mods/Searchables-fabric-1.21.5-1.0.3.jar differ diff --git a/versions/fabric-1.21.5/tests/shaders/mods/iris-fabric-1.8.11+mc1.21.5.jar b/versions/fabric-1.21.5/tests/shaders/mods/iris-fabric-1.8.11+mc1.21.5.jar new file mode 100644 index 00000000..d8aa01b7 Binary files /dev/null and b/versions/fabric-1.21.5/tests/shaders/mods/iris-fabric-1.8.11+mc1.21.5.jar differ diff --git a/versions/fabric-1.21.5/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.5.jar b/versions/fabric-1.21.5/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.5.jar new file mode 100644 index 00000000..0127b1b5 Binary files /dev/null and b/versions/fabric-1.21.5/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.5.jar differ diff --git a/versions/fabric-1.21.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.6/gradle.properties b/versions/fabric-1.21.6/gradle.properties similarity index 57% rename from versions/1.21.6/gradle.properties rename to versions/fabric-1.21.6/gradle.properties index 06a2f587..4cc39011 100644 --- a/versions/1.21.6/gradle.properties +++ b/versions/fabric-1.21.6/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.6+build.1 -build.fabric_api=0.127.0+1.21.6 +build.fabric_api=0.128.2+1.21.6 build.fabric-permissions-api = 0.4.0 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.6&l=fabric -dep.cloth-config=18.0.145+fabric +dep.cloth-config=cz0b1j8R # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.6&l=fabric -dep.flashback=0.35.2 +dep.flashback=X3J8u7wy # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.6&l=fabric -dep.proxlib=0.2.4+1.21 +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.6&l=fabric +dep.iris=Rhzf61g1 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.6&l=fabric +dep.controlling=IzCLUaM4 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.6&l=fabric +dep.searchables=shmjV0gp # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.6&l=fabric -dep.modmenu=15.0.0-beta.2 +dep.modmenu=ku5NivOP # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.6&l=fabric -dep.yacl=3.7.1+1.21.6-fabric +dep.yacl=3.8.2+1.21.6-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.6&l=fabric +dep.sodium=7pwil2dy # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.6&l=fabric -dep.replaymod=1.21.7-2.6.23 +dep.replaymod=TUHG3lET # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.6&l=fabric -dep.geckolib=5.1.0 \ No newline at end of file +dep.geckolib=cMt8HLkd diff --git a/versions/fabric-1.21.6/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar b/versions/fabric-1.21.6/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar new file mode 100644 index 00000000..78e17852 Binary files /dev/null and b/versions/fabric-1.21.6/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar differ diff --git a/versions/fabric-1.21.6/tests/controlling/mods/Controlling-fabric-1.21.6-24.0.2.jar b/versions/fabric-1.21.6/tests/controlling/mods/Controlling-fabric-1.21.6-24.0.2.jar new file mode 100644 index 00000000..65697222 Binary files /dev/null and b/versions/fabric-1.21.6/tests/controlling/mods/Controlling-fabric-1.21.6-24.0.2.jar differ diff --git a/versions/fabric-1.21.6/tests/controlling/mods/Searchables-fabric-1.21.6-1.0.3.jar b/versions/fabric-1.21.6/tests/controlling/mods/Searchables-fabric-1.21.6-1.0.3.jar new file mode 100644 index 00000000..922a609b Binary files /dev/null and b/versions/fabric-1.21.6/tests/controlling/mods/Searchables-fabric-1.21.6-1.0.3.jar differ diff --git a/versions/fabric-1.21.6/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar b/versions/fabric-1.21.6/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar new file mode 100644 index 00000000..a5b8b262 Binary files /dev/null and b/versions/fabric-1.21.6/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar differ diff --git a/versions/fabric-1.21.6/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar b/versions/fabric-1.21.6/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar new file mode 100644 index 00000000..1489d620 Binary files /dev/null and b/versions/fabric-1.21.6/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar differ diff --git a/versions/fabric-1.21.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.7/gradle.properties b/versions/fabric-1.21.7/gradle.properties similarity index 63% rename from versions/1.21.7/gradle.properties rename to versions/fabric-1.21.7/gradle.properties index 299a698e..d7d96651 100644 --- a/versions/1.21.7/gradle.properties +++ b/versions/fabric-1.21.7/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.7+build.6 build.fabric_api=0.129.0+1.21.7 build.fabric-permissions-api = 0.4.0 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.7&l=fabric -dep.cloth-config=19.0.147+fabric +dep.cloth-config=cz0b1j8R # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.7&l=fabric -dep.flashback=0.35.2 +dep.flashback=X3J8u7wy # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.7&l=fabric -dep.proxlib=0.2.4+1.21 +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.7&l=fabric +dep.iris=Rhzf61g1 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.7&l=fabric +dep.controlling=rJyUf9kw +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.7&l=fabric +dep.searchables=SMSx9bul # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.7&l=fabric -dep.modmenu=15.0.0-beta.3 +dep.modmenu=ku5NivOP # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.7&l=fabric dep.yacl=3.7.1+1.21.6-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.7&l=fabric +dep.sodium=7pwil2dy # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.7&l=fabric dep.replaymod=1.21.7-2.6.23 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.7&l=fabric -dep.geckolib=5.2.1 +dep.geckolib=OT6teuDe diff --git a/versions/fabric-1.21.7/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar b/versions/fabric-1.21.7/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar new file mode 100644 index 00000000..78e17852 Binary files /dev/null and b/versions/fabric-1.21.7/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar differ diff --git a/versions/fabric-1.21.7/tests/controlling/mods/Controlling-fabric-1.21.7-25.0.2.jar b/versions/fabric-1.21.7/tests/controlling/mods/Controlling-fabric-1.21.7-25.0.2.jar new file mode 100644 index 00000000..606db950 Binary files /dev/null and b/versions/fabric-1.21.7/tests/controlling/mods/Controlling-fabric-1.21.7-25.0.2.jar differ diff --git a/versions/fabric-1.21.7/tests/controlling/mods/Searchables-fabric-1.21.7-1.0.2.jar b/versions/fabric-1.21.7/tests/controlling/mods/Searchables-fabric-1.21.7-1.0.2.jar new file mode 100644 index 00000000..aaf82e7d Binary files /dev/null and b/versions/fabric-1.21.7/tests/controlling/mods/Searchables-fabric-1.21.7-1.0.2.jar differ diff --git a/versions/fabric-1.21.7/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar b/versions/fabric-1.21.7/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar new file mode 100644 index 00000000..a5b8b262 Binary files /dev/null and b/versions/fabric-1.21.7/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar differ diff --git a/versions/fabric-1.21.7/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar b/versions/fabric-1.21.7/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar new file mode 100644 index 00000000..1489d620 Binary files /dev/null and b/versions/fabric-1.21.7/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar differ diff --git a/versions/fabric-1.21.7/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.7/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.7/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.8/gradle.properties b/versions/fabric-1.21.8/gradle.properties similarity index 58% rename from versions/1.21.8/gradle.properties rename to versions/fabric-1.21.8/gradle.properties index 4f902710..5ee0c7ac 100644 --- a/versions/1.21.8/gradle.properties +++ b/versions/fabric-1.21.8/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.8+build.1 -build.fabric_api=0.129.0+1.21.8 +build.fabric_api=0.136.1+1.21.8 build.fabric-permissions-api = 0.4.0 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.8&l=fabric -dep.cloth-config=19.0.147+fabric +dep.cloth-config=cz0b1j8R # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.8&l=fabric -dep.flashback=0.35.2 +dep.flashback=X3J8u7wy # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.8&l=fabric -dep.proxlib=0.2.4+1.21 +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.8&l=fabric +dep.iris=1.9.6+1.21.8-fabric +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.8&l=fabric +dep.controlling=15AHrwi3 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.8&l=fabric +dep.searchables=LLzPBiwT # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.8&l=fabric -dep.modmenu=15.0.0-beta.3 +dep.modmenu=ku5NivOP # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.8&l=fabric dep.yacl=3.7.1+1.21.6-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.8&l=fabric +dep.sodium=mc1.21.8-0.7.3-fabric # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.8&l=fabric -dep.replaymod=1.21.7-2.6.23 +dep.replaymod=TUHG3lET # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.8&l=fabric -dep.geckolib=5.2.2 \ No newline at end of file +dep.geckolib=k4Azk0wN diff --git a/versions/fabric-1.21.8/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar b/versions/fabric-1.21.8/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar new file mode 100644 index 00000000..78e17852 Binary files /dev/null and b/versions/fabric-1.21.8/tests/commands/mods/LuckPerms-Fabric-5.5.10.jar differ diff --git a/versions/fabric-1.21.8/tests/controlling/mods/Controlling-fabric-1.21.8-26.0.3.jar b/versions/fabric-1.21.8/tests/controlling/mods/Controlling-fabric-1.21.8-26.0.3.jar new file mode 100644 index 00000000..34807365 Binary files /dev/null and b/versions/fabric-1.21.8/tests/controlling/mods/Controlling-fabric-1.21.8-26.0.3.jar differ diff --git a/versions/fabric-1.21.8/tests/controlling/mods/Searchables-fabric-1.21.8-1.0.2.jar b/versions/fabric-1.21.8/tests/controlling/mods/Searchables-fabric-1.21.8-1.0.2.jar new file mode 100644 index 00000000..d7db96ee Binary files /dev/null and b/versions/fabric-1.21.8/tests/controlling/mods/Searchables-fabric-1.21.8-1.0.2.jar differ diff --git a/versions/fabric-1.21.8/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar b/versions/fabric-1.21.8/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar new file mode 100644 index 00000000..a5b8b262 Binary files /dev/null and b/versions/fabric-1.21.8/tests/shaders/mods/iris-fabric-1.9.6+mc1.21.8.jar differ diff --git a/versions/fabric-1.21.8/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar b/versions/fabric-1.21.8/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar new file mode 100644 index 00000000..1489d620 Binary files /dev/null and b/versions/fabric-1.21.8/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.8.jar differ diff --git a/versions/fabric-1.21.8/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.8/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.8/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21.9/gradle.properties b/versions/fabric-1.21.9/gradle.properties similarity index 59% rename from versions/1.21.9/gradle.properties rename to versions/fabric-1.21.9/gradle.properties index a1ceff37..ab7ccef3 100644 --- a/versions/1.21.9/gradle.properties +++ b/versions/fabric-1.21.9/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21.9+build.1 -build.fabric_api=0.134.0+1.21.9 +build.fabric_api=0.134.1+1.21.9 build.fabric-permissions-api = 0.5.0 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.9&l=fabric -dep.cloth-config=19.0.147+fabric +dep.cloth-config=qMxkrrmq # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.9&l=fabric -dep.flashback=0.35.2 +dep.flashback=QpNVXwcn # proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.9&l=fabric -dep.proxlib=0.2.4+1.21 +dep.proxlib=BAAQMXWP +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.9&l=fabric +dep.iris=a98UkgML +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.9&l=fabric +dep.controlling=gu0M6XOF +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.9&l=fabric +dep.searchables=WkSxSOMO # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.9&l=fabric -dep.modmenu=16.0.0-rc.1 +dep.modmenu=pYbFlVtR # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.9&l=fabric dep.yacl=3.8.0+1.21.9-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.9&l=fabric +dep.sodium=sFfidWgd # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.9&l=fabric -dep.replaymod=1.21.7-2.6.23 +dep.replaymod=lwciuNZ7 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.9&l=fabric -dep.geckolib=unknown \ No newline at end of file +dep.geckolib=unknown diff --git a/versions/fabric-1.21.9/tests/commands/mods/LuckPerms-Fabric-5.5.17.jar b/versions/fabric-1.21.9/tests/commands/mods/LuckPerms-Fabric-5.5.17.jar new file mode 100644 index 00000000..a0845c20 Binary files /dev/null and b/versions/fabric-1.21.9/tests/commands/mods/LuckPerms-Fabric-5.5.17.jar differ diff --git a/versions/fabric-1.21.9/tests/controlling/mods/Controlling-fabric-1.21.9-27.0.2.jar b/versions/fabric-1.21.9/tests/controlling/mods/Controlling-fabric-1.21.9-27.0.2.jar new file mode 100644 index 00000000..9941377f Binary files /dev/null and b/versions/fabric-1.21.9/tests/controlling/mods/Controlling-fabric-1.21.9-27.0.2.jar differ diff --git a/versions/fabric-1.21.9/tests/controlling/mods/Searchables-fabric-1.21.9-1.0.2.jar b/versions/fabric-1.21.9/tests/controlling/mods/Searchables-fabric-1.21.9-1.0.2.jar new file mode 100644 index 00000000..e3548f91 Binary files /dev/null and b/versions/fabric-1.21.9/tests/controlling/mods/Searchables-fabric-1.21.9-1.0.2.jar differ diff --git a/versions/fabric-1.21.9/tests/shaders/mods/iris-fabric-1.9.7+mc1.21.10.jar b/versions/fabric-1.21.9/tests/shaders/mods/iris-fabric-1.9.7+mc1.21.10.jar new file mode 100644 index 00000000..6559dad1 Binary files /dev/null and b/versions/fabric-1.21.9/tests/shaders/mods/iris-fabric-1.9.7+mc1.21.10.jar differ diff --git a/versions/fabric-1.21.9/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.10.jar b/versions/fabric-1.21.9/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.10.jar new file mode 100644 index 00000000..182df852 Binary files /dev/null and b/versions/fabric-1.21.9/tests/shaders/mods/sodium-fabric-0.7.3+mc1.21.10.jar differ diff --git a/versions/fabric-1.21.9/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21.9/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21.9/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/1.21/gradle.properties b/versions/fabric-1.21/gradle.properties similarity index 58% rename from versions/1.21/gradle.properties rename to versions/fabric-1.21/gradle.properties index 576541a2..b270098a 100644 --- a/versions/1.21/gradle.properties +++ b/versions/fabric-1.21/gradle.properties @@ -3,22 +3,29 @@ # and reload Gradle to update only it's value. # Fabric Properties, check https://fabricmc.net/develop/ -build.yarn=1.21+build.9 build.fabric_api=0.102.0+1.21 build.fabric-permissions-api = 0.3.1 # Additional Dependencies Properties # cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21&l=fabric -dep.cloth-config=15.0.140+fabric +dep.cloth-config=HpMb5wGb # flashback, check https://modrinth.com/mod/flashback/versions?g=1.21&l=fabric -dep.flashback=0.31.0 +dep.flashback=vQyhWboq +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21&l=fabric +dep.proxlib=0.2.4+1.21 +# iris, check https://modrinth.com/mod/iris/versions?g=1.21&l=fabric +dep.iris=1.8.8+1.21.1-fabric +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21&l=fabric +dep.controlling=xl0PX3KR +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21&l=fabric +dep.searchables=8zrcFuRP # modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21&l=fabric -dep.modmenu=11.0.3 +dep.modmenu=v6Xx3fbU # yacl, check https://modrinth.com/mod/yacl/versions?g=1.21&l=fabric -dep.yacl=3.6.6+1.21.1-fabric +dep.yacl=3.8.2+1.21.1-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21&l=fabric +dep.sodium=mc1.21.1-0.6.13-fabric # replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21&l=fabric -dep.replaymod=1.21-2.6.20 +dep.replaymod=1.21-2.6.23 # geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21&l=fabric -dep.geckolib=4.5.8 -# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21&l=fabric -dep.proxlib=0.2.4+1.21 \ No newline at end of file +dep.geckolib=11VBhLU2 diff --git a/versions/fabric-1.21/tests/commands/mods/LuckPerms-Fabric-5.4.140.jar b/versions/fabric-1.21/tests/commands/mods/LuckPerms-Fabric-5.4.140.jar new file mode 100644 index 00000000..6ddc1787 Binary files /dev/null and b/versions/fabric-1.21/tests/commands/mods/LuckPerms-Fabric-5.4.140.jar differ diff --git a/versions/fabric-1.21/tests/controlling/mods/Controlling-fabric-1.21-18.0.4.jar b/versions/fabric-1.21/tests/controlling/mods/Controlling-fabric-1.21-18.0.4.jar new file mode 100644 index 00000000..772ecb25 Binary files /dev/null and b/versions/fabric-1.21/tests/controlling/mods/Controlling-fabric-1.21-18.0.4.jar differ diff --git a/versions/fabric-1.21/tests/controlling/mods/Searchables-fabric-1.21-1.0.5.jar b/versions/fabric-1.21/tests/controlling/mods/Searchables-fabric-1.21-1.0.5.jar new file mode 100644 index 00000000..d8040f93 Binary files /dev/null and b/versions/fabric-1.21/tests/controlling/mods/Searchables-fabric-1.21-1.0.5.jar differ diff --git a/versions/fabric-1.21/tests/shaders/mods/iris-fabric-1.8.8+mc1.21.1.jar b/versions/fabric-1.21/tests/shaders/mods/iris-fabric-1.8.8+mc1.21.1.jar new file mode 100644 index 00000000..f38f2685 Binary files /dev/null and b/versions/fabric-1.21/tests/shaders/mods/iris-fabric-1.8.8+mc1.21.1.jar differ diff --git a/versions/fabric-1.21/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.1.jar b/versions/fabric-1.21/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.1.jar new file mode 100644 index 00000000..1155b6e9 Binary files /dev/null and b/versions/fabric-1.21/tests/shaders/mods/sodium-fabric-0.6.13+mc1.21.1.jar differ diff --git a/versions/fabric-1.21/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-1.21/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-1.21/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/fabric-26.1/gradle.properties b/versions/fabric-26.1/gradle.properties new file mode 100644 index 00000000..c641720b --- /dev/null +++ b/versions/fabric-26.1/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Fabric Properties, check https://fabricmc.net/develop/ +build.fabric_api=0.155.2+26.1.2 +build.fabric-permissions-api = 0.7.0 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=26.1&l=fabric +dep.cloth-config=unknown +# flashback, check https://modrinth.com/mod/flashback/versions?g=26.1&l=fabric +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=26.1&l=fabric +dep.proxlib=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=26.1&l=fabric +dep.controlling=26.1.0.1 +# searchables, check https://modrinth.com/mod/searchables/versions?g=26.1&l=fabric +dep.searchables=jayVAixj +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=26.1&l=fabric +dep.modmenu=lWZE38V3 +# yacl, check https://modrinth.com/mod/yacl/versions?g=26.1&l=fabric +dep.yacl=3.9.0+26.1-fabric +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=26.1&l=fabric +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=26.1&l=fabric +dep.geckolib=yUpAp23B +# iris, check https://modrinth.com/mod/iris/versions?g=26.1&l=fabric +dep.iris=1.10.7+26.1-fabric +# sodium, check https://modrinth.com/mod/sodium/versions?g=26.1&l=fabric +dep.sodium=mc26.1-0.8.7-fabric diff --git a/versions/fabric-26.1/tests/commands/mods/LuckPerms-Fabric-5.5.57.jar b/versions/fabric-26.1/tests/commands/mods/LuckPerms-Fabric-5.5.57.jar new file mode 100644 index 00000000..168054ac Binary files /dev/null and b/versions/fabric-26.1/tests/commands/mods/LuckPerms-Fabric-5.5.57.jar differ diff --git a/versions/fabric-26.1/tests/controlling/mods/Controlling-fabric-26.1-26.1.0.1.jar b/versions/fabric-26.1/tests/controlling/mods/Controlling-fabric-26.1-26.1.0.1.jar new file mode 100644 index 00000000..f6e7e40a Binary files /dev/null and b/versions/fabric-26.1/tests/controlling/mods/Controlling-fabric-26.1-26.1.0.1.jar differ diff --git a/versions/fabric-26.1/tests/controlling/mods/Searchables-fabric-26.1-1.0.4.jar b/versions/fabric-26.1/tests/controlling/mods/Searchables-fabric-26.1-1.0.4.jar new file mode 100644 index 00000000..47fd1f52 Binary files /dev/null and b/versions/fabric-26.1/tests/controlling/mods/Searchables-fabric-26.1-1.0.4.jar differ diff --git a/versions/fabric-26.1/tests/shaders/mods/iris-fabric-1.11.2+mc26.1.2.jar b/versions/fabric-26.1/tests/shaders/mods/iris-fabric-1.11.2+mc26.1.2.jar new file mode 100644 index 00000000..7304fb30 Binary files /dev/null and b/versions/fabric-26.1/tests/shaders/mods/iris-fabric-1.11.2+mc26.1.2.jar differ diff --git a/versions/fabric-26.1/tests/shaders/mods/sodium-fabric-0.9.1+mc26.1.2.jar b/versions/fabric-26.1/tests/shaders/mods/sodium-fabric-0.9.1+mc26.1.2.jar new file mode 100644 index 00000000..7af2b2e5 Binary files /dev/null and b/versions/fabric-26.1/tests/shaders/mods/sodium-fabric-0.9.1+mc26.1.2.jar differ diff --git a/versions/fabric-26.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/fabric-26.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/fabric-26.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/forge-1.18.2/gradle.properties b/versions/forge-1.18.2/gradle.properties new file mode 100644 index 00000000..09f26f76 --- /dev/null +++ b/versions/forge-1.18.2/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Forge Properties, check https://files.minecraftforge.net/net/minecraftforge/forge/index_1.18.2.html +build.forge=1.18.2-40.3.12 +build.parchment=2022.11.06 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.18.2&l=forge +dep.cloth-config=ZbWG3eJW +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.18.2&l=forge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.18.2&l=forge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.18.2&l=forge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.18.2&l=forge +dep.controlling=GwInrrcn +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.18.2&l=forge +dep.searchables=OLvkSxl5 +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.18.2&l=forge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.18.2&l=forge +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.18.2&l=forge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.18.2&l=forge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.18.2&l=forge +dep.geckolib=wwh0ZFLu diff --git a/versions/forge-1.18.2/tests/commands/mods/LuckPerms-Forge-5.4.26.jar b/versions/forge-1.18.2/tests/commands/mods/LuckPerms-Forge-5.4.26.jar new file mode 100644 index 00000000..78b76f4a Binary files /dev/null and b/versions/forge-1.18.2/tests/commands/mods/LuckPerms-Forge-5.4.26.jar differ diff --git a/versions/forge-1.18.2/tests/controlling/mods/Controlling-forge-1.18.2-9.0+23.jar b/versions/forge-1.18.2/tests/controlling/mods/Controlling-forge-1.18.2-9.0+23.jar new file mode 100644 index 00000000..d449f3f4 Binary files /dev/null and b/versions/forge-1.18.2/tests/controlling/mods/Controlling-forge-1.18.2-9.0+23.jar differ diff --git a/versions/forge-1.18.2/tests/controlling/mods/Searchables-forge-1.18.2-1.0.1.jar b/versions/forge-1.18.2/tests/controlling/mods/Searchables-forge-1.18.2-1.0.1.jar new file mode 100644 index 00000000..c1239f62 Binary files /dev/null and b/versions/forge-1.18.2/tests/controlling/mods/Searchables-forge-1.18.2-1.0.1.jar differ diff --git a/versions/forge-1.18.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/forge-1.18.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/forge-1.18.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/forge-1.19.2/gradle.properties b/versions/forge-1.19.2/gradle.properties new file mode 100644 index 00000000..8f92d726 --- /dev/null +++ b/versions/forge-1.19.2/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Forge Properties, check https://files.minecraftforge.net/net/minecraftforge/forge/index_1.19.2.html +build.forge=1.19.2-43.5.2 +build.parchment=2022.11.27 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.2&l=forge +dep.cloth-config=qqCHdFw2 +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.2&l=forge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.2&l=forge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.2&l=forge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.2&l=forge +dep.controlling=cV6fmL90 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.2&l=forge +dep.searchables=LuotI0gV +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.2&l=forge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.2&l=forge +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.2&l=forge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.2&l=forge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.2&l=forge +dep.geckolib=lxzmD9V4 diff --git a/versions/forge-1.19.2/tests/commands/mods/LuckPerms-Forge-5.4.66.jar b/versions/forge-1.19.2/tests/commands/mods/LuckPerms-Forge-5.4.66.jar new file mode 100644 index 00000000..cc7e8553 Binary files /dev/null and b/versions/forge-1.19.2/tests/commands/mods/LuckPerms-Forge-5.4.66.jar differ diff --git a/versions/forge-1.19.2/tests/controlling/mods/Controlling-forge-1.19.2-10.0+7.jar b/versions/forge-1.19.2/tests/controlling/mods/Controlling-forge-1.19.2-10.0+7.jar new file mode 100644 index 00000000..60fc5cd6 Binary files /dev/null and b/versions/forge-1.19.2/tests/controlling/mods/Controlling-forge-1.19.2-10.0+7.jar differ diff --git a/versions/forge-1.19.2/tests/controlling/mods/Searchables-forge-1.19.2-1.0.2.jar b/versions/forge-1.19.2/tests/controlling/mods/Searchables-forge-1.19.2-1.0.2.jar new file mode 100644 index 00000000..e0eab673 Binary files /dev/null and b/versions/forge-1.19.2/tests/controlling/mods/Searchables-forge-1.19.2-1.0.2.jar differ diff --git a/versions/forge-1.19.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/forge-1.19.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/forge-1.19.2/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/forge-1.19.3/gradle.properties b/versions/forge-1.19.3/gradle.properties new file mode 100644 index 00000000..595b1ee6 --- /dev/null +++ b/versions/forge-1.19.3/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Forge Properties, check https://files.minecraftforge.net/net/minecraftforge/forge/index_1.19.3.html +build.forge=1.19.3-44.1.23 +build.parchment=2023.06.25 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.3&l=forge +dep.cloth-config=8AMPotFw +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.3&l=forge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.3&l=forge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.3&l=forge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.3&l=forge +dep.controlling=jT1SVIZR +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.3&l=forge +dep.searchables=hLMrJBAr +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.3&l=forge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.3&l=forge +dep.yacl=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.3&l=forge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.3&l=forge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.3&l=forge +dep.geckolib=QTZrKfzq diff --git a/versions/forge-1.19.3/tests/commands/mods/LuckPerms-Forge-5.4.66.jar b/versions/forge-1.19.3/tests/commands/mods/LuckPerms-Forge-5.4.66.jar new file mode 100644 index 00000000..cc7e8553 Binary files /dev/null and b/versions/forge-1.19.3/tests/commands/mods/LuckPerms-Forge-5.4.66.jar differ diff --git a/versions/forge-1.19.3/tests/controlling/mods/Controlling-forge-1.19.3-10.0+2.jar b/versions/forge-1.19.3/tests/controlling/mods/Controlling-forge-1.19.3-10.0+2.jar new file mode 100644 index 00000000..10cd5fb4 Binary files /dev/null and b/versions/forge-1.19.3/tests/controlling/mods/Controlling-forge-1.19.3-10.0+2.jar differ diff --git a/versions/forge-1.19.3/tests/controlling/mods/Searchables-forge-1.19.3-1.0.1.jar b/versions/forge-1.19.3/tests/controlling/mods/Searchables-forge-1.19.3-1.0.1.jar new file mode 100644 index 00000000..260fac42 Binary files /dev/null and b/versions/forge-1.19.3/tests/controlling/mods/Searchables-forge-1.19.3-1.0.1.jar differ diff --git a/versions/forge-1.19.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/forge-1.19.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/forge-1.19.3/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/forge-1.19.4/gradle.properties b/versions/forge-1.19.4/gradle.properties new file mode 100644 index 00000000..05210179 --- /dev/null +++ b/versions/forge-1.19.4/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Forge Properties, check https://files.minecraftforge.net/net/minecraftforge/forge/index_1.19.4.html +build.forge=1.19.4-45.4.3 +build.parchment=2023.06.26 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.19.4&l=forge +dep.cloth-config=mwddirHR +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.19.4&l=forge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.19.4&l=forge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.19.4&l=forge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.19.4&l=forge +dep.controlling=V5rSFq4V +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.19.4&l=forge +dep.searchables=erSt9y38 +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.19.4&l=forge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.19.4&l=forge +dep.yacl=3.1.1+1.19.4-forge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.19.4&l=forge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.19.4&l=forge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.19.4&l=forge +dep.geckolib=ApKEGN4z diff --git a/versions/forge-1.19.4/tests/commands/mods/LuckPerms-Forge-5.4.66.jar b/versions/forge-1.19.4/tests/commands/mods/LuckPerms-Forge-5.4.66.jar new file mode 100644 index 00000000..cc7e8553 Binary files /dev/null and b/versions/forge-1.19.4/tests/commands/mods/LuckPerms-Forge-5.4.66.jar differ diff --git a/versions/forge-1.19.4/tests/controlling/mods/Controlling-forge-1.19.4-11.1.5.jar b/versions/forge-1.19.4/tests/controlling/mods/Controlling-forge-1.19.4-11.1.5.jar new file mode 100644 index 00000000..758af8e3 Binary files /dev/null and b/versions/forge-1.19.4/tests/controlling/mods/Controlling-forge-1.19.4-11.1.5.jar differ diff --git a/versions/forge-1.19.4/tests/controlling/mods/Searchables-forge-1.19.4-1.0.3.jar b/versions/forge-1.19.4/tests/controlling/mods/Searchables-forge-1.19.4-1.0.3.jar new file mode 100644 index 00000000..a50992e1 Binary files /dev/null and b/versions/forge-1.19.4/tests/controlling/mods/Searchables-forge-1.19.4-1.0.3.jar differ diff --git a/versions/forge-1.19.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/forge-1.19.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/forge-1.19.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/forge-1.20.1/gradle.properties b/versions/forge-1.20.1/gradle.properties new file mode 100644 index 00000000..a45bac28 --- /dev/null +++ b/versions/forge-1.20.1/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# Forge Properties, check https://files.minecraftforge.net/net/minecraftforge/forge/index_1.20.1.html +build.forge=1.20.1-47.4.18 +build.parchment=2023.09.03 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.20.1&l=forge +dep.cloth-config=t8TXrZvZ +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.20.1&l=forge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.1&l=forge +dep.proxlib=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.1&l=forge +dep.controlling=LH6Bi6Am +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.1&l=forge +dep.searchables=PM9yAW1G +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.20.1&l=forge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.20.1&l=forge +dep.yacl=3.6.6+1.20.1-forge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.20.1&l=forge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.1&l=forge +dep.geckolib=HVdLnQMI +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.1&l=forge +dep.iris=unknown +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.1&l=forge +dep.sodium=unknown diff --git a/versions/forge-1.20.1/tests/commands/mods/LuckPerms-Forge-5.4.102.jar b/versions/forge-1.20.1/tests/commands/mods/LuckPerms-Forge-5.4.102.jar new file mode 100644 index 00000000..0fa4bced Binary files /dev/null and b/versions/forge-1.20.1/tests/commands/mods/LuckPerms-Forge-5.4.102.jar differ diff --git a/versions/forge-1.20.1/tests/controlling/Controlling-forge-1.20.1-12.0.2.jar b/versions/forge-1.20.1/tests/controlling/Controlling-forge-1.20.1-12.0.2.jar new file mode 100644 index 00000000..5f611e6a Binary files /dev/null and b/versions/forge-1.20.1/tests/controlling/Controlling-forge-1.20.1-12.0.2.jar differ diff --git a/versions/forge-1.20.1/tests/controlling/Searchables-forge-1.20.1-1.0.3.jar b/versions/forge-1.20.1/tests/controlling/Searchables-forge-1.20.1-1.0.3.jar new file mode 100644 index 00000000..a46ed958 Binary files /dev/null and b/versions/forge-1.20.1/tests/controlling/Searchables-forge-1.20.1-1.0.3.jar differ diff --git a/versions/forge-1.20.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/forge-1.20.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/forge-1.20.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.20.3/gradle.properties b/versions/neoforge-1.20.3/gradle.properties new file mode 100644 index 00000000..3db75036 --- /dev/null +++ b/versions/neoforge-1.20.3/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=20.3.8-beta +build.parchment=2023.12.31 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.20.3&l=neoforge +dep.cloth-config=gUuDD6aJ +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.20.3&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.3&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.3&l=neoforge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.3&l=neoforge +dep.controlling=grQTiN7A +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.3&l=neoforge +dep.searchables=ioHyWox3 +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.20.3&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.20.3&l=neoforge +dep.yacl=3.3.2+1.20.4-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.3&l=neoforge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.20.3&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.3&l=neoforge +dep.geckolib=Jfq413xC diff --git a/versions/neoforge-1.20.3/tests/controlling/mods/Controlling-neoforge-1.20.3-13.0.4.jar b/versions/neoforge-1.20.3/tests/controlling/mods/Controlling-neoforge-1.20.3-13.0.4.jar new file mode 100644 index 00000000..7195e0f6 Binary files /dev/null and b/versions/neoforge-1.20.3/tests/controlling/mods/Controlling-neoforge-1.20.3-13.0.4.jar differ diff --git a/versions/neoforge-1.20.3/tests/controlling/mods/Searchables-neoforge-1.20.3-1.0.2.jar b/versions/neoforge-1.20.3/tests/controlling/mods/Searchables-neoforge-1.20.3-1.0.2.jar new file mode 100644 index 00000000..f8223834 Binary files /dev/null and b/versions/neoforge-1.20.3/tests/controlling/mods/Searchables-neoforge-1.20.3-1.0.2.jar differ diff --git a/versions/neoforge-1.20.4/gradle.properties b/versions/neoforge-1.20.4/gradle.properties new file mode 100644 index 00000000..60f3faa0 --- /dev/null +++ b/versions/neoforge-1.20.4/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=20.4.251 +build.parchment=2024.04.14 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.20.4&l=neoforge +dep.cloth-config=gUuDD6aJ +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.20.4&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.4&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.4&l=neoforge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.4&l=neoforge +dep.controlling=yLWDcBEy +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.4&l=neoforge +dep.searchables=jvJd9WhS +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.20.4&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.20.4&l=neoforge +dep.yacl=3.6.6+1.20.4-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.4&l=neoforge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.20.4&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.4&l=neoforge +dep.geckolib=jK2C8NsI diff --git a/versions/neoforge-1.20.4/tests/controlling/mods/Controlling-neoforge-1.20.4-15.0.5.jar b/versions/neoforge-1.20.4/tests/controlling/mods/Controlling-neoforge-1.20.4-15.0.5.jar new file mode 100644 index 00000000..38f2fc70 Binary files /dev/null and b/versions/neoforge-1.20.4/tests/controlling/mods/Controlling-neoforge-1.20.4-15.0.5.jar differ diff --git a/versions/neoforge-1.20.4/tests/controlling/mods/Searchables-neoforge-1.20.4-1.0.6.jar b/versions/neoforge-1.20.4/tests/controlling/mods/Searchables-neoforge-1.20.4-1.0.6.jar new file mode 100644 index 00000000..5a5faf5d Binary files /dev/null and b/versions/neoforge-1.20.4/tests/controlling/mods/Searchables-neoforge-1.20.4-1.0.6.jar differ diff --git a/versions/neoforge-1.20.6/gradle.properties b/versions/neoforge-1.20.6/gradle.properties new file mode 100644 index 00000000..4ab7e788 --- /dev/null +++ b/versions/neoforge-1.20.6/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=20.6.139 +build.parchment=2024.06.16 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.20.6&l=neoforge +dep.cloth-config=hradv69C +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.20.6&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.20.6&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.20.6&l=neoforge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.20.6&l=neoforge +dep.controlling=ZJ9KZOWn +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.20.6&l=neoforge +dep.searchables=cVMlbiND +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.20.6&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.20.6&l=neoforge +dep.yacl=3.6.6+1.20.6-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.20.6&l=neoforge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.20.6&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.20.6&l=neoforge +dep.geckolib=ehZxw0RG diff --git a/versions/neoforge-1.20.6/tests/controlling/mods/Controlling-neoforge-1.20.6-17.0.1.jar b/versions/neoforge-1.20.6/tests/controlling/mods/Controlling-neoforge-1.20.6-17.0.1.jar new file mode 100644 index 00000000..19391b39 Binary files /dev/null and b/versions/neoforge-1.20.6/tests/controlling/mods/Controlling-neoforge-1.20.6-17.0.1.jar differ diff --git a/versions/neoforge-1.20.6/tests/controlling/mods/Searchables-neoforge-1.20.6-1.0.1.jar b/versions/neoforge-1.20.6/tests/controlling/mods/Searchables-neoforge-1.20.6-1.0.1.jar new file mode 100644 index 00000000..7e8bff17 Binary files /dev/null and b/versions/neoforge-1.20.6/tests/controlling/mods/Searchables-neoforge-1.20.6-1.0.1.jar differ diff --git a/versions/neoforge-1.21.1/gradle.properties b/versions/neoforge-1.21.1/gradle.properties new file mode 100644 index 00000000..d32dd559 --- /dev/null +++ b/versions/neoforge-1.21.1/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.1.221 +build.parchment=2024.11.17 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.1&l=neoforge +dep.cloth-config=izKINKFg +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.1&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.1&l=neoforge +dep.proxlib=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.1&l=neoforge +dep.controlling=FaNppCJJ +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.1&l=neoforge +dep.searchables=iEE85X0w +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.1&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.1&l=neoforge +dep.yacl=3.8.2+1.21.1-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.1&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.1&l=neoforge +dep.geckolib=gFmrC8Ru +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.1&l=neoforge +dep.iris=1.8.12+1.21.1-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.1&l=neoforge +dep.sodium=mc1.21.1-0.6.13-neoforge diff --git a/versions/neoforge-1.21.1/tests/commands/mods/LuckPerms-NeoForge-5.4.140.jar b/versions/neoforge-1.21.1/tests/commands/mods/LuckPerms-NeoForge-5.4.140.jar new file mode 100644 index 00000000..cb55a7fe Binary files /dev/null and b/versions/neoforge-1.21.1/tests/commands/mods/LuckPerms-NeoForge-5.4.140.jar differ diff --git a/versions/neoforge-1.21.1/tests/controlling/config/fml.toml b/versions/neoforge-1.21.1/tests/controlling/config/fml.toml new file mode 100644 index 00000000..f126de72 --- /dev/null +++ b/versions/neoforge-1.21.1/tests/controlling/config/fml.toml @@ -0,0 +1,32 @@ +#Disables File Watcher. Used to automatically update config if its file has been modified. +disableConfigWatcher = false +#Should we control the window. Disabling this disables new GL features and can be bad for mods that rely on them. +earlyWindowControl = true +#Max threads for early initialization parallelism, -1 is based on processor count +maxThreads = -1 +#Enable NeoForge global version checking +versionCheck = true +#Default config path for servers +defaultConfigPath = "defaultconfigs" +#Disables Optimized DFU client-side - already disabled on servers +disableOptimizedDFU = true +#Early window provider +earlyWindowProvider = "fmlearlywindow" +#Early window width +earlyWindowWidth = 854 +#Early window height +earlyWindowHeight = 480 +#Early window framebuffer scale +earlyWindowFBScale = 1 +#Early window starts maximized +earlyWindowMaximized = false +#Skip specific GL versions, may help with buggy graphics card drivers +earlyWindowSkipGLVersions = [] +#Squir? +earlyWindowSquir = false +#Define dependency overrides below +#Dependency overrides can be used to forcibly remove a dependency constraint from a mod or to force a mod to load AFTER another mod +#Using dependency overrides can cause issues. Use at your own risk. +#Example dependency override for the mod with the id 'targetMod': dependency constraints (incompatibility clauses or restrictive version ranges) against mod 'dep1' are removed, and the mod will now load after the mod 'dep2' +#dependencyOverrides.targetMod = ["-dep1", "+dep2"] +dependencyOverrides = {} diff --git a/versions/neoforge-1.21.1/tests/controlling/mods/Controlling-neoforge-1.21.1-19.0.5.jar b/versions/neoforge-1.21.1/tests/controlling/mods/Controlling-neoforge-1.21.1-19.0.5.jar new file mode 100644 index 00000000..e8d08681 Binary files /dev/null and b/versions/neoforge-1.21.1/tests/controlling/mods/Controlling-neoforge-1.21.1-19.0.5.jar differ diff --git a/versions/neoforge-1.21.1/tests/controlling/mods/Searchables-neoforge-1.21.1-1.0.2.jar b/versions/neoforge-1.21.1/tests/controlling/mods/Searchables-neoforge-1.21.1-1.0.2.jar new file mode 100644 index 00000000..3e97e55c Binary files /dev/null and b/versions/neoforge-1.21.1/tests/controlling/mods/Searchables-neoforge-1.21.1-1.0.2.jar differ diff --git a/versions/neoforge-1.21.1/tests/shaders/mods/iris-neoforge-1.8.14-beta.1+mc1.21.1.jar b/versions/neoforge-1.21.1/tests/shaders/mods/iris-neoforge-1.8.14-beta.1+mc1.21.1.jar new file mode 100644 index 00000000..55e2194e Binary files /dev/null and b/versions/neoforge-1.21.1/tests/shaders/mods/iris-neoforge-1.8.14-beta.1+mc1.21.1.jar differ diff --git a/versions/neoforge-1.21.1/tests/shaders/mods/sodium-neoforge-0.8.12+mc1.21.1.jar b/versions/neoforge-1.21.1/tests/shaders/mods/sodium-neoforge-0.8.12+mc1.21.1.jar new file mode 100644 index 00000000..28c56a25 Binary files /dev/null and b/versions/neoforge-1.21.1/tests/shaders/mods/sodium-neoforge-0.8.12+mc1.21.1.jar differ diff --git a/versions/neoforge-1.21.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.1/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.10/gradle.properties b/versions/neoforge-1.21.10/gradle.properties new file mode 100644 index 00000000..e8d645e7 --- /dev/null +++ b/versions/neoforge-1.21.10/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.10.64 +build.parchment=2025.10.12 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.10&l=neoforge +dep.cloth-config=AzRGxC9j +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.10&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.10&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.10&l=neoforge +dep.iris=1.9.7+1.21.10-neoforge +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.10&l=neoforge +dep.controlling=Ox7wBE2Z +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.10&l=neoforge +dep.searchables=pzyMetcT +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.10&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.10&l=neoforge +dep.yacl=3.8.2+1.21.10-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.10&l=neoforge +dep.sodium=mc1.21.10-0.7.3-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.10&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.10&l=neoforge +dep.geckolib=xji1VqGU diff --git a/versions/neoforge-1.21.10/tests/commands/mods/LuckPerms-NeoForge-5.5.17.jar b/versions/neoforge-1.21.10/tests/commands/mods/LuckPerms-NeoForge-5.5.17.jar new file mode 100644 index 00000000..87be52ad Binary files /dev/null and b/versions/neoforge-1.21.10/tests/commands/mods/LuckPerms-NeoForge-5.5.17.jar differ diff --git a/versions/neoforge-1.21.10/tests/controlling/mods/Controlling-neoforge-1.21.10-28.0.2.jar b/versions/neoforge-1.21.10/tests/controlling/mods/Controlling-neoforge-1.21.10-28.0.2.jar new file mode 100644 index 00000000..6a805b67 Binary files /dev/null and b/versions/neoforge-1.21.10/tests/controlling/mods/Controlling-neoforge-1.21.10-28.0.2.jar differ diff --git a/versions/neoforge-1.21.10/tests/controlling/mods/Searchables-neoforge-1.21.10-1.0.2.jar b/versions/neoforge-1.21.10/tests/controlling/mods/Searchables-neoforge-1.21.10-1.0.2.jar new file mode 100644 index 00000000..8829f7ae Binary files /dev/null and b/versions/neoforge-1.21.10/tests/controlling/mods/Searchables-neoforge-1.21.10-1.0.2.jar differ diff --git a/versions/neoforge-1.21.10/tests/shaders/config/neoforge-client.toml b/versions/neoforge-1.21.10/tests/shaders/config/neoforge-client.toml new file mode 100644 index 00000000..d82f0822 --- /dev/null +++ b/versions/neoforge-1.21.10/tests/shaders/config/neoforge-client.toml @@ -0,0 +1,12 @@ +#Enable the enhanced block model lighting pipeline - fixes the lighting of custom models, as well as many vanilla bugs. +enhancedLighting = true +#When enabled, NeoForge will show any warnings that occurred during loading. +showLoadWarnings = true +#A config option mainly for developers. Logs out configuration values that do not have translations when running a client in a development environment. +logUntranslatedConfigurationWarnings = true +#Configures how many bits are used for the depth buffer when stenciling has been enabled by a mod. Set to true for 24+8 bits and to false for 32+8 bits. Setting to true will slightly reduce VRAM usage, but risks introducing visual artifacts. +reducedDepthStencilFormat = false +#When enabled, AO will be handled per BlockModelPart instead of using the first part's AO setting +handleAmbientOcclusionPerPart = true +#When enabled, all usage of Blaze3D will be validated against allowed usage +enableB3DValidationLayer = false diff --git a/versions/neoforge-1.21.10/tests/shaders/mods/iris-neoforge-1.9.7+mc1.21.10.jar b/versions/neoforge-1.21.10/tests/shaders/mods/iris-neoforge-1.9.7+mc1.21.10.jar new file mode 100644 index 00000000..bef15d15 Binary files /dev/null and b/versions/neoforge-1.21.10/tests/shaders/mods/iris-neoforge-1.9.7+mc1.21.10.jar differ diff --git a/versions/neoforge-1.21.10/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.10.jar b/versions/neoforge-1.21.10/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.10.jar new file mode 100644 index 00000000..47f98f3a Binary files /dev/null and b/versions/neoforge-1.21.10/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.10.jar differ diff --git a/versions/neoforge-1.21.10/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.10/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.10/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.11/gradle.properties b/versions/neoforge-1.21.11/gradle.properties new file mode 100644 index 00000000..84c755a2 --- /dev/null +++ b/versions/neoforge-1.21.11/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.11.40-beta +build.parchment=2025.12.20 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.11&l=neoforge +dep.cloth-config=Wsus0EWg +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.11&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.11&l=neoforge +dep.proxlib=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.11&l=neoforge +dep.controlling=hdMpvWkx +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.11&l=neoforge +dep.searchables=Q0OwTB2u +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.11&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.11&l=neoforge +dep.yacl=3.8.2+1.21.11-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.11&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.11&l=neoforge +dep.geckolib=FpONDAt3 +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.11&l=neoforge +dep.iris=1.10.7+1.21.11-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.11&l=neoforge +dep.sodium=mc1.21.11-0.8.7-neoforge diff --git a/versions/neoforge-1.21.11/tests/commands/mods/LuckPerms-NeoForge-5.5.21.jar b/versions/neoforge-1.21.11/tests/commands/mods/LuckPerms-NeoForge-5.5.21.jar new file mode 100644 index 00000000..2a4774d4 Binary files /dev/null and b/versions/neoforge-1.21.11/tests/commands/mods/LuckPerms-NeoForge-5.5.21.jar differ diff --git a/versions/neoforge-1.21.11/tests/controlling/mods/Controlling-neoforge-1.21.11-29.0.1.jar b/versions/neoforge-1.21.11/tests/controlling/mods/Controlling-neoforge-1.21.11-29.0.1.jar new file mode 100644 index 00000000..beb62de1 Binary files /dev/null and b/versions/neoforge-1.21.11/tests/controlling/mods/Controlling-neoforge-1.21.11-29.0.1.jar differ diff --git a/versions/neoforge-1.21.11/tests/controlling/mods/Searchables-neoforge-1.21.11-1.0.4.jar b/versions/neoforge-1.21.11/tests/controlling/mods/Searchables-neoforge-1.21.11-1.0.4.jar new file mode 100644 index 00000000..872dc1f6 Binary files /dev/null and b/versions/neoforge-1.21.11/tests/controlling/mods/Searchables-neoforge-1.21.11-1.0.4.jar differ diff --git a/versions/neoforge-1.21.11/tests/shaders/config/neoforge-client.toml b/versions/neoforge-1.21.11/tests/shaders/config/neoforge-client.toml new file mode 100644 index 00000000..d82f0822 --- /dev/null +++ b/versions/neoforge-1.21.11/tests/shaders/config/neoforge-client.toml @@ -0,0 +1,12 @@ +#Enable the enhanced block model lighting pipeline - fixes the lighting of custom models, as well as many vanilla bugs. +enhancedLighting = true +#When enabled, NeoForge will show any warnings that occurred during loading. +showLoadWarnings = true +#A config option mainly for developers. Logs out configuration values that do not have translations when running a client in a development environment. +logUntranslatedConfigurationWarnings = true +#Configures how many bits are used for the depth buffer when stenciling has been enabled by a mod. Set to true for 24+8 bits and to false for 32+8 bits. Setting to true will slightly reduce VRAM usage, but risks introducing visual artifacts. +reducedDepthStencilFormat = false +#When enabled, AO will be handled per BlockModelPart instead of using the first part's AO setting +handleAmbientOcclusionPerPart = true +#When enabled, all usage of Blaze3D will be validated against allowed usage +enableB3DValidationLayer = false diff --git a/versions/neoforge-1.21.11/tests/shaders/mods/iris-neoforge-1.10.7+mc1.21.11.jar b/versions/neoforge-1.21.11/tests/shaders/mods/iris-neoforge-1.10.7+mc1.21.11.jar new file mode 100644 index 00000000..1cd86ce6 Binary files /dev/null and b/versions/neoforge-1.21.11/tests/shaders/mods/iris-neoforge-1.10.7+mc1.21.11.jar differ diff --git a/versions/neoforge-1.21.11/tests/shaders/mods/sodium-neoforge-0.8.13+mc1.21.11.jar b/versions/neoforge-1.21.11/tests/shaders/mods/sodium-neoforge-0.8.13+mc1.21.11.jar new file mode 100644 index 00000000..709a602f Binary files /dev/null and b/versions/neoforge-1.21.11/tests/shaders/mods/sodium-neoforge-0.8.13+mc1.21.11.jar differ diff --git a/versions/neoforge-1.21.11/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.11/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.11/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.4/gradle.properties b/versions/neoforge-1.21.4/gradle.properties new file mode 100644 index 00000000..84b06b7c --- /dev/null +++ b/versions/neoforge-1.21.4/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.4.157 +build.parchment=2025.03.23 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.4&l=neoforge +dep.cloth-config=dWfheG9X +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.4&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.4&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.4&l=neoforge +dep.iris=1.8.8+1.21.4-neoforge +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.4&l=neoforge +dep.controlling=12sYUzqU +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.4&l=neoforge +dep.searchables=gYDrOD6p +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.4&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.4&l=neoforge +dep.yacl=3.8.2+1.21.4-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.4&l=neoforge +dep.sodium=mc1.21.4-0.6.13-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.4&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.4&l=neoforge +dep.geckolib=eQtABRub diff --git a/versions/neoforge-1.21.4/tests/commands/mods/LuckPerms-NeoForge-5.4.150.jar b/versions/neoforge-1.21.4/tests/commands/mods/LuckPerms-NeoForge-5.4.150.jar new file mode 100644 index 00000000..04339233 Binary files /dev/null and b/versions/neoforge-1.21.4/tests/commands/mods/LuckPerms-NeoForge-5.4.150.jar differ diff --git a/versions/neoforge-1.21.4/tests/controlling/mods/Controlling-neoforge-1.21.4-22.0.5.jar b/versions/neoforge-1.21.4/tests/controlling/mods/Controlling-neoforge-1.21.4-22.0.5.jar new file mode 100644 index 00000000..9868d2a5 Binary files /dev/null and b/versions/neoforge-1.21.4/tests/controlling/mods/Controlling-neoforge-1.21.4-22.0.5.jar differ diff --git a/versions/neoforge-1.21.4/tests/controlling/mods/Searchables-neoforge-1.21.4-1.0.5.jar b/versions/neoforge-1.21.4/tests/controlling/mods/Searchables-neoforge-1.21.4-1.0.5.jar new file mode 100644 index 00000000..e581c461 Binary files /dev/null and b/versions/neoforge-1.21.4/tests/controlling/mods/Searchables-neoforge-1.21.4-1.0.5.jar differ diff --git a/versions/neoforge-1.21.4/tests/shaders/mods/iris-neoforge-1.8.8+mc1.21.4.jar b/versions/neoforge-1.21.4/tests/shaders/mods/iris-neoforge-1.8.8+mc1.21.4.jar new file mode 100644 index 00000000..3ad22cb4 Binary files /dev/null and b/versions/neoforge-1.21.4/tests/shaders/mods/iris-neoforge-1.8.8+mc1.21.4.jar differ diff --git a/versions/neoforge-1.21.4/tests/shaders/mods/sodium-neoforge-0.6.13+mc1.21.4.jar b/versions/neoforge-1.21.4/tests/shaders/mods/sodium-neoforge-0.6.13+mc1.21.4.jar new file mode 100644 index 00000000..c0f74053 Binary files /dev/null and b/versions/neoforge-1.21.4/tests/shaders/mods/sodium-neoforge-0.6.13+mc1.21.4.jar differ diff --git a/versions/neoforge-1.21.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.4/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.5/gradle.properties b/versions/neoforge-1.21.5/gradle.properties new file mode 100644 index 00000000..f800f517 --- /dev/null +++ b/versions/neoforge-1.21.5/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.5.97 +build.parchment=2025.06.15 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.5&l=neoforge +dep.cloth-config=jjrPm6iW +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.5&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.5&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.5&l=neoforge +dep.iris=1.8.11+1.21.5-neoforge +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.5&l=neoforge +dep.controlling=71S03MUR +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.5&l=neoforge +dep.searchables=lSLO3fqv +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.5&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.5&l=neoforge +dep.yacl=3.8.2+1.21.5-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.5&l=neoforge +dep.sodium=mc1.21.5-0.6.13-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.5&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.5&l=neoforge +dep.geckolib=GbxHZH7t diff --git a/versions/neoforge-1.21.5/tests/commands/mods/LuckPerms-NeoForge-5.5.0.jar b/versions/neoforge-1.21.5/tests/commands/mods/LuckPerms-NeoForge-5.5.0.jar new file mode 100644 index 00000000..8f13d7b3 Binary files /dev/null and b/versions/neoforge-1.21.5/tests/commands/mods/LuckPerms-NeoForge-5.5.0.jar differ diff --git a/versions/neoforge-1.21.5/tests/controlling/mods/Controlling-neoforge-1.21.5-23.0.2.jar b/versions/neoforge-1.21.5/tests/controlling/mods/Controlling-neoforge-1.21.5-23.0.2.jar new file mode 100644 index 00000000..bf1abdae Binary files /dev/null and b/versions/neoforge-1.21.5/tests/controlling/mods/Controlling-neoforge-1.21.5-23.0.2.jar differ diff --git a/versions/neoforge-1.21.5/tests/controlling/mods/Searchables-neoforge-1.21.5-1.0.3.jar b/versions/neoforge-1.21.5/tests/controlling/mods/Searchables-neoforge-1.21.5-1.0.3.jar new file mode 100644 index 00000000..6f979636 Binary files /dev/null and b/versions/neoforge-1.21.5/tests/controlling/mods/Searchables-neoforge-1.21.5-1.0.3.jar differ diff --git a/versions/neoforge-1.21.5/tests/shaders/mods/iris-neoforge-1.8.11+mc1.21.5.jar b/versions/neoforge-1.21.5/tests/shaders/mods/iris-neoforge-1.8.11+mc1.21.5.jar new file mode 100644 index 00000000..caef6825 Binary files /dev/null and b/versions/neoforge-1.21.5/tests/shaders/mods/iris-neoforge-1.8.11+mc1.21.5.jar differ diff --git a/versions/neoforge-1.21.5/tests/shaders/mods/sodium-neoforge-0.6.13+mc1.21.5.jar b/versions/neoforge-1.21.5/tests/shaders/mods/sodium-neoforge-0.6.13+mc1.21.5.jar new file mode 100644 index 00000000..c48ea129 Binary files /dev/null and b/versions/neoforge-1.21.5/tests/shaders/mods/sodium-neoforge-0.6.13+mc1.21.5.jar differ diff --git a/versions/neoforge-1.21.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.5/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.6/gradle.properties b/versions/neoforge-1.21.6/gradle.properties new file mode 100644 index 00000000..4f825819 --- /dev/null +++ b/versions/neoforge-1.21.6/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.6.20-beta +build.parchment=2025.06.29 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.6&l=neoforge +dep.cloth-config=BYkKAJ0C +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.6&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.6&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.6&l=neoforge +dep.iris=T06etL58 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.6&l=neoforge +dep.controlling=dnnmqCGf +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.6&l=neoforge +dep.searchables=zY0dOSb7 +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.6&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.6&l=neoforge +dep.yacl=3.8.2+1.21.6-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.6&l=neoforge +dep.sodium=q6wdZywr +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.6&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.6&l=neoforge +dep.geckolib=faqm9u5p diff --git a/versions/neoforge-1.21.6/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar b/versions/neoforge-1.21.6/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar new file mode 100644 index 00000000..ca56f702 Binary files /dev/null and b/versions/neoforge-1.21.6/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar differ diff --git a/versions/neoforge-1.21.6/tests/controlling/mods/Controlling-neoforge-1.21.6-24.0.2.jar b/versions/neoforge-1.21.6/tests/controlling/mods/Controlling-neoforge-1.21.6-24.0.2.jar new file mode 100644 index 00000000..84e479de Binary files /dev/null and b/versions/neoforge-1.21.6/tests/controlling/mods/Controlling-neoforge-1.21.6-24.0.2.jar differ diff --git a/versions/neoforge-1.21.6/tests/controlling/mods/Searchables-neoforge-1.21.6-1.0.3.jar b/versions/neoforge-1.21.6/tests/controlling/mods/Searchables-neoforge-1.21.6-1.0.3.jar new file mode 100644 index 00000000..cefdf7a6 Binary files /dev/null and b/versions/neoforge-1.21.6/tests/controlling/mods/Searchables-neoforge-1.21.6-1.0.3.jar differ diff --git a/versions/neoforge-1.21.6/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar b/versions/neoforge-1.21.6/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar new file mode 100644 index 00000000..1d01a929 Binary files /dev/null and b/versions/neoforge-1.21.6/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar differ diff --git a/versions/neoforge-1.21.6/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.8.jar b/versions/neoforge-1.21.6/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.8.jar new file mode 100644 index 00000000..289c90db Binary files /dev/null and b/versions/neoforge-1.21.6/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.8.jar differ diff --git a/versions/neoforge-1.21.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.6/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.7/gradle.properties b/versions/neoforge-1.21.7/gradle.properties new file mode 100644 index 00000000..38db728e --- /dev/null +++ b/versions/neoforge-1.21.7/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.7.25-beta +build.parchment=2025.07.18 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.7&l=neoforge +dep.cloth-config=BYkKAJ0C +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.7&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.7&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.7&l=neoforge +dep.iris=T06etL58 +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.7&l=neoforge +dep.controlling=SC6eKpI4 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.7&l=neoforge +dep.searchables=wclSfrXG +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.7&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.7&l=neoforge +dep.yacl=3.7.1+1.21.6-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.7&l=neoforge +dep.sodium=q6wdZywr +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.7&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.7&l=neoforge +dep.geckolib=U4DFMhQx diff --git a/versions/neoforge-1.21.7/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar b/versions/neoforge-1.21.7/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar new file mode 100644 index 00000000..ca56f702 Binary files /dev/null and b/versions/neoforge-1.21.7/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar differ diff --git a/versions/neoforge-1.21.7/tests/controlling/mods/Controlling-neoforge-1.21.7-25.0.2.jar b/versions/neoforge-1.21.7/tests/controlling/mods/Controlling-neoforge-1.21.7-25.0.2.jar new file mode 100644 index 00000000..4f0acdd2 Binary files /dev/null and b/versions/neoforge-1.21.7/tests/controlling/mods/Controlling-neoforge-1.21.7-25.0.2.jar differ diff --git a/versions/neoforge-1.21.7/tests/controlling/mods/Searchables-neoforge-1.21.7-1.0.2.jar b/versions/neoforge-1.21.7/tests/controlling/mods/Searchables-neoforge-1.21.7-1.0.2.jar new file mode 100644 index 00000000..a1f3f340 Binary files /dev/null and b/versions/neoforge-1.21.7/tests/controlling/mods/Searchables-neoforge-1.21.7-1.0.2.jar differ diff --git a/versions/neoforge-1.21.7/tests/shaders/config/neoforge-client.toml b/versions/neoforge-1.21.7/tests/shaders/config/neoforge-client.toml new file mode 100644 index 00000000..d82f0822 --- /dev/null +++ b/versions/neoforge-1.21.7/tests/shaders/config/neoforge-client.toml @@ -0,0 +1,12 @@ +#Enable the enhanced block model lighting pipeline - fixes the lighting of custom models, as well as many vanilla bugs. +enhancedLighting = true +#When enabled, NeoForge will show any warnings that occurred during loading. +showLoadWarnings = true +#A config option mainly for developers. Logs out configuration values that do not have translations when running a client in a development environment. +logUntranslatedConfigurationWarnings = true +#Configures how many bits are used for the depth buffer when stenciling has been enabled by a mod. Set to true for 24+8 bits and to false for 32+8 bits. Setting to true will slightly reduce VRAM usage, but risks introducing visual artifacts. +reducedDepthStencilFormat = false +#When enabled, AO will be handled per BlockModelPart instead of using the first part's AO setting +handleAmbientOcclusionPerPart = true +#When enabled, all usage of Blaze3D will be validated against allowed usage +enableB3DValidationLayer = false diff --git a/versions/neoforge-1.21.7/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar b/versions/neoforge-1.21.7/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar new file mode 100644 index 00000000..1d01a929 Binary files /dev/null and b/versions/neoforge-1.21.7/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar differ diff --git a/versions/neoforge-1.21.7/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.8.jar b/versions/neoforge-1.21.7/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.8.jar new file mode 100644 index 00000000..289c90db Binary files /dev/null and b/versions/neoforge-1.21.7/tests/shaders/mods/sodium-neoforge-0.7.3+mc1.21.8.jar differ diff --git a/versions/neoforge-1.21.7/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.7/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.7/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.8/gradle.properties b/versions/neoforge-1.21.8/gradle.properties new file mode 100644 index 00000000..057f9559 --- /dev/null +++ b/versions/neoforge-1.21.8/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.8.53 +build.parchment=2025.09.14 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.8&l=neoforge +dep.cloth-config=BYkKAJ0C +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.8&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.8&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.8&l=neoforge +dep.iris=1.9.6+1.21.8-neoforge +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.8&l=neoforge +dep.controlling=ihQqMaN8 +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.8&l=neoforge +dep.searchables=SYIqnLip +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.8&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.8&l=neoforge +dep.yacl=3.7.1+1.21.6-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.8&l=neoforge +dep.sodium=mc1.21.8-0.7.3-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.8&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.8&l=neoforge +dep.geckolib=KPEgpbCC diff --git a/versions/neoforge-1.21.8/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar b/versions/neoforge-1.21.8/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar new file mode 100644 index 00000000..ca56f702 Binary files /dev/null and b/versions/neoforge-1.21.8/tests/commands/mods/LuckPerms-NeoForge-5.5.10.jar differ diff --git a/versions/neoforge-1.21.8/tests/controlling/mods/Controlling-neoforge-1.21.8-26.0.3.jar b/versions/neoforge-1.21.8/tests/controlling/mods/Controlling-neoforge-1.21.8-26.0.3.jar new file mode 100644 index 00000000..0a38597c Binary files /dev/null and b/versions/neoforge-1.21.8/tests/controlling/mods/Controlling-neoforge-1.21.8-26.0.3.jar differ diff --git a/versions/neoforge-1.21.8/tests/controlling/mods/Searchables-neoforge-1.21.8-1.0.2.jar b/versions/neoforge-1.21.8/tests/controlling/mods/Searchables-neoforge-1.21.8-1.0.2.jar new file mode 100644 index 00000000..c94c11ce Binary files /dev/null and b/versions/neoforge-1.21.8/tests/controlling/mods/Searchables-neoforge-1.21.8-1.0.2.jar differ diff --git a/versions/neoforge-1.21.8/tests/shaders/config/neoforge-client.toml b/versions/neoforge-1.21.8/tests/shaders/config/neoforge-client.toml new file mode 100644 index 00000000..d82f0822 --- /dev/null +++ b/versions/neoforge-1.21.8/tests/shaders/config/neoforge-client.toml @@ -0,0 +1,12 @@ +#Enable the enhanced block model lighting pipeline - fixes the lighting of custom models, as well as many vanilla bugs. +enhancedLighting = true +#When enabled, NeoForge will show any warnings that occurred during loading. +showLoadWarnings = true +#A config option mainly for developers. Logs out configuration values that do not have translations when running a client in a development environment. +logUntranslatedConfigurationWarnings = true +#Configures how many bits are used for the depth buffer when stenciling has been enabled by a mod. Set to true for 24+8 bits and to false for 32+8 bits. Setting to true will slightly reduce VRAM usage, but risks introducing visual artifacts. +reducedDepthStencilFormat = false +#When enabled, AO will be handled per BlockModelPart instead of using the first part's AO setting +handleAmbientOcclusionPerPart = true +#When enabled, all usage of Blaze3D will be validated against allowed usage +enableB3DValidationLayer = false diff --git a/versions/neoforge-1.21.8/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar b/versions/neoforge-1.21.8/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar new file mode 100644 index 00000000..1d01a929 Binary files /dev/null and b/versions/neoforge-1.21.8/tests/shaders/mods/iris-neoforge-1.9.6+mc1.21.8.jar differ diff --git a/versions/neoforge-1.21.8/tests/shaders/mods/sodium-neoforge-0.7.2+mc1.21.8.jar b/versions/neoforge-1.21.8/tests/shaders/mods/sodium-neoforge-0.7.2+mc1.21.8.jar new file mode 100644 index 00000000..c844b696 Binary files /dev/null and b/versions/neoforge-1.21.8/tests/shaders/mods/sodium-neoforge-0.7.2+mc1.21.8.jar differ diff --git a/versions/neoforge-1.21.8/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.8/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.8/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-1.21.9/gradle.properties b/versions/neoforge-1.21.9/gradle.properties new file mode 100644 index 00000000..8368c18f --- /dev/null +++ b/versions/neoforge-1.21.9/gradle.properties @@ -0,0 +1,31 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=21.9.16-beta +build.parchment=2025.10.05 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=1.21.9&l=neoforge +dep.cloth-config=AzRGxC9j +# flashback, check https://modrinth.com/mod/flashback/versions?g=1.21.9&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=1.21.9&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=1.21.9&l=neoforge +dep.iris=unknown +# controlling, check https://modrinth.com/mod/controlling/versions?g=1.21.9&l=neoforge +dep.controlling=y0iRFmNm +# searchables, check https://modrinth.com/mod/searchables/versions?g=1.21.9&l=neoforge +dep.searchables=Pr3PYkuE +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=1.21.9&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=1.21.9&l=neoforge +dep.yacl=3.8.0+1.21.9-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=1.21.9&l=neoforge +dep.sodium=unknown +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=1.21.9&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=1.21.9&l=neoforge +dep.geckolib=unknown diff --git a/versions/neoforge-1.21.9/tests/commands/mods/LuckPerms-NeoForge-5.5.17.jar b/versions/neoforge-1.21.9/tests/commands/mods/LuckPerms-NeoForge-5.5.17.jar new file mode 100644 index 00000000..87be52ad Binary files /dev/null and b/versions/neoforge-1.21.9/tests/commands/mods/LuckPerms-NeoForge-5.5.17.jar differ diff --git a/versions/neoforge-1.21.9/tests/controlling/mods/Controlling-neoforge-1.21.9-27.0.2.jar b/versions/neoforge-1.21.9/tests/controlling/mods/Controlling-neoforge-1.21.9-27.0.2.jar new file mode 100644 index 00000000..94469693 Binary files /dev/null and b/versions/neoforge-1.21.9/tests/controlling/mods/Controlling-neoforge-1.21.9-27.0.2.jar differ diff --git a/versions/neoforge-1.21.9/tests/controlling/mods/Searchables-neoforge-1.21.9-1.0.2.jar b/versions/neoforge-1.21.9/tests/controlling/mods/Searchables-neoforge-1.21.9-1.0.2.jar new file mode 100644 index 00000000..70b39f77 Binary files /dev/null and b/versions/neoforge-1.21.9/tests/controlling/mods/Searchables-neoforge-1.21.9-1.0.2.jar differ diff --git a/versions/neoforge-1.21.9/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip b/versions/neoforge-1.21.9/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip new file mode 100644 index 00000000..75bc5a60 Binary files /dev/null and b/versions/neoforge-1.21.9/tests/shaders/shaderpacks/ComplementaryReimagined_r5.8.1.zip differ diff --git a/versions/neoforge-26.1/gradle.properties b/versions/neoforge-26.1/gradle.properties new file mode 100644 index 00000000..49015ea4 --- /dev/null +++ b/versions/neoforge-26.1/gradle.properties @@ -0,0 +1,30 @@ +# Versioned Properties +# Tip: You can set any dependency value to "[UPDATE]" +# and reload Gradle to update only it's value. + +# NeoForge Properties, check https://neoforged.net/ +build.neoforge=26.1.2.93 + +# Additional Dependencies Properties +# cloth-config, check https://modrinth.com/mod/cloth-config/versions?g=26.1&l=neoforge +dep.cloth-config=26.1.154+neoforge +# flashback, check https://modrinth.com/mod/flashback/versions?g=26.1&l=neoforge +dep.flashback=unknown +# proxlib, check https://modrinth.com/mod/proxlib/versions?g=26.1&l=neoforge +dep.proxlib=unknown +# iris, check https://modrinth.com/mod/iris/versions?g=26.1&l=neoforge +dep.iris=1.11.2+26.1-neoforge +# controlling, check https://modrinth.com/mod/controlling/versions?g=26.1&l=neoforge +dep.controlling=26.1.0.1 +# searchables, check https://modrinth.com/mod/searchables/versions?g=26.1&l=neoforge +dep.searchables=eACQm81u +# modmenu, check https://modrinth.com/mod/modmenu/versions?g=26.1&l=neoforge +dep.modmenu=unknown +# yacl, check https://modrinth.com/mod/yacl/versions?g=26.1&l=neoforge +dep.yacl=3.9.6+26.1-neoforge +# sodium, check https://modrinth.com/mod/sodium/versions?g=26.1&l=neoforge +dep.sodium=mc26.1.1-0.8.9-neoforge +# replaymod, check https://modrinth.com/mod/replaymod/versions?g=26.1&l=neoforge +dep.replaymod=unknown +# geckolib, check https://modrinth.com/mod/geckolib/versions?g=26.1&l=neoforge +dep.geckolib=ScUAwGRA