├── .gitattributes ├── .github ├── dependabot.yml └── workflows │ ├── build.yml │ └── main.yml ├── .gitignore ├── .idea ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── copyright │ ├── GitHub_VidTu_Ksyxis.xml │ └── profiles_settings.xml ├── dictionaries │ └── project.xml ├── encodings.xml ├── icon.png ├── inspectionProfiles │ ├── GitHub_VidTu_Ksyxis.xml │ └── profiles_settings.xml ├── modules.xml └── modules │ └── Ksyxis.main.iml ├── LICENSE ├── README.md ├── SECURITY.md ├── build.gradle.kts ├── gradle.properties ├── gradle ├── gradle-daemon-jvm.properties ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── ksyxis.png ├── loaders ├── NOTICE ├── build.gradle.kts └── src │ └── main │ └── java │ ├── net │ ├── fabricmc │ │ └── api │ │ │ ├── ModInitializer.java │ │ │ └── package-info.java │ ├── minecraftforge │ │ └── fml │ │ │ ├── common │ │ │ ├── Mod.java │ │ │ └── package-info.java │ │ │ └── relauncher │ │ │ ├── IFMLLoadingPlugin.java │ │ │ └── package-info.java │ └── neoforged │ │ └── fml │ │ └── common │ │ ├── Mod.java │ │ └── package-info.java │ └── org │ └── quiltmc │ ├── loader │ └── api │ │ ├── ModContainer.java │ │ └── package-info.java │ └── qsl │ └── base │ └── api │ └── entrypoint │ ├── ModInitializer.java │ └── package-info.java ├── renovate.json ├── settings.gradle.kts ├── src └── main │ ├── java │ └── ru │ │ └── vidtu │ │ └── ksyxis │ │ ├── KPlugin.java │ │ ├── Ksyxis.java │ │ ├── mixins │ │ ├── LevelMixin.java │ │ ├── MinecraftServerMixin.java │ │ ├── ServerLevelMixin.java │ │ └── package-info.java │ │ ├── package-info.java │ │ └── platform │ │ ├── KCore.java │ │ ├── KFabric.java │ │ ├── KForge.java │ │ ├── KNeoForge.java │ │ ├── KQuilt.java │ │ └── package-info.java │ └── resources │ ├── META-INF │ ├── mods.toml │ └── neoforge.mods.toml │ ├── assets │ └── ksyxis │ │ └── lang │ │ ├── en_US.lang │ │ ├── en_us.json │ │ ├── ru_RU.lang │ │ └── ru_ru.json │ ├── fabric.mod.json │ ├── ksyxis.mixins.json │ ├── ksyxis.png │ ├── ksyxis_240.png │ ├── ksyxis_64.png │ ├── ksyxis_background.png │ ├── mcmod.info │ ├── pack.mcmeta │ └── quilt.mod.json ├── updater_ksyxis_ancient_forge.json ├── updater_ksyxis_forge.json ├── updater_ksyxis_legacy_forge.json └── updater_ksyxis_neoforge.json /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | *.bat text eol=crlf 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # 3 | # Copyright (c) 2021-2025 VidTu 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | # 23 | # SPDX-License-Identifier: MIT 24 | 25 | version: 2 26 | updates: 27 | - package-ecosystem: github-actions 28 | directory: '/' 29 | schedule: 30 | interval: daily 31 | - package-ecosystem: gradle 32 | directory: '/' 33 | schedule: 34 | interval: daily 35 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # 3 | # Copyright (c) 2021-2025 VidTu 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | # 23 | # SPDX-License-Identifier: MIT 24 | 25 | name: 'Build' 26 | permissions: {} 27 | on: 28 | push: 29 | branches: [ '!main' ] 30 | pull_request: 31 | workflow_dispatch: 32 | jobs: 33 | build: 34 | name: 'Build' 35 | runs-on: 'ubuntu-24.04' 36 | timeout-minutes: 15 37 | permissions: 38 | contents: 'read' 39 | steps: 40 | - name: 'Checkout' 41 | timeout-minutes: 1 42 | uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # v4.2.2 43 | with: 44 | persist-credentials: false 45 | - name: 'Setup JDK' 46 | timeout-minutes: 1 47 | uses: 'actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00' # v4.7.1 48 | with: 49 | java-version: 17 50 | distribution: 'temurin' 51 | - name: 'Setup Gradle' 52 | timeout-minutes: 5 53 | uses: 'gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326' # v4.4.0 54 | with: 55 | cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} 56 | dependency-graph: 'generate' 57 | - name: 'Build' 58 | timeout-minutes: 15 59 | run: './gradlew assemble' 60 | - name: 'Upload' 61 | timeout-minutes: 5 62 | uses: 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' # v4.6.2 63 | with: 64 | name: 'Artifacts' 65 | path: 'build/libs' 66 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # 3 | # Copyright (c) 2021-2025 VidTu 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | # 23 | # SPDX-License-Identifier: MIT 24 | 25 | name: 'Build (Main)' 26 | permissions: {} 27 | on: 28 | push: 29 | branches: [ 'main' ] 30 | jobs: 31 | build: 32 | name: 'Build (Main)' 33 | runs-on: 'ubuntu-24.04' 34 | timeout-minutes: 15 35 | permissions: 36 | contents: 'write' 37 | steps: 38 | - name: 'Checkout' 39 | timeout-minutes: 1 40 | uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # v4.2.2 41 | with: 42 | persist-credentials: false 43 | - name: 'Setup JDK' 44 | timeout-minutes: 1 45 | uses: 'actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00' # v4.7.1 46 | with: 47 | java-version: 17 48 | distribution: 'temurin' 49 | - name: 'Setup Gradle' 50 | timeout-minutes: 5 51 | uses: 'gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326' # v4.4.0 52 | with: 53 | cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} 54 | dependency-graph: 'generate-and-submit' 55 | - name: 'Build' 56 | timeout-minutes: 15 57 | run: './gradlew assemble' 58 | - name: 'Upload' 59 | timeout-minutes: 5 60 | uses: 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' # v4.6.2 61 | with: 62 | name: 'Artifacts' 63 | path: 'build/libs' 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle/ 2 | .idea/** 3 | build/ 4 | out/ 5 | run/ 6 | !/.idea/codeStyles 7 | !/.idea/codeStyles/** 8 | !/.idea/copyright 9 | !/.idea/copyright/** 10 | !/.idea/dictionaries 11 | !/.idea/dictionaries/** 12 | !/.idea/inspectionProfiles 13 | !/.idea/inspectionProfiles/** 14 | !/.idea/modules 15 | !/.idea/modules/** 16 | !/.idea/icon.png 17 | !/.idea/encodings.xml 18 | !/.idea/modules.xml 19 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/copyright/GitHub_VidTu_Ksyxis.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/dictionaries/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | aarch 5 | alnum 6 | appname 7 | bdwnwhiu 8 | cdpath 9 | cnfe 10 | configureondemand 11 | coremod 12 | curseforge 13 | dists 14 | dorg 15 | embeddedt 16 | endlocal 17 | entrypoints 18 | errorlevel 19 | fabricmc 20 | foojay 21 | gamerule 22 | javacmd 23 | jnfclwgd 24 | jvmargs 25 | ksyxis 26 | lnet 27 | mcmod 28 | modernfix 29 | modid 30 | modmenu 31 | modrinth 32 | mojang 33 | neoforge 34 | ornithe 35 | porkchop 36 | readarray 37 | setlocal 38 | shellness 39 | tinyfd 40 | ulimit 41 | vidtu 42 | wcdfzsgy 43 | спавне 44 | чанки 45 | 46 | 47 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/.idea/icon.png -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/modules/Ksyxis.main.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | MIXIN 26 | 27 | 1 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2025 VidTu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | SPDX-License-Identifier: MIT 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ksyxis 2 | 3 | Speed up your world loading by removing spawn chunks. 4 | 5 | ## Downloads 6 | 7 | - [Modrinth](https://modrinth.com/mod/ksyxis) 8 | - [CurseForge](https://www.curseforge.com/minecraft/mc-mods/ksyxis) 9 | - [GitHub Releases](https://github.com/VidTu/Ksyxis/releases) 10 | 11 | ## Dependencies 12 | 13 | This mod needs *Mixin* and nothing else. Usually, it's provided by your mod loader. 14 | 15 | - Fabric Loader, Quilt Loader, Forge, NeoForge, Legacy Fabric, or Ornithe 16 | - Minecraft (1.8 or newer) 17 | - **Forge 1.8-1.15.2 only**: Any Mixin provider, at your choice (such as 18 | [MixinBootstrap](https://modrinth.com/mod/mixinbootstrap), [MixinBooter](https://modrinth.com/mod/mixinbooter), 19 | [UniMixins](https://modrinth.com/mod/unimixins), or any other) 20 | 21 | Fabric API is **NOT** required. 22 | 23 | ## About 24 | 25 | Minecraft has a concept of [spawn chunks](https://minecraft.wiki/w/Spawn_chunk). These chunks are located at the 26 | world creation point (where you have been spawned for the first time) and are always loaded. Depending on the version, 27 | there are either 441 or 25 spawn chunks always loaded while you're playing. Most players, however, don't need 28 | these chunks as they venture far away from spawn and come back only occasionally. To these players, the creation 29 | and loading of spawn chunks is a waste of time and performance. This mod completely disables spawn chunks in the game. 30 | 31 | *Note*: Spawn chunks are sometimes used by farms and technical contraptions. If you'll need them, 32 | you can always delete the mod later to re-enable the spawn chunks. 33 | 34 | https://github.com/user-attachments/assets/42e65893-6324-46b1-89a4-044eae77802d 35 | 36 | ## FAQ 37 | 38 | **Q**: I need help, have some questions, or have some other feedback. 39 | **A**: You can join the [Discord server](https://discord.gg/Q6saSVSuYQ). 40 | 41 | **Q**: Where can I download this mod? 42 | **A**: [Modrinth](https://modrinth.com/mod/ksyxis), 43 | [CurseForge](https://www.curseforge.com/minecraft/mc-mods/ksyxis), 44 | or [GitHub Releases](https://github.com/VidTu/Ksyxis/releases). 45 | You can also find unstable builds at [GitHub Actions](https://github.com/VidTu/Ksyxis/actions). 46 | You will need a GitHub account to download these. 47 | 48 | **Q**: This mod doesn't speed up anything. 49 | **A**: The effect may not be noticeable on high-end PCs. This mod is designed primarily for low-end devices. 50 | Nevertheless, there is [a video](https://www.youtube.com/watch?v=PXWdDoVU1C4). 51 | 52 | **Q**: Which mod loaders are supported? 53 | **A**: Forge, Fabric, Quilt, NeoForge, Legacy Fabric, and Ornithe (for both Fabric and Quilt). 54 | 55 | **Q**: Which Minecraft versions are supported? 56 | **A**: Minecraft 1.8 or newer. 57 | 58 | **Q**: Where are the Forge, Fabric, Quilt, NeoForge, etc. versions? 59 | **A**: All in the same file. 60 | 61 | **Q**: Do I need Fabric API or Quilt Standard Libraries? 62 | **A**: No, but you can install these for other mods. 63 | 64 | **Q**: Is this mod open source? 65 | **A**: [Yes.](https://github.com/VidTu/Ksyxis) (Licensed 66 | under [MIT License](https://github.com/VidTu/Ksyxis/blob/main/LICENSE)) 67 | 68 | **Q**: Is this mod stable for use? 69 | **A**: It should be. No guarantee, though. At least it should not break your worlds. 70 | You can always uninstall the mod and load worlds without Ksyxis. 71 | 72 | **Q**: Is this mod client-side or server-side? 73 | **A**: This mod works on the logical server side. That is, it does have an effect in singleplayer and 74 | on a dedicated (standalone) server. It has no effect on the client when playing in multiplayer. 75 | You can install it into your client or your server without any requirements for it to be installed on the other side. 76 | 77 | **Q**: How to force-load chunks if the spawn chunks have been removed? 78 | **A**: If you really need to force-load chunks, load individual chunks with the `/forceload` 79 | command in 1.13 or newer. For older versions, you can search for some mod that force-loads chunks. 80 | 81 | **Q**: I've found a bug. 82 | **A**: Report it [here](https://github.com/VidTu/Ksyxis/issues). If you are not sure whether this is a bug or a 83 | simple question, you can join the [Discord](https://discord.gg/Q6saSVSuYQ). 84 | Report security vulnerabilities [here](https://github.com/VidTu/Ksyxis/security). 85 | 86 | **Q**: Can I use this in my modpack? 87 | **A**: Sure. Credit (e.g., a link to the mod's GitHub page) is appreciated but is not required. 88 | Monetization and redistribution are allowed as per the [MIT License](https://github.com/VidTu/Ksyxis/blob/main/LICENSE). 89 | 90 | **Q**: It says *Ksyxis: No Mixin found*. 91 | **A**: If you're using Forge 1.15.2 or older, you may need to install 92 | [MixinBootstrap](https://modrinth.com/mod/mixinbootstrap), [MixinBooter](https://modrinth.com/mod/mixinbooter), 93 | [UniMixins](https://modrinth.com/mod/unimixins), or any other Mixin provider of your choice. If you're using Forge 1.16 94 | or newer, or any version of Fabric/Quilt/NeoForge/Ornithe, you don't need to install anything, and this is a bug. 95 | 96 | ## License 97 | 98 | This project is provided under the MIT License. 99 | Check out [LICENSE](https://github.com/VidTu/Ksyxis/blob/main/LICENSE) for more information. 100 | 101 | ## Development 102 | 103 | ### Building (Compiling) 104 | 105 | To compile the mod from the source code: 106 | 107 | 1. Have 1 GB of free RAM, 1 GB of free disk space, and an active internet connection. 108 | 2. Install Java 8 and dump it into PATH and/or JAVA_HOME. 109 | 3. Run `./gradlew assemble` from the terminal/PowerShell. 110 | 4. Grab the JAR from the `./build/libs/` folder. 111 | 112 | ### Developing/Debugging 113 | 114 | Due to its multiplatform/multiversion nature and general code simplicity, 115 | Ksyxis doesn't currently offer a comprehensive development environment. 116 | 117 | The recommended IDE for development is IntelliJ IDEA (Community or Ultimate) with the Minecraft Development plugin. 118 | This is not a strict requirement, however. Any IDE/editor should work just fine. 119 | 120 | ### Reproducible Builds 121 | 122 | Ksyxis attempts to have reproducible builds (reproducible JAR archives) for its releases. Check out 123 | [GitHub Releases](https://github.com/VidTu/Ksyxis/releases) for "Reproducible Build Hash" values. If it is present 124 | on any release, this release's binary JAR should be reproducible. Unfortunately, due to the nature of Java 125 | (Gradle) and Minecraft development, it is not always possible to have reproducible builds. 126 | Reproducible release JARs are compiled with: (use these commands to create a reproducible build) 127 | 128 | ```bash 129 | ./gradlew clean --no-daemon --no-build-cache --no-configuration-cache 130 | ./gradlew assemble --no-daemon --no-build-cache --no-configuration-cache 131 | ``` 132 | 133 | Currently, no dependency (integrity) validation is performed. This might change in a future version. 134 | 135 | #### Notice 136 | 137 | This mod is **NOT** how mods *should be written*. This was (and is, currently) an experiment to create a simple 138 | and portable mod with as much supported versions as possible. Its compatibility issues are probably unfixable, though 139 | the world loading speedup is real. Nevertheless, it's an interesting concept and it works. For the curious ones, 140 | the source code is very documented. 141 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | The only supported versions are: 4 | 5 | - The latest release published to CurseForge, Modrinth, and/or GitHub. 6 | - The latest pre-release published to CurseForge, Modrinth, and/or GitHub. 7 | (Only if it is newer than the latest published release) 8 | - The latest Git commit build. 9 | 10 | # Reporting 11 | 12 | If you think the issue you want to report can be considered a "security vulnerability" and should not be disclosed 13 | publicly, **report it via the "Security" tab on GitHub**. Please note that this modification is developed free of charge 14 | in my free time, so please give me a bit to respond. If you *can't or don't want to use the GitHub Security tab*, 15 | __please contact me using one or more of the following methods__: 16 | 17 | - Mail: [pig@vidtu.ru](mailto:pig@vidtu.ru) 18 | - Alt Mail: [imvidtu@proton.me](mailto:imvidtu@proton.me) 19 | - Discord: [vidtu](https://discord.com/users/339357082602176513) (Snowflake ID: `339357082602176513`) 20 | - Telegram: [@ImVidTu](https://t.me/ImVidTu) (ID: `1067034567`) 21 | 22 | Additional contact information may be found at [vidtu.ru](https://vidtu.ru). 23 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | import com.google.gson.Gson 28 | import com.google.gson.JsonElement 29 | 30 | plugins { 31 | id("java") 32 | } 33 | 34 | java.sourceCompatibility = JavaVersion.VERSION_1_8 35 | java.targetCompatibility = JavaVersion.VERSION_1_8 36 | java.toolchain.languageVersion = JavaLanguageVersion.of(8) 37 | 38 | group = "ru.vidtu.ksyxis" 39 | base.archivesName = "Ksyxis" 40 | description = "Speed up the loading of your world." 41 | 42 | // Add GSON to buildscript classpath, we use it for minifying JSON files. 43 | buildscript { 44 | dependencies { 45 | classpath(libs.gson) 46 | } 47 | } 48 | 49 | repositories { 50 | mavenCentral() 51 | maven("https://repo.spongepowered.org/repository/maven-public/") // Mixin. 52 | } 53 | 54 | dependencies { 55 | // Annotations. 56 | compileOnly(libs.jspecify) 57 | compileOnly(libs.jetbrains.annotations) 58 | 59 | // Minecraft. 60 | compileOnly(project(":loaders")) 61 | compileOnly(libs.mixin) 62 | compileOnly(libs.asm) // Required for Mixin. 63 | compileOnly(libs.log4j) // Not SLF4J for compatibility with pre-1.18. 64 | } 65 | 66 | // Compile with UTF-8, Java 8, and with all debug options. 67 | tasks.withType { 68 | options.encoding = "UTF-8" 69 | options.compilerArgs.addAll(listOf("-g", "-parameters")) 70 | // JDK 8 (used by this buildscript) doesn't support the "-release" flag 71 | // (at the top of the file), so we must NOT specify it or the "javac" will fail. 72 | // If we ever gonna compile on newer Java versions, uncomment this line. 73 | // options.release = 8 74 | } 75 | 76 | tasks.withType { 77 | // Expand version. 78 | inputs.property("version", version) 79 | filesMatching(listOf("fabric.mod.json", "quilt.mod.json", "META-INF/mods.toml", "META-INF/neoforge.mods.toml", "mcmod.info")) { 80 | expand(inputs.properties) 81 | } 82 | 83 | // Minify JSON (including ".mcmeta" and ".info") and TOML files. 84 | var files = fileTree(outputs.files.asPath) 85 | doLast { 86 | val jsonAlike = Regex("^.*\\.(?:json|mcmeta|info)$", RegexOption.IGNORE_CASE) 87 | files.forEach { 88 | if (it.name.matches(jsonAlike)) { 89 | it.writeText(Gson().fromJson(it.readText(), JsonElement::class.java).toString()) 90 | } else if (it.name.endsWith(".toml", ignoreCase = true)) { 91 | it.writeText(it.readLines() 92 | .filter { s -> s.isNotBlank() } 93 | .joinToString("\n") 94 | .replace(" = ", "=")) 95 | } 96 | } 97 | } 98 | } 99 | 100 | // Reproducible builds. 101 | tasks.withType { 102 | isPreserveFileTimestamps = false 103 | isReproducibleFileOrder = true 104 | } 105 | 106 | // Add LICENSE and manifest into the JAR file. 107 | // Manifest also controls Mixin/mod loading on some loaders/versions. 108 | tasks.withType { 109 | from("LICENSE") 110 | manifest { 111 | attributes( 112 | "Specification-Title" to "Ksyxis", 113 | "Specification-Version" to version, 114 | "Specification-Vendor" to "VidTu", 115 | "Implementation-Title" to "Ksyxis", 116 | "Implementation-Version" to version, 117 | "Implementation-Vendor" to "VidTu", 118 | "FMLCorePlugin" to "ru.vidtu.ksyxis.platform.KCore", 119 | "FMLCorePluginContainsFMLMod" to "true", 120 | "ForceLoadAsMod" to "true", 121 | "MixinConfigs" to "ksyxis.mixins.json" 122 | ) 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # 3 | # Copyright (c) 2021-2025 VidTu 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | # 23 | # SPDX-License-Identifier: MIT 24 | 25 | # Gradle 26 | org.gradle.jvmargs=-Xmx1G 27 | org.gradle.parallel=true 28 | org.gradle.caching=true 29 | org.gradle.configuration-cache=true 30 | org.gradle.configuration-cache.parallel=true 31 | org.gradle.configureondemand=true 32 | 33 | # Mod 34 | version=1.3.4-SNAPSHOT 35 | -------------------------------------------------------------------------------- /gradle/gradle-daemon-jvm.properties: -------------------------------------------------------------------------------- 1 | #This file is generated by updateDaemonJvm 2 | toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/65aaef917b9f394804f058f1861225c9/redirect 3 | toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/c728c5388b044fbdbbc44b0c6acee0df/redirect 4 | toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/65aaef917b9f394804f058f1861225c9/redirect 5 | toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/c728c5388b044fbdbbc44b0c6acee0df/redirect 6 | toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/dc463b4a8183dbcaa1b32544189c7f03/redirect 7 | toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/cb7dc109dd590ebca2d703734d23c9d3/redirect 8 | toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/65aaef917b9f394804f058f1861225c9/redirect 9 | toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/c728c5388b044fbdbbc44b0c6acee0df/redirect 10 | toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/43ee83889b87bacad5d3071ae7bbd349/redirect 11 | toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/2d57bdd1e17a18f83ff073919daa35ba/redirect 12 | toolchainVersion=17 13 | -------------------------------------------------------------------------------- /gradle/libs.versions.toml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # 3 | # Copyright (c) 2021-2025 VidTu 4 | # 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | # 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | # 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | # 23 | # SPDX-License-Identifier: MIT 24 | 25 | [versions] 26 | asm = "9.8" 27 | gson = "2.13.1" 28 | jetbrains-annotations = "26.0.2" 29 | jspecify = "1.0.0" 30 | log4j = "2.24.3" 31 | mixin = "0.8.7" 32 | 33 | [libraries] 34 | asm = { module = "org.ow2.asm:asm-tree", version.ref = "asm" } 35 | gson = { module = "com.google.code.gson:gson", version.ref = "gson" } 36 | jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" } 37 | jspecify = { module = "org.jspecify:jspecify", version.ref = "jspecify" } 38 | log4j = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } 39 | mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" } 40 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionSha256Sum=7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | # SPDX-License-Identifier: Apache-2.0 19 | # 20 | 21 | ############################################################################## 22 | # 23 | # Gradle start up script for POSIX generated by Gradle. 24 | # 25 | # Important for running: 26 | # 27 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 28 | # noncompliant, but you have some other compliant shell such as ksh or 29 | # bash, then to run this script, type that shell name before the whole 30 | # command line, like: 31 | # 32 | # ksh Gradle 33 | # 34 | # Busybox and similar reduced shells will NOT work, because this script 35 | # requires all of these POSIX shell features: 36 | # * functions; 37 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 38 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 39 | # * compound commands having a testable exit status, especially «case»; 40 | # * various built-in commands including «command», «set», and «ulimit». 41 | # 42 | # Important for patching: 43 | # 44 | # (2) This script targets any POSIX shell, so it avoids extensions provided 45 | # by Bash, Ksh, etc; in particular arrays are avoided. 46 | # 47 | # The "traditional" practice of packing multiple parameters into a 48 | # space-separated string is a well documented source of bugs and security 49 | # problems, so this is (mostly) avoided, by progressively accumulating 50 | # options in "$@", and eventually passing that to Java. 51 | # 52 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 53 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 54 | # see the in-line comments for details. 55 | # 56 | # There are tweaks for specific operating systems such as AIX, CygWin, 57 | # Darwin, MinGW, and NonStop. 58 | # 59 | # (3) This script is generated from the Groovy template 60 | # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 61 | # within the Gradle project. 62 | # 63 | # You can find Gradle at https://github.com/gradle/gradle/. 64 | # 65 | ############################################################################## 66 | 67 | # Attempt to set APP_HOME 68 | 69 | # Resolve links: $0 may be a link 70 | app_path=$0 71 | 72 | # Need this for daisy-chained symlinks. 73 | while 74 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 75 | [ -h "$app_path" ] 76 | do 77 | ls=$( ls -ld "$app_path" ) 78 | link=${ls#*' -> '} 79 | case $link in #( 80 | /*) app_path=$link ;; #( 81 | *) app_path=$APP_HOME$link ;; 82 | esac 83 | done 84 | 85 | # This is normally unused 86 | # shellcheck disable=SC2034 87 | APP_BASE_NAME=${0##*/} 88 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 89 | APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit 90 | 91 | # Use the maximum available, or set MAX_FD != -1 to use that value. 92 | MAX_FD=maximum 93 | 94 | warn () { 95 | echo "$*" 96 | } >&2 97 | 98 | die () { 99 | echo 100 | echo "$*" 101 | echo 102 | exit 1 103 | } >&2 104 | 105 | # OS specific support (must be 'true' or 'false'). 106 | cygwin=false 107 | msys=false 108 | darwin=false 109 | nonstop=false 110 | case "$( uname )" in #( 111 | CYGWIN* ) cygwin=true ;; #( 112 | Darwin* ) darwin=true ;; #( 113 | MSYS* | MINGW* ) msys=true ;; #( 114 | NONSTOP* ) nonstop=true ;; 115 | esac 116 | 117 | CLASSPATH="\\\"\\\"" 118 | 119 | 120 | # Determine the Java command to use to start the JVM. 121 | if [ -n "$JAVA_HOME" ] ; then 122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 123 | # IBM's JDK on AIX uses strange locations for the executables 124 | JAVACMD=$JAVA_HOME/jre/sh/java 125 | else 126 | JAVACMD=$JAVA_HOME/bin/java 127 | fi 128 | if [ ! -x "$JAVACMD" ] ; then 129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 130 | 131 | Please set the JAVA_HOME variable in your environment to match the 132 | location of your Java installation." 133 | fi 134 | else 135 | JAVACMD=java 136 | if ! command -v java >/dev/null 2>&1 137 | then 138 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 139 | 140 | Please set the JAVA_HOME variable in your environment to match the 141 | location of your Java installation." 142 | fi 143 | fi 144 | 145 | # Increase the maximum file descriptors if we can. 146 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 147 | case $MAX_FD in #( 148 | max*) 149 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 150 | # shellcheck disable=SC2039,SC3045 151 | MAX_FD=$( ulimit -H -n ) || 152 | warn "Could not query maximum file descriptor limit" 153 | esac 154 | case $MAX_FD in #( 155 | '' | soft) :;; #( 156 | *) 157 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 158 | # shellcheck disable=SC2039,SC3045 159 | ulimit -n "$MAX_FD" || 160 | warn "Could not set maximum file descriptor limit to $MAX_FD" 161 | esac 162 | fi 163 | 164 | # Collect all arguments for the java command, stacking in reverse order: 165 | # * args from the command line 166 | # * the main class name 167 | # * -classpath 168 | # * -D...appname settings 169 | # * --module-path (only if needed) 170 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 171 | 172 | # For Cygwin or MSYS, switch paths to Windows format before running java 173 | if "$cygwin" || "$msys" ; then 174 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 175 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 176 | 177 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 178 | 179 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 180 | for arg do 181 | if 182 | case $arg in #( 183 | -*) false ;; # don't mess with options #( 184 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 185 | [ -e "$t" ] ;; #( 186 | *) false ;; 187 | esac 188 | then 189 | arg=$( cygpath --path --ignore --mixed "$arg" ) 190 | fi 191 | # Roll the args list around exactly as many times as the number of 192 | # args, so each arg winds up back in the position where it started, but 193 | # possibly modified. 194 | # 195 | # NB: a `for` loop captures its iteration list before it begins, so 196 | # changing the positional parameters here affects neither the number of 197 | # iterations, nor the values presented in `arg`. 198 | shift # remove old arg 199 | set -- "$@" "$arg" # push replacement arg 200 | done 201 | fi 202 | 203 | 204 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 205 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 206 | 207 | # Collect all arguments for the java command: 208 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 209 | # and any embedded shellness will be escaped. 210 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 211 | # treated as '${Hostname}' itself on the command line. 212 | 213 | set -- \ 214 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 215 | -classpath "$CLASSPATH" \ 216 | -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ 217 | "$@" 218 | 219 | # Stop when "xargs" is not available. 220 | if ! command -v xargs >/dev/null 2>&1 221 | then 222 | die "xargs is not available" 223 | fi 224 | 225 | # Use "xargs" to parse quoted args. 226 | # 227 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 228 | # 229 | # In Bash we could simply go: 230 | # 231 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 232 | # set -- "${ARGS[@]}" "$@" 233 | # 234 | # but POSIX shell has neither arrays nor command substitution, so instead we 235 | # post-process each arg (as a line of input to sed) to backslash-escape any 236 | # character that might be a shell metacharacter, then use eval to reverse 237 | # that process (while maintaining the separation between arguments), and wrap 238 | # the whole thing up as a single "set" statement. 239 | # 240 | # This will of course break if any of these variables contains a newline or 241 | # an unmatched quote. 242 | # 243 | 244 | eval "set -- $( 245 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 246 | xargs -n1 | 247 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 248 | tr '\n' ' ' 249 | )" '"$@"' 250 | 251 | exec "$JAVACMD" "$@" 252 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | @rem SPDX-License-Identifier: Apache-2.0 17 | @rem 18 | 19 | @if "%DEBUG%"=="" @echo off 20 | @rem ########################################################################## 21 | @rem 22 | @rem Gradle startup script for Windows 23 | @rem 24 | @rem ########################################################################## 25 | 26 | @rem Set local scope for the variables with windows NT shell 27 | if "%OS%"=="Windows_NT" setlocal 28 | 29 | set DIRNAME=%~dp0 30 | if "%DIRNAME%"=="" set DIRNAME=. 31 | @rem This is normally unused 32 | set APP_BASE_NAME=%~n0 33 | set APP_HOME=%DIRNAME% 34 | 35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 | 38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 | 41 | @rem Find java.exe 42 | if defined JAVA_HOME goto findJavaFromJavaHome 43 | 44 | set JAVA_EXE=java.exe 45 | %JAVA_EXE% -version >NUL 2>&1 46 | if %ERRORLEVEL% equ 0 goto execute 47 | 48 | echo. 1>&2 49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 | echo. 1>&2 51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 | echo location of your Java installation. 1>&2 53 | 54 | goto fail 55 | 56 | :findJavaFromJavaHome 57 | set JAVA_HOME=%JAVA_HOME:"=% 58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 | 60 | if exist "%JAVA_EXE%" goto execute 61 | 62 | echo. 1>&2 63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 | echo. 1>&2 65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 | echo location of your Java installation. 1>&2 67 | 68 | goto fail 69 | 70 | :execute 71 | @rem Setup the command line 72 | 73 | set CLASSPATH= 74 | 75 | 76 | @rem Execute Gradle 77 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* 78 | 79 | :end 80 | @rem End local scope for the variables with windows NT shell 81 | if %ERRORLEVEL% equ 0 goto mainEnd 82 | 83 | :fail 84 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 85 | rem the _cmd.exe /c_ return code! 86 | set EXIT_CODE=%ERRORLEVEL% 87 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 88 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 89 | exit /b %EXIT_CODE% 90 | 91 | :mainEnd 92 | if "%OS%"=="Windows_NT" endlocal 93 | 94 | :omega 95 | -------------------------------------------------------------------------------- /ksyxis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/ksyxis.png -------------------------------------------------------------------------------- /loaders/NOTICE: -------------------------------------------------------------------------------- 1 | Source files in this folder/module are provided under their own separate licenses, 2 | NOT the MIT license. See source files' headers for more. These source 3 | files are not included in the final JAR, they are stubs for compilation. 4 | The author of this repository is not a lawyer and this is not legal advice. 5 | -------------------------------------------------------------------------------- /loaders/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | plugins { 28 | id("java") 29 | } 30 | 31 | java.sourceCompatibility = JavaVersion.VERSION_1_8 32 | java.targetCompatibility = JavaVersion.VERSION_1_8 33 | java.toolchain.languageVersion = JavaLanguageVersion.of(8) 34 | 35 | group = "ru.vidtu.ksyxis.loaders" 36 | base.archivesName = "Ksyxis-Loaders" 37 | description = "Module with stubs of loaders' classes for Ksyxis." 38 | 39 | tasks.withType { 40 | options.encoding = "UTF-8" 41 | options.compilerArgs.addAll(listOf("-g", "-parameters")) 42 | } 43 | 44 | tasks.withType { 45 | isPreserveFileTimestamps = false 46 | isReproducibleFileOrder = true 47 | } 48 | 49 | tasks.withType { 50 | manifest { 51 | attributes( 52 | "Specification-Title" to "Ksyxis", 53 | "Specification-Version" to version, 54 | "Specification-Vendor" to "VidTu", 55 | "Implementation-Title" to "Ksyxis-Loaders", 56 | "Implementation-Version" to version, 57 | "Implementation-Vendor" to "VidTu, FabricMC, MinecraftForge, NeoForged, QuiltMC" 58 | ) 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/fabricmc/api/ModInitializer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 FabricMC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package net.fabricmc.api; 18 | 19 | /** 20 | * Stub entrypoint interface of the Fabric mod. This is an injection interface for Ksyxis for Fabric, 21 | * see {@code KFabric} class. 22 | * 23 | * @author VidTu 24 | * @author FabricMC 25 | */ 26 | public interface ModInitializer { 27 | /** 28 | * Runs the entrypoint. This is an injection point for Ksyxis for Fabric, see {@code KFabric} class. 29 | */ 30 | void onInitialize(); 31 | } 32 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/fabricmc/api/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 FabricMC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | /** 18 | * Dummy Fabric mod package. 19 | * 20 | * @author VidTu 21 | * @author FabricMC 22 | * @see net.fabricmc.api.ModInitializer 23 | */ 24 | package net.fabricmc.api; 25 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/minecraftforge/fml/common/Mod.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Forge Development LLC and contributors 3 | * SPDX-License-Identifier: LGPL-2.1-only 4 | */ 5 | 6 | package net.minecraftforge.fml.common; 7 | 8 | import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; 9 | 10 | import java.lang.annotation.ElementType; 11 | import java.lang.annotation.Retention; 12 | import java.lang.annotation.RetentionPolicy; 13 | import java.lang.annotation.Target; 14 | 15 | /** 16 | * Stub annotation of the Forge mod for Ksyxis hacky compat. This is an injection annotation for Ksyxis on Forge 1.13+ 17 | * and NeoForge 1.20.1, see {@code KForge} class. This is a declarative annotation (for the mod to be listed) for 18 | * Ksyxis on Forge 1.8 -> 1.12.2, injection performed in {@link IFMLLoadingPlugin}. 19 | * 20 | * @author VidTu 21 | * @author MinecraftForge 22 | * @see IFMLLoadingPlugin 23 | * @see net.neoforged.fml.common.Mod 24 | */ 25 | @Retention(RetentionPolicy.RUNTIME) 26 | @Target(ElementType.TYPE) 27 | public @interface Mod { 28 | // Java annotations will simply ignore unneeded things. 29 | 30 | /** 31 | * Gets the mod ID for the modern (1.13+) Forge and older NeoForge (1.20.1). 32 | * 33 | * @return Modern mod ID, "{@code ksyxis}" by Ksyxis 34 | */ 35 | String value(); 36 | 37 | /** 38 | * Gets the mod ID for the legacy (1.12) Forge. 39 | * 40 | * @return Legacy mod ID, "{@code ksyxis}" by Ksyxis 41 | */ 42 | String modid(); 43 | 44 | /** 45 | * Gets the legacy remote version acceptance range. (client <-> server check). This is set to lift the 46 | * requirements for installation on a client when running on the server. 47 | * 48 | * @return Legacy remote version acceptance range, "{@code *}" by Ksyxis 49 | */ 50 | String acceptableRemoteVersions(); 51 | } 52 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/minecraftforge/fml/common/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Forge Development LLC and contributors 3 | * SPDX-License-Identifier: LGPL-2.1-only 4 | */ 5 | 6 | /** 7 | * Dummy Forge mod package. 8 | * 9 | * @author VidTu 10 | * @author MinecraftForge 11 | * @see net.minecraftforge.fml.common.Mod 12 | */ 13 | package net.minecraftforge.fml.common; 14 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/minecraftforge/fml/relauncher/IFMLLoadingPlugin.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Forge Development LLC and contributors 3 | * SPDX-License-Identifier: LGPL-2.1-only 4 | */ 5 | 6 | package net.minecraftforge.fml.relauncher; 7 | 8 | import net.minecraftforge.fml.common.Mod; 9 | 10 | import java.util.Map; 11 | 12 | /** 13 | * Stub interface of the legacy (1.12) Forge coremod for Ksyxis hacky compat. This is an injection interface for 14 | * Ksyxis for Forge 1.8 -> 1.12.2, see {@code KCore} class. 15 | * 16 | * @author VidTu 17 | * @author MinecraftForge 18 | */ 19 | public interface IFMLLoadingPlugin { 20 | /** 21 | * Gets the access transformer class. This is a NO-OP method for Ksyxis, it always returns {@code null}. 22 | * 23 | * @return Access transformer class, {@code null} by Ksyxis 24 | */ 25 | String getAccessTransformerClass(); 26 | 27 | /** 28 | * Gets the ASM transformer classes. This is a NO-OP method for Ksyxis, it always returns {@code null}. 29 | * 30 | * @return Access transformer classes array, {@code null} by Ksyxis 31 | */ 32 | String[] getASMTransformerClass(); 33 | 34 | /** 35 | * Gets the virtual mod container class. This is a NO-OP method for Ksyxis, it always returns {@code null}. 36 | * 37 | * @return Virtual mod container class, {@code null} by Ksyxis 38 | */ 39 | String getModContainerClass(); 40 | 41 | /** 42 | * Gets the mod setting up class. This is a NO-OP method for Ksyxis, it always returns {@code null}. 43 | * 44 | * @return Mod setting up class, {@code null} by Ksyxis 45 | */ 46 | String getSetupClass(); 47 | 48 | /** 49 | * Injects the data. This is an injection point for Ksyxis for Forge 1.8 -> 1.12.2, see {@code KCore} 50 | * class. For the declaration point, see {@link Mod}. 51 | * 52 | * @param data Stub injection data, ignored by Ksyxis 53 | */ 54 | void injectData(Map data); 55 | } 56 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/minecraftforge/fml/relauncher/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Forge Development LLC and contributors 3 | * SPDX-License-Identifier: LGPL-2.1-only 4 | */ 5 | 6 | /** 7 | * Dummy LegacyForge coremod package. 8 | * 9 | * @author VidTu 10 | * @author MinecraftForge 11 | * @see net.minecraftforge.fml.relauncher.IFMLLoadingPlugin 12 | */ 13 | package net.minecraftforge.fml.relauncher; 14 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/neoforged/fml/common/Mod.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Forge Development LLC and contributors 3 | * SPDX-License-Identifier: LGPL-2.1-only 4 | */ 5 | 6 | package net.neoforged.fml.common; 7 | 8 | import java.lang.annotation.ElementType; 9 | import java.lang.annotation.Retention; 10 | import java.lang.annotation.RetentionPolicy; 11 | import java.lang.annotation.Target; 12 | 13 | /** 14 | * Emulated annotation of the NeoForge mod. This is an injection annotation for Ksyxis for NeoForge 1.20.2+, 15 | * see {@code KNeoForge} class. 16 | * 17 | * @author VidTu 18 | * @author MinecraftForge 19 | * @author NeoForged 20 | * @see net.minecraftforge.fml.common.Mod 21 | */ 22 | @Retention(RetentionPolicy.RUNTIME) 23 | @Target(ElementType.TYPE) 24 | public @interface Mod { 25 | /** 26 | * Gets the mod ID for NeoForge (1.20.2+). 27 | * 28 | * @return Modern mod ID, "{@code ksyxis}" by Ksyxis 29 | */ 30 | String value(); 31 | } 32 | -------------------------------------------------------------------------------- /loaders/src/main/java/net/neoforged/fml/common/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Forge Development LLC and contributors 3 | * SPDX-License-Identifier: LGPL-2.1-only 4 | */ 5 | 6 | /** 7 | * Dummy NeoForge mod annotation package. 8 | * 9 | * @author VidTu 10 | * @author MinecraftForge 11 | * @author NeoForged 12 | * @see net.neoforged.fml.common.Mod 13 | */ 14 | package net.neoforged.fml.common; 15 | -------------------------------------------------------------------------------- /loaders/src/main/java/org/quiltmc/loader/api/ModContainer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 FabricMC 3 | * Copyright 2022-2023 QuiltMC 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package org.quiltmc.loader.api; 19 | 20 | import org.quiltmc.qsl.base.api.entrypoint.ModInitializer; 21 | 22 | /** 23 | * Dummy QuiltMC mod container. This is a dummy interface for {@link ModInitializer}. 24 | * 25 | * @author VidTu 26 | * @author FabricMC 27 | * @author QuiltMC 28 | */ 29 | public interface ModContainer { 30 | // Ksyxis: Dummy class 31 | } 32 | -------------------------------------------------------------------------------- /loaders/src/main/java/org/quiltmc/loader/api/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 FabricMC 3 | * Copyright 2022-2023 QuiltMC 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | /** 19 | * Dummy QuiltMC mod container package. 20 | * 21 | * @author VidTu 22 | * @author FabricMC 23 | * @author QuiltMC 24 | * @see org.quiltmc.loader.api.ModContainer 25 | */ 26 | package org.quiltmc.loader.api; 27 | -------------------------------------------------------------------------------- /loaders/src/main/java/org/quiltmc/qsl/base/api/entrypoint/ModInitializer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 The Quilt Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.quiltmc.qsl.base.api.entrypoint; 18 | 19 | import org.quiltmc.loader.api.ModContainer; 20 | 21 | /** 22 | * Stub entrypoint interface of the Quilt mod. This is an injection interface for Ksyxis for Quilt, 23 | * see {@code KQuilt} class. 24 | * 25 | * @author VidTu 26 | * @author FabricMC 27 | * @author QuiltMC 28 | */ 29 | public interface ModInitializer { 30 | /** 31 | * Runs the entrypoint. This is an injection point for Ksyxis for Quilt, see {@code KQuilt} class. 32 | * 33 | * @param mod A stub mod container, ignored 34 | */ 35 | void onInitialize(ModContainer mod); 36 | } 37 | -------------------------------------------------------------------------------- /loaders/src/main/java/org/quiltmc/qsl/base/api/entrypoint/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 The Quilt Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | /** 18 | * Dummy QuiltMC mod initializer package. 19 | * 20 | * @author VidTu 21 | * @author FabricMC 22 | * @author QuiltMC 23 | * @see org.quiltmc.qsl.base.api.entrypoint.ModInitializer 24 | */ 25 | package org.quiltmc.qsl.base.api.entrypoint; 26 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | plugins { 28 | id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" 29 | } 30 | 31 | rootProject.name = "Ksyxis" 32 | include("loaders") 33 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/KPlugin.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis; 28 | 29 | import org.apache.logging.log4j.LogManager; 30 | import org.apache.logging.log4j.Logger; 31 | import org.jetbrains.annotations.ApiStatus; 32 | import org.jetbrains.annotations.CheckReturnValue; 33 | import org.jetbrains.annotations.Contract; 34 | import org.jspecify.annotations.NullMarked; 35 | import org.jspecify.annotations.Nullable; 36 | import org.objectweb.asm.tree.ClassNode; 37 | import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; 38 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 39 | import org.spongepowered.asm.service.IClassBytecodeProvider; 40 | import org.spongepowered.asm.service.MixinService; 41 | 42 | import java.util.List; 43 | import java.util.Set; 44 | 45 | /** 46 | * Mixin plugin that silences the console {@link ClassNotFoundException} errors from Ksyxis. 47 | * 48 | * @author VidTu 49 | * @apiNote Internal use only 50 | * @see Ksyxis 51 | */ 52 | @ApiStatus.Internal 53 | @NullMarked 54 | public final class KPlugin implements IMixinConfigPlugin { 55 | /** 56 | * Mixin plugin error message. Shown in {@link #shouldApplyMixin(String, String)} when an error occurs. 57 | * 58 | * @see #shouldApplyMixin(String, String) 59 | * @see Ksyxis#handleError(String, Throwable) 60 | */ 61 | private static final String PLUGIN_ERROR = "Ksyxis: Unable to apply the Ksyxis plugin. It`s probably a bug or " + 62 | "something, you should report it via GitHub. Ensure to include as much information (game version, loader " + 63 | "type, loader version, mod version, other mods, logs, etc.) in the bug report as possible, this error " + 64 | "screen is NOT enough. If you don`t want any hassles and just want to load the game without solving " + 65 | "anything, delete the Ksyxis mod. (provider: %s, plugin: %s, targetClassName: %s, mixinClassName: %s)"; 66 | 67 | /** 68 | * Logger for this class. 69 | */ 70 | private static final Logger LOGGER = LogManager.getLogger("Ksyxis/KPlugin"); 71 | 72 | /** 73 | * Current Mixin bytecode provider. 74 | */ 75 | private final IClassBytecodeProvider provider = MixinService.getService().getBytecodeProvider(); 76 | 77 | /** 78 | * Creates a new plugin. 79 | */ 80 | @Contract(pure = true) 81 | public KPlugin() { 82 | // Empty 83 | } 84 | 85 | /** 86 | * Checks if the mixin should be applied. A mixin is applied, if its class node exists. 87 | * 88 | * @param targetClassName Fully qualified class name of the target class 89 | * @param mixinClassName Fully qualified class name of the mixin 90 | * @return Whether the Mixin should be applied 91 | * @throws RuntimeException If any unexpected exception occurs (should never be thrown, app is exited) 92 | * @see #provider 93 | * @see IClassBytecodeProvider#getClassNode(String) 94 | * @see Ksyxis#handleError(String, Throwable) 95 | * @see #PLUGIN_ERROR 96 | */ 97 | @CheckReturnValue 98 | @Override 99 | public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { 100 | // Wrap to handle exceptions as a control flow. 101 | try { 102 | // If the Mixin class is not from Ksyxis, don't touch it and allow it to be applied. 103 | if (!mixinClassName.startsWith("ru.vidtu.ksyxis.mixins.")) { 104 | // Log. (**TRACE**) 105 | if (!LOGGER.isTraceEnabled(Ksyxis.KSYXIS_MARKER)) return true; 106 | LOGGER.trace(Ksyxis.KSYXIS_MARKER, "Ksyxis: Applying mixin, because it's not a part of Ksyxis. (provider: {}, plugin: {}, targetClassName: {}, mixinClassName: {})", new Object[]{this.provider, this, targetClassName, mixinClassName}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 107 | return true; 108 | } 109 | 110 | // Get the node. This method should never return null. It returns the class node, if the class exists. 111 | // It throws ClassNotFoundException if the class doesn't exist. We handle the exception below. 112 | ClassNode node = this.provider.getClassNode(targetClassName); 113 | 114 | // It returned null... 115 | if (node == null) { 116 | throw new NullPointerException("Ksyxis: Bytecode provider returned null. (provider: " + this.provider + ", plugin: " + this + ", targetClassName: " + targetClassName + ", mixinClassName: " + mixinClassName + ')'); 117 | } 118 | 119 | // Didn't throw - class exists. Log and apply. (**DEBUG**) 120 | if (!LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return true; 121 | LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Bytecode provider returned a valid node, applying mixin... (provider: {}, plugin: {}, targetClassName: {}, mixinClassName: {})", new Object[]{this.provider, this, targetClassName, mixinClassName}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 122 | return true; 123 | } catch (ClassNotFoundException cnfe) { 124 | // Provider threw an ClassNotFoundException. Don't apply mixin to avoid warnings. Log. (**DEBUG**) 125 | if (!LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return false; 126 | LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Bytecode provider threw an exception, mixin WON'T be applied. (provider: {}, plugin: {}, targetClassName: {}, mixinClassName: {})", new Object[]{this.provider, this, targetClassName, mixinClassName, cnfe}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 127 | return false; 128 | } catch (Throwable t) { 129 | // Format the message. 130 | String message = String.format(PLUGIN_ERROR, this.provider, this, targetClassName, mixinClassName); 131 | 132 | // Handle the error. 133 | throw Ksyxis.handleError(message, t); 134 | } 135 | } 136 | 137 | /** 138 | * Does nothing. 139 | * 140 | * @param mixinPackage Ignored 141 | */ 142 | @Contract(pure = true) 143 | @Override 144 | public void onLoad(String mixinPackage) { 145 | // NO-OP 146 | } 147 | 148 | /** 149 | * Does nothing. Always returns {@code null}. 150 | * 151 | * @return Always {@code null} 152 | */ 153 | @Contract(value = "-> null", pure = true) 154 | @Override 155 | @Nullable 156 | public String getRefMapperConfig() { 157 | return null; 158 | } 159 | 160 | /** 161 | * Does nothing. 162 | * 163 | * @param myTargets Ignored 164 | * @param otherTargets Ignored 165 | */ 166 | @Contract(pure = true) 167 | @Override 168 | public void acceptTargets(Set myTargets, Set otherTargets) { 169 | // NO-OP 170 | } 171 | 172 | /** 173 | * Does nothing. Always returns {@code null}. 174 | * 175 | * @return Always {@code null} 176 | */ 177 | @Contract(value = "-> null", pure = true) 178 | @Override 179 | @Nullable 180 | public List getMixins() { 181 | return null; 182 | } 183 | 184 | /** 185 | * Does nothing. 186 | * 187 | * @param targetClassName Ignored 188 | * @param targetClass Ignored 189 | * @param mixinClassName Ignored 190 | * @param mixinInfo Ignored 191 | */ 192 | @Contract(pure = true) 193 | @Override 194 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 195 | // NO-OP 196 | } 197 | 198 | /** 199 | * Does nothing. 200 | * 201 | * @param targetClassName Ignored 202 | * @param targetClass Ignored 203 | * @param mixinClassName Ignored 204 | * @param mixinInfo Ignored 205 | */ 206 | @Contract(pure = true) 207 | @Override 208 | public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 209 | // NO-OP 210 | } 211 | 212 | @Contract(pure = true) 213 | @Override 214 | public String toString() { 215 | return "Ksyxis/KPlugin{" + 216 | "provider=" + this.provider + 217 | '}'; 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/Ksyxis.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis; 28 | 29 | import org.apache.logging.log4j.LogManager; 30 | import org.apache.logging.log4j.Logger; 31 | import org.apache.logging.log4j.Marker; 32 | import org.apache.logging.log4j.MarkerManager; 33 | import org.jetbrains.annotations.ApiStatus; 34 | import org.jetbrains.annotations.CheckReturnValue; 35 | import org.jetbrains.annotations.Contract; 36 | import org.jspecify.annotations.NullMarked; 37 | import org.spongepowered.asm.launch.MixinBootstrap; 38 | import org.spongepowered.asm.mixin.Mixins; 39 | 40 | import java.lang.reflect.Field; 41 | import java.lang.reflect.Method; 42 | 43 | /** 44 | * Main Ksyxis class. 45 | * 46 | * @author VidTu 47 | * @apiNote Internal use only 48 | * @see KPlugin 49 | */ 50 | @ApiStatus.Internal 51 | @NullMarked 52 | public final class Ksyxis { 53 | /** 54 | * Amount of loaded spawn chunks by vanilla Minecraft before 1.20.5. {@code 441} ({@code 21x21}) chunks. 55 | * 56 | * @see #LOADED_CHUNKS 57 | * @see #getLoadedChunks() 58 | */ 59 | public static final int SPAWN_CHUNKS = (21 * 21); 60 | 61 | /** 62 | * Marker for all logs generated by the mod. 63 | */ 64 | public static final Marker KSYXIS_MARKER = MarkerManager.getMarker("MOD_KSYXIS"); 65 | 66 | /** 67 | * Mixin absent error message. Shown in {@link #obtainMixinVersion(String, boolean)} when Mixin is not found. 68 | * 69 | * @see #obtainMixinVersion(String, boolean) 70 | * @see #handleError(String, Throwable) 71 | */ 72 | private static final String MIXIN_ABSENT = "Ksyxis: No Mixin found. If you`re using old (1.15.2 or older) Forge, " + 73 | "please install a Mixin loader, for example MixinBootstrap, MixinBooter, UniMixins, or any other at your " + 74 | "choice. If you`re using new (1.16 or newer) Forge, any Fabric, any Quilt, any Ornithe, any " + 75 | "LegacyFabric, or any NeoForge, then something went wrong, you should report it via GitHub. Ensure to " + 76 | "include as much information (game version, loader type, loader version, mod version, other mods, logs, " + 77 | "etc.) in the bug report as possible, this error screen is NOT enough. If you don`t want any hassles and " + 78 | "just want to load the game without solving anything, delete the Ksyxis mod. (platform: %s; manual: %s)"; 79 | 80 | /** 81 | * Mixin inject error message. Shown in {@link #init(String, boolean)} when an error occurs. 82 | * 83 | * @see #init(String, boolean) 84 | * @see #handleError(String, Throwable) 85 | */ 86 | private static final String MIXIN_INJECT = "Ksyxis: Unable to inject the Ksyxis configuration. It`s probably a " + 87 | "bug or something, you should report it via GitHub. Ensure to include as much information (game version, " + 88 | "loader type, loader version, mod version, other mods, logs, etc.) in the bug report as possible, this " + 89 | "error screen is NOT enough. If you don`t want any hassles and just want to load the game without " + 90 | "solving anything, delete the Ksyxis mod. (platform: %s; manual: %s)"; 91 | 92 | /** 93 | * Logger for this class. 94 | */ 95 | private static final Logger LOGGER = LogManager.getLogger("Ksyxis"); 96 | 97 | /** 98 | * Amount of loaded chunks to report. Usually {@code 0}, {@link #SPAWN_CHUNKS} with ModernFix. 99 | * 100 | * @see #SPAWN_CHUNKS 101 | * @see #getLoadedChunks() 102 | */ 103 | // This MUST be below LOGGER, otherwise deadlocks will screw us up. 104 | public static final int LOADED_CHUNKS = getLoadedChunks(); 105 | 106 | /** 107 | * An instance of this class cannot be created. 108 | * 109 | * @throws AssertionError Always 110 | * @deprecated Always throws 111 | */ 112 | @ApiStatus.ScheduledForRemoval 113 | @Deprecated 114 | @Contract(value = "-> fail", pure = true) 115 | private Ksyxis() { 116 | throw new AssertionError("Ksyxis: No instances."); 117 | } 118 | 119 | /** 120 | * Initializes the mod. If {@code manual}, bootstraps the Mixin and injects its configuration. 121 | * 122 | * @param platform Current platform 123 | * @param manual Whether to bootstrap the Mixin inject Mixin configuration manually 124 | * @throws RuntimeException If any unexpected exception occurs (should never be thrown, app is exited) 125 | * @see #obtainMixinVersion(String, boolean) 126 | * @see MixinBootstrap#init() 127 | * @see Mixins#addConfiguration(String) 128 | * @see #handleError(String, Throwable) 129 | */ 130 | public static void init(String platform, boolean manual) { 131 | try { 132 | // Log. 133 | long start = System.nanoTime(); 134 | LOGGER.info(KSYXIS_MARKER, "Ksyxis: Booting... (platform: {}, manual: {})", new Object[]{platform, manual}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 135 | 136 | // Obtain Mixin version. 137 | String mixinVersion = obtainMixinVersion(platform, manual); 138 | 139 | // Log. (**DEBUG**) 140 | if (LOGGER.isDebugEnabled(KSYXIS_MARKER)) { 141 | LOGGER.debug(KSYXIS_MARKER, "Ksyxis: Found Mixin library. (mixinVersion: {})", new Object[]{mixinVersion}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 142 | } 143 | 144 | // Bootstrap Mixin and add the config. (if manual) 145 | if (manual) { 146 | LOGGER.debug(KSYXIS_MARKER, "Ksyxis: Bootstrapping Mixin..."); 147 | MixinBootstrap.init(); 148 | LOGGER.debug(KSYXIS_MARKER, "Ksyxis: Mixin Bootstrap success. Injecting config..."); 149 | Mixins.addConfiguration("ksyxis.mixins.json"); 150 | LOGGER.debug(KSYXIS_MARKER, "Ksyxis: Mixin config added."); 151 | } 152 | 153 | // Log the info. 154 | LOGGER.info(KSYXIS_MARKER, "Ksyxis: Ready. As always, this mod will speed up your world loading and might or might not break it. (mixinVersion: {}, time: {} ms)", new Object[]{mixinVersion, (System.nanoTime() - start) / 1_000_000L}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 155 | } catch (Throwable t) { 156 | // Format the message. 157 | String message = String.format(MIXIN_INJECT, platform, manual); 158 | 159 | // Handle the error. 160 | throw handleError(message, t); 161 | } 162 | } 163 | 164 | /** 165 | * Logs the error, shows the friendly UI if possible, and throws the exception. 166 | * 167 | * @param message Error details to log 168 | * @param error Exception to log 169 | * @return Never returns normally, can be used for throw block (should never be thrown, app is exited) 170 | * @throws RuntimeException Wrapper for {@code message} and {@code error} (should never be thrown, app is exited) 171 | * @see #MIXIN_ABSENT 172 | * @see #MIXIN_INJECT 173 | */ 174 | @Contract("_, _ -> fail") 175 | @CheckReturnValue 176 | static RuntimeException handleError(String message, Throwable error) { 177 | // Log. 178 | LOGGER.error(KSYXIS_MARKER, message, error); 179 | error.printStackTrace(); 180 | 181 | // Try to display LWJGL3 message box from TinyFD. 182 | try { 183 | Class tinyFd = Class.forName("org.lwjgl.util.tinyfd.TinyFileDialogs"); 184 | Method tinyFdMessageBox = tinyFd.getMethod("tinyfd_messageBox", CharSequence.class, 185 | CharSequence.class, CharSequence.class, CharSequence.class, boolean.class); 186 | tinyFdMessageBox.invoke(null, "Minecraft | Ksyxis Mod", message, /*buttons=*/"ok", 187 | /*icon=*/"error", /*selectOkButton=*/false); 188 | } catch (Throwable t) { 189 | // Suppress for logging. 190 | error.addSuppressed(new RuntimeException("Ksyxis: Unable to display the LWJGL3 error message. Maybe it's LWJGL2 or server here.", t)); 191 | } 192 | 193 | // Log again with suppressed errors. 194 | LOGGER.error(KSYXIS_MARKER, message, error); 195 | error.printStackTrace(); 196 | 197 | // Try to display LWJGL2 alert from Sys. 198 | try { 199 | Class sys = Class.forName("org.lwjgl.Sys"); 200 | Method sysAlert = sys.getMethod("alert", String.class, String.class); 201 | sysAlert.invoke(null, "Minecraft | Ksyxis Mod", message); 202 | } catch (Throwable t) { 203 | // Suppress for logging. 204 | error.addSuppressed(new RuntimeException("Ksyxis: Unable to display the LWJGL2 error message. Maybe it's LWJGL3 or server here.", t)); 205 | } 206 | 207 | // Log again with suppressed errors. 208 | LOGGER.error(KSYXIS_MARKER, message, error); 209 | error.printStackTrace(); 210 | 211 | // Try to die. Some smart guys at Forge 1.8.9 thought it's a good idea to prevent shutting down. 212 | // See below how we're bypassing that restriction, because Java 8 is not encapsulated. 213 | try { 214 | System.exit(-2037852655); // "Ksyxis".hashCode() 215 | } catch (Throwable t) { 216 | // Suppress for logging. 217 | error.addSuppressed(new RuntimeException("Ksyxis: Unable to exit the game normally.", t)); 218 | } 219 | 220 | // Log again with suppressed errors. 221 | LOGGER.error(KSYXIS_MARKER, message, error); 222 | error.printStackTrace(); 223 | 224 | // Try to die via reflection. 225 | try { 226 | Class shutdownClass = Class.forName("java.lang.Shutdown"); 227 | Method shutdownMethod = shutdownClass.getDeclaredMethod("exit", int.class); 228 | shutdownMethod.setAccessible(true); 229 | shutdownMethod.invoke(null, -2037852655); // "Ksyxis".hashCode() 230 | } catch (Throwable t) { 231 | // Suppress for logging. 232 | error.addSuppressed(new RuntimeException("Ksyxis: Unable to exit the game reflectively.", t)); 233 | } 234 | 235 | // Log again with suppressed errors. 236 | LOGGER.error(KSYXIS_MARKER, message, error); 237 | error.printStackTrace(); 238 | 239 | // Throw. 240 | throw new RuntimeException(message, error); 241 | } 242 | 243 | /** 244 | * Tries to obtain current Mixin version from {@link MixinBootstrap#VERSION} without javac inlining. 245 | * If Mixin is not found, logs the error, shows the friendly UI if possible, and throws the exception. 246 | * 247 | * @param platform Current platform (for errors and logging) 248 | * @param manual Whether the Mixin configuration will be injected manually (for errors and logging) 249 | * @return Current Mixin version 250 | * @throws RuntimeException If Mixin is not installed or Mixin version can't be obtained 251 | * @see MixinBootstrap#VERSION 252 | * @see #init(String, boolean) 253 | * @see #handleError(String, Throwable) 254 | * @see #MIXIN_ABSENT 255 | */ 256 | @CheckReturnValue 257 | private static String obtainMixinVersion(String platform, boolean manual) { 258 | // Check for Mixin. 259 | try { 260 | // Get the field. 261 | Field field = MixinBootstrap.class.getField("VERSION"); 262 | 263 | // Extract the field value without javac inlining. 264 | Object obj = field.get(null); 265 | return String.valueOf(obj); 266 | } catch (Throwable t) { 267 | // Format the message. 268 | String message = String.format(MIXIN_ABSENT, platform, manual); 269 | 270 | // Handle the error. 271 | throw handleError(message, t); 272 | } 273 | } 274 | 275 | /** 276 | * Evaluates and returns the amount of loaded chunks to report. Usually {@code 0}, because we have no spawn chunks, 277 | * but if ModernFix is installed, the value might be changed to {@link #SPAWN_CHUNKS} to prevent deadlocks. 278 | * 279 | * @return Either {@code 0} or {@link #SPAWN_CHUNKS}, depending on the configuration 280 | * @see #SPAWN_CHUNKS 281 | * @see #LOADED_CHUNKS 282 | */ 283 | @Contract(pure = true) 284 | private static int getLoadedChunks() { 285 | try { 286 | // Load the ModernFix plugin config. 287 | Class modernFixPluginClass = Class.forName("org.embeddedt.modernfix.core.ModernFixMixinPlugin"); 288 | Field modernFixPluginField = modernFixPluginClass.getDeclaredField("instance"); 289 | Method modernFixIsOptionEnabled = modernFixPluginClass.getMethod("isOptionEnabled", String.class); 290 | Object modernFix = modernFixPluginField.get(null); 291 | 292 | // Check the removeSpawnChunks. ModernFix apparently did this too for some time, just in different way. 293 | boolean removeSpawnChunks = (boolean) modernFixIsOptionEnabled.invoke(modernFix, "perf.remove_spawn_chunks.MinecraftServer"); 294 | 295 | // Log. (**DEBUG**) 296 | if (LOGGER.isDebugEnabled(KSYXIS_MARKER)) { 297 | LOGGER.debug(KSYXIS_MARKER, "Ksyxis: ModernFix's 'removeSpawnChunks' option is: {}", new Object[]{removeSpawnChunks}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 298 | } 299 | 300 | // Check what amount of spawn chunks to report back to the game. 301 | // ModernFix needs 441, because of its own way of doing it. 302 | // Ksyxis needs 0, because we remove all spawn chunks. 303 | return (removeSpawnChunks ? SPAWN_CHUNKS : 0); 304 | } catch (Throwable t) { 305 | // Log. (**DEBUG**) 306 | LOGGER.debug(KSYXIS_MARKER, "Ksyxis: Unable to provide compat for ModernFix, it's probably not installed.", t); 307 | 308 | // No ModernFix found, it's Ksyxis only and we have 0 chunks. 309 | return 0; 310 | } 311 | } 312 | } 313 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/mixins/LevelMixin.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.mixins; 28 | 29 | import org.apache.logging.log4j.LogManager; 30 | import org.apache.logging.log4j.Logger; 31 | import org.jetbrains.annotations.Contract; 32 | import org.jspecify.annotations.NullMarked; 33 | import org.spongepowered.asm.mixin.Mixin; 34 | import org.spongepowered.asm.mixin.Pseudo; 35 | import org.spongepowered.asm.mixin.Unique; 36 | import org.spongepowered.asm.mixin.injection.At; 37 | import org.spongepowered.asm.mixin.injection.Inject; 38 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 39 | import ru.vidtu.ksyxis.Ksyxis; 40 | 41 | /** 42 | * Mixin for {@code ServerLevel} that disables spawn chunk tickets in older versions. 43 | * 44 | * @author VidTu 45 | * @apiNote Internal use only 46 | */ 47 | // @ApiStatus.Internal // Can't annotate this without logging in the console. 48 | @Mixin(targets = { 49 | // Deobfuscated 50 | "net.minecraft.world.World", // Forge MCP + Forge SRG 51 | 52 | // Obfuscated 53 | "net.minecraft.class_1150", // Legacy Yarn 54 | "net.minecraft.unmapped.C_5553933" // Ornithe 55 | }, remap = false) 56 | @Pseudo 57 | @NullMarked 58 | public final class LevelMixin { 59 | /** 60 | * Logger for this class. 61 | */ 62 | @Unique 63 | private static final Logger KSYXIS_LOGGER = LogManager.getLogger("Ksyxis/LevelMixin"); 64 | 65 | /** 66 | * An instance of this class cannot be created. 67 | * 68 | * @throws AssertionError Always 69 | * @deprecated Always throws 70 | */ 71 | // @ApiStatus.ScheduledForRemoval // Can't annotate this without logging in the console. 72 | @Deprecated 73 | @Contract(value = "-> fail", pure = true) 74 | private LevelMixin() { 75 | throw new AssertionError("Ksyxis: No instances."); 76 | } 77 | 78 | /** 79 | * Injects into {@code isSpawnChunk(int, int)} to always return {@code false} to prevent loading spawn chunks. 80 | * Used before 1.13.2 (inclusive). 81 | * 82 | * @param x Chunk X, used only for logging 83 | * @param z Chunk Z, used only for logging 84 | * @param cir Callback data to set {@code false} into 85 | */ 86 | @Inject(method = { 87 | // Deobfuscated 88 | "isSpawnChunk(II)Z", // Forge MCP 89 | 90 | // Obfuscated 91 | "func_72916_c(II)Z", // Forge SRG 92 | "method_3671(II)Z", // Legacy Fabric Intermediary 93 | "m_4821236(II)Z" // Ornithe 94 | }, at = @At("HEAD"), cancellable = true, require = 0, expect = 0) 95 | private void ksyxis_isSpawnChunk_head(int x, int z, CallbackInfoReturnable cir) { 96 | // Log. (**TRACE**) 97 | if (KSYXIS_LOGGER.isTraceEnabled(Ksyxis.KSYXIS_MARKER)) { 98 | KSYXIS_LOGGER.trace(Ksyxis.KSYXIS_MARKER, "Ksyxis: Forcing chunk to be not spawn chunk in LevelMixin. (x: {}, z: {}, cir: {}, level: {})", new Object[]{x, z, cir, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 99 | } 100 | 101 | // Always force false to remove any spawn chunks from the world and allow them to be unloaded. 102 | cir.setReturnValue(false); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/mixins/MinecraftServerMixin.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.mixins; 28 | 29 | import org.apache.logging.log4j.LogManager; 30 | import org.apache.logging.log4j.Logger; 31 | import org.jetbrains.annotations.Contract; 32 | import org.jspecify.annotations.NullMarked; 33 | import org.spongepowered.asm.mixin.Mixin; 34 | import org.spongepowered.asm.mixin.Pseudo; 35 | import org.spongepowered.asm.mixin.Unique; 36 | import org.spongepowered.asm.mixin.injection.At; 37 | import org.spongepowered.asm.mixin.injection.Constant; 38 | import org.spongepowered.asm.mixin.injection.Inject; 39 | import org.spongepowered.asm.mixin.injection.ModifyConstant; 40 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 41 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 42 | import ru.vidtu.ksyxis.Ksyxis; 43 | 44 | /** 45 | * Mixin for {@code ServerLevel} that disables waiting for spawn chunks and sets {@code spawnChunkRadius} to {@code 0}. 46 | * 47 | * @author VidTu 48 | * @apiNote Internal use only 49 | */ 50 | // @ApiStatus.Internal // Can't annotate this without logging in the console. 51 | @Mixin(targets = { 52 | // Deobfuscated. 53 | "net.minecraft.server.MinecraftServer", // Basically everywhere 54 | 55 | // Obfuscated. 56 | "net.minecraft.src.C_4977_" // Forge SRG 57 | }, remap = false) 58 | @Pseudo 59 | @NullMarked 60 | public final class MinecraftServerMixin { 61 | /** 62 | * Logger for this class. 63 | */ 64 | @Unique 65 | private static final Logger KSYXIS_LOGGER = LogManager.getLogger("Ksyxis/MinecraftServerMixin"); 66 | 67 | /** 68 | * An instance of this class cannot be created. 69 | * 70 | * @throws AssertionError Always 71 | * @deprecated Always throws 72 | */ 73 | // @ApiStatus.ScheduledForRemoval // Can't annotate this without logging in the console. 74 | @Deprecated 75 | @Contract(value = "-> fail", pure = true) 76 | private MinecraftServerMixin() { 77 | throw new AssertionError("Ksyxis: No instances."); 78 | } 79 | 80 | /** 81 | * Injects into {@code MinecraftServer.prepareLevels} (Mojang mappings) to override 82 | * the {@code spawnChunkRadius} gamerule. Used since 1.20.6 (inclusive). 83 | * 84 | * @param spawnChunkRadius Previous {@code spawnChunkRadius} value for logging 85 | * @return Always {@code 0} 86 | */ 87 | @Contract(pure = true) 88 | @ModifyVariable(method = { 89 | // Deobfuscated 90 | "prepareLevels(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Official Mojang 91 | "prepareStartRegion(Lnet/minecraft/server/WorldGenerationProgressListener;)V", // Fabric Yarn 92 | "loadInitialChunks(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge MCP 93 | 94 | // Obfuscated 95 | "method_3774(Lnet/minecraft/class_3949;)V", // Fabric Intermediary 96 | "func_213186_a(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge SRG (1.16.x) 97 | "m_129940_(Lnet/minecraft/src/C_21_;)V", // Forge SRG (1.17.x) 98 | "m_129940_(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Forge SRG (1.20.x) 99 | "m_wcdfzsgy(Lnet/minecraft/unmapped/C_jnfclwgd;)V", // Quilt Hashed 100 | "m_4020281(Lnet/minecraft/unmapped/C_9126287;)V" // Ornithe Feather 101 | }, at = @At("STORE"), remap = false, require = 0, expect = 0, index = 5) 102 | private int ksyxis_prepareLevels_spawnChunkRadius_getInt(int spawnChunkRadius) { 103 | // Report spawnChunkRadius gamerule as 0. Also log. (**DEBUG**) 104 | if (!KSYXIS_LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return 0; 105 | KSYXIS_LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Reporting 0 as spawnChunkRadius gamerule in MinecraftServerMixin. (previousSpawnChunks: {}, expectedPreviousSpawnChunks: from 0 to 32, server: {})", new Object[]{spawnChunkRadius, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 106 | return 0; 107 | } 108 | 109 | /** 110 | * Injects into {@code MinecraftServer.prepareLevels} (Mojang mappings) to warn about possible issues. 111 | * Used in 1.14 (inclusive) through 1.20.4 (inclusive). 112 | * 113 | * @param ci Callback data, ignored 114 | */ 115 | @Contract(pure = true) 116 | @Inject(method = { 117 | // Deobfuscated 118 | "prepareLevels(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Official Mojang 119 | "prepareStartRegion(Lnet/minecraft/server/WorldGenerationProgressListener;)V", // Fabric Yarn 120 | "loadInitialChunks(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge MCP 121 | 122 | // Obfuscated 123 | "method_3774(Lnet/minecraft/class_3949;)V", // Fabric Intermediary 124 | "func_213186_a(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge SRG (1.16.x) 125 | "m_129940_(Lnet/minecraft/src/C_21_;)V", // Forge SRG (1.17.x) 126 | "m_129940_(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Forge SRG (1.20.x) 127 | "m_wcdfzsgy(Lnet/minecraft/unmapped/C_jnfclwgd;)V", // Quilt Hashed 128 | "m_4020281(Lnet/minecraft/unmapped/C_9126287;)V" // Ornithe Feather 129 | }, at = @At("HEAD"), remap = false, require = 0, expect = 0) 130 | private void ksyxis_prepareLevels_head(CallbackInfo ci) { 131 | // Log. 132 | KSYXIS_LOGGER.info(Ksyxis.KSYXIS_MARKER, "Ksyxis: Hey. This is Ksyxis. We will now load the world and will try to do it quickly. If the game is not responding after this, it's probably us to blame or delete for good. This message appears always, even if the mod works flawlessly. (injector: modern, ci: {}, server: {})", new Object[]{ci, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 133 | } 134 | 135 | /** 136 | * Injects into {@code MinecraftServer.prepareLevels} (Mojang mappings) to prevent loading chunks at the spawn. 137 | * Used in 1.14 (inclusive) through 1.20.4 (inclusive). 138 | * 139 | * @param constant Previous constant value for logging 140 | * @return Always {@code 0} 141 | */ 142 | @Contract(pure = true) 143 | @ModifyConstant(method = { 144 | // Deobfuscated 145 | "prepareLevels(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Official Mojang 146 | "prepareStartRegion(Lnet/minecraft/server/WorldGenerationProgressListener;)V", // Fabric Yarn 147 | "loadInitialChunks(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge MCP 148 | 149 | // Obfuscated 150 | "method_3774(Lnet/minecraft/class_3949;)V", // Fabric Intermediary 151 | "func_213186_a(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge SRG (1.16.x) 152 | "m_129940_(Lnet/minecraft/src/C_21_;)V", // Forge SRG (1.17.x) 153 | "m_129940_(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Forge SRG (1.20.x) 154 | "m_wcdfzsgy(Lnet/minecraft/unmapped/C_jnfclwgd;)V", // Quilt Hashed 155 | "m_4020281(Lnet/minecraft/unmapped/C_9126287;)V" // Ornithe Feather 156 | }, constant = @Constant(intValue = 11), remap = false, require = 0, expect = 0) 157 | private int ksyxis_prepareLevels_addRegionTicket(int constant) { 158 | // Add zero-level ticket. Also log. (**DEBUG**) 159 | if (!KSYXIS_LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return 0; 160 | KSYXIS_LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Adding zero-level ticket in MinecraftServerMixin. (previousTicketLevel: {}, expectedPreviousTicketLevel: 11, server: {})", new Object[]{constant, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 161 | return 0; 162 | } 163 | 164 | /** 165 | * Injects into {@code MinecraftServer.prepareLevels} (Mojang mappings) to prevent game freezing 166 | * while trying to wait for {@link Ksyxis#SPAWN_CHUNKS} chunks that will never load. Returns {@code 0}. 167 | * Does nothing with ModernFix and returns {@link Ksyxis#SPAWN_CHUNKS}. 168 | * 169 | * @param constant Previous constant value for logging 170 | * @return Always {@code 0} without ModernFix, always {@link Ksyxis#SPAWN_CHUNKS} with ModernFix 171 | * @see Ksyxis#SPAWN_CHUNKS 172 | * @see Ksyxis#LOADED_CHUNKS 173 | */ 174 | @Contract(pure = true) 175 | @ModifyConstant(method = { 176 | // Deobfuscated 177 | "prepareLevels(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Official Mojang 178 | "prepareStartRegion(Lnet/minecraft/server/WorldGenerationProgressListener;)V", // Fabric Yarn 179 | "loadInitialChunks(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge MCP 180 | 181 | // Obfuscated 182 | "method_3774(Lnet/minecraft/class_3949;)V", // Fabric Intermediary 183 | "func_213186_a(Lnet/minecraft/world/chunk/listener/IChunkStatusListener;)V", // Forge SRG (1.16.x) 184 | "m_129940_(Lnet/minecraft/src/C_21_;)V", // Forge SRG (1.17.x) 185 | "m_129940_(Lnet/minecraft/server/level/progress/ChunkProgressListener;)V", // Forge SRG (1.20.x) 186 | "m_wcdfzsgy(Lnet/minecraft/unmapped/C_jnfclwgd;)V", // Quilt Hashed 187 | "m_4020281(Lnet/minecraft/unmapped/C_9126287;)V" // Ornithe Feather 188 | }, constant = @Constant(intValue = Ksyxis.SPAWN_CHUNKS), remap = false, require = 0, expect = 0) 189 | private int ksyxis_prepareLevels_getTickingGenerated(int constant) { 190 | // Wait for 0 chunks to load. Also log. (**DEBUG**) 191 | if (!KSYXIS_LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return Ksyxis.LOADED_CHUNKS; 192 | KSYXIS_LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Reporting fake loaded chunks in MinecraftServerMixin. (fakeLoaded: {}, expectedFakeLoaded: 0 or 441, reallyLoaded: {}, expectedReallyLoaded: 441, server: {})", new Object[]{Ksyxis.LOADED_CHUNKS, constant, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 193 | return Ksyxis.LOADED_CHUNKS; 194 | } 195 | 196 | /** 197 | * Injects into {@code MinecraftServer.initialWorldChunkLoad} (Forge MCP mappings) to warn about possible issues. 198 | * Used before 1.13.2 (inclusive). 199 | * 200 | * @param ci Callback data, ignored 201 | */ 202 | @Contract(pure = true) 203 | @Inject(method = { 204 | // Deobfuscated 205 | "initialWorldChunkLoad(Lnet/minecraft/world/storage/WorldSavedDataStorage;)V", // Forge MCP (1.13) 206 | "initialWorldChunkLoad()V", // Forge MCP (1.12) 207 | "prepareWorlds()V", // Legacy Fabric Yarn (1.12) 208 | "prepareWorlds(Lnet/minecraft/world/storage/DimensionDataStorage;)V", // Ornithe Feather (1.13) 209 | 210 | // Obfuscated 211 | "method_20317(Lnet/minecraft/class_4070;)V", // Legacy Fabric Intermediary (1.13) 212 | "method_3019()V", // Legacy Fabric Intermediary (1.12) 213 | "func_71222_d(Lnet/minecraft/world/storage/WorldSavedDataStorage;)V", // Forge SRG (1.13) 214 | "func_71222_d()V", // Forge SRG (1.12) 215 | "m_4020281(Lnet/minecraft/unmapped/C_8054043;)V", // Ornithe Feather (1.13) 216 | "m_4020281(Lnet/minecraft/unmapped/C_9126287;)V" // Ornithe Feather (1.12) 217 | }, at = @At("HEAD"), remap = false, require = 0, expect = 0) 218 | private void ksyxis_initialWorldChunkLoad_head(CallbackInfo ci) { 219 | // Log. 220 | KSYXIS_LOGGER.info(Ksyxis.KSYXIS_MARKER, "Ksyxis: Hey. This is Ksyxis. We will now load the world and will try to do it quickly. If the game is not responding after this, it's probably us to blame or delete for good. This message appears always, even if the mod works flawlessly. (injector: legacy, ci: {}, server: {})", new Object[]{ci, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 221 | } 222 | 223 | /** 224 | * Injects into {@code MinecraftServer.initialWorldChunkLoad} (Forge MCP mappings) to prevent loading 225 | * chunks at the spawn. Used before 1.13.2 (inclusive). 226 | * 227 | * @param constant Previous constant value for logging 228 | * @return Either {@code 1} or {@code -1} 229 | */ 230 | @Contract(pure = true) 231 | @ModifyConstant(method = { 232 | // Deobfuscated 233 | "initialWorldChunkLoad(Lnet/minecraft/world/storage/WorldSavedDataStorage;)V", // Forge MCP (1.13) 234 | "initialWorldChunkLoad()V", // Forge MCP (1.12) 235 | "prepareWorlds()V", // Legacy Fabric Yarn (1.12) 236 | "prepareWorlds(Lnet/minecraft/world/storage/DimensionDataStorage;)V", // Ornithe Feather (1.13) 237 | 238 | // Obfuscated 239 | "method_20317(Lnet/minecraft/class_4070;)V", // Legacy Fabric Intermediary (1.13) 240 | "method_3019()V", // Legacy Fabric Intermediary (1.12) 241 | "func_71222_d(Lnet/minecraft/world/storage/WorldSavedDataStorage;)V", // Forge SRG (1.13) 242 | "func_71222_d()V", // Forge SRG (1.12) 243 | "m_4020281(Lnet/minecraft/unmapped/C_8054043;)V", // Ornithe (1.13) 244 | "m_4020281()V" // Ornithe (1.12) 245 | }, constant = {@Constant(intValue = -192), @Constant(intValue = 192)}, remap = false, require = 0, expect = 0) 246 | private int ksyxis_initialWorldChunkLoad_loop(int constant) { 247 | // Loop from 1 to -1 to prevent looping. Also log. (**DEBUG**) 248 | int report = ((constant < 0) ? 1 : -1); 249 | if (!KSYXIS_LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return report; 250 | KSYXIS_LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Hijacking loop constant to prevent looping in MinecraftServerMixin. (from: {}, to: {}, server: {})", new Object[]{constant, report, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 251 | return report; 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/mixins/ServerLevelMixin.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.mixins; 28 | 29 | import org.apache.logging.log4j.LogManager; 30 | import org.apache.logging.log4j.Logger; 31 | import org.jetbrains.annotations.Contract; 32 | import org.jspecify.annotations.NullMarked; 33 | import org.spongepowered.asm.mixin.Mixin; 34 | import org.spongepowered.asm.mixin.Pseudo; 35 | import org.spongepowered.asm.mixin.Unique; 36 | import org.spongepowered.asm.mixin.injection.At; 37 | import org.spongepowered.asm.mixin.injection.Constant; 38 | import org.spongepowered.asm.mixin.injection.ModifyConstant; 39 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 40 | import ru.vidtu.ksyxis.Ksyxis; 41 | 42 | /** 43 | * Mixin for {@code ServerLevel} that disables spawn chunk tickets and sets {@code spawnChunkRadius} to {@code 0}. 44 | * 45 | * @author VidTu 46 | * @apiNote Internal use only 47 | */ 48 | // @ApiStatus.Internal // Can't annotate this without logging in the console. 49 | @Mixin(targets = { 50 | // Deobfuscated. 51 | "net.minecraft.server.level.ServerLevel", // Official Mojang 52 | "net.minecraft.server.world.ServerWorld", // Fabric Yarn 53 | "net.minecraft.world.server.ServerWorld", // Forge MCP 54 | 55 | // Obfuscated. 56 | "net.minecraft.class_3218", // Fabric Intermediary 57 | "net.minecraft.src.C_12_", // Forge SRG 58 | "net.minecraft.unmapped.C_bdwnwhiu", // Quilt Hashed 59 | "net.minecraft.unmapped.C_3865296" // Ornithe 60 | }, remap = false) 61 | @Pseudo 62 | @NullMarked 63 | public final class ServerLevelMixin { 64 | /** 65 | * Logger for this class. 66 | */ 67 | @Unique 68 | private static final Logger KSYXIS_LOGGER = LogManager.getLogger("Ksyxis/ServerLevelMixin"); 69 | 70 | /** 71 | * An instance of this class cannot be created. 72 | * 73 | * @throws AssertionError Always 74 | * @deprecated Always throws 75 | */ 76 | // @ApiStatus.ScheduledForRemoval // Can't annotate this without logging in the console. 77 | @Deprecated 78 | @Contract(value = "-> fail", pure = true) 79 | private ServerLevelMixin() { 80 | throw new AssertionError("Ksyxis: No instances."); 81 | } 82 | 83 | /** 84 | * Injects into {@code ServerLevel.setDefaultSpawnPos} (Mojang mappings) to override 85 | * the {@code spawnChunkRadius} gamerule. Used since 1.20.6 (inclusive). 86 | * 87 | * @param spawnChunkRadius Previous {@code spawnChunkRadius} value for logging 88 | * @return Always {@code 0} 89 | */ 90 | @Contract(pure = true) 91 | @ModifyVariable(method = { 92 | // Deobfuscated 93 | "setDefaultSpawnPos(Lnet/minecraft/core/BlockPos;F)V", // Official Mojang 94 | "setDefaultSpawnPos(Lnet/minecraft/core/BlockPos;)V", // Official Mojang (Old) 95 | "setSpawnPos(Lnet/minecraft/util/math/BlockPos;F)V", // Fabric Yarn 96 | "setSpawnPos(Lnet/minecraft/util/math/BlockPos;)V", // Fabric Yarn (Old) 97 | "setSpawnLocation(Lnet/minecraft/util/math/BlockPos;F)V", // Forge MCP 98 | "setSpawnLocation(Lnet/minecraft/util/math/BlockPos;)V", // Forge MCP (Old) 99 | "setSpawnPoint(Lnet/minecraft/util/math/BlockPos;F)V", // Ornithe 100 | "setSpawnPoint(Lnet/minecraft/util/math/BlockPos;)V", // Ornithe (Old) 101 | 102 | // Obfuscated 103 | "method_8554(Lnet/minecraft/class_2338;F)V", // Fabric Intermediary 104 | "method_8554(Lnet/minecraft/class_2338;)V", // Fabric Intermediary (Old) 105 | "m_8733_(Lnet/minecraft/core/BlockPos;F)V", // Forge SRG (1.20.x) 106 | "m_8733_(Lnet/minecraft/src/C_4675_;F)V", // Forge SRG (1.17.x) 107 | "func_241124_a__(Lnet/minecraft/util/math/BlockPos;F)V", // Forge SRG (1.16.x) 108 | "func_241124_a__(Lnet/minecraft/util/math/BlockPos;)V", // Forge SRG (1.16.x/Old) 109 | "m_3711633(Lnet/minecraft/unmapped/C_3674802;)V", // Ornithe 110 | "m_3711633(Lnet/minecraft/unmapped/C_3674802;F)V" // Ornithe 111 | }, at = @At("STORE"), remap = false, require = 0, expect = 0, index = 5) 112 | private int ksyxis_setDefaultSpawnPos_spawnChunkRadius_getInt(int spawnChunkRadius) { 113 | // Report spawnChunkRadius gamerule as 0. Also log. (**DEBUG**) 114 | if (!KSYXIS_LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return 0; 115 | KSYXIS_LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Reporting 0 as spawnChunkRadius gamerule in ServerLevelMixin. (previousSpawnChunks: {}, expectedPreviousSpawnChunks: from 0 to 32, level: {})", new Object[]{spawnChunkRadius, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 116 | return 0; 117 | } 118 | 119 | /** 120 | * Injects into {@code ServerLevel.setDefaultSpawnPos} (Mojang mappings) to prevent loading chunks at the spawn 121 | * after setting it. Used in 1.14 (inclusive) through 1.20.4 (inclusive). Always returns {@code 0}. 122 | * 123 | * @param constant Previous constant value for logging 124 | * @return Always {@code 0} 125 | */ 126 | @Contract(pure = true) 127 | @ModifyConstant(method = { 128 | // Deobfuscated 129 | "setDefaultSpawnPos(Lnet/minecraft/core/BlockPos;F)V", // Official Mojang 130 | "setDefaultSpawnPos(Lnet/minecraft/core/BlockPos;)V", // Official Mojang (Old) 131 | "setSpawnPos(Lnet/minecraft/util/math/BlockPos;F)V", // Fabric Yarn 132 | "setSpawnPos(Lnet/minecraft/util/math/BlockPos;)V", // Fabric Yarn (Old) 133 | "setSpawnLocation(Lnet/minecraft/util/math/BlockPos;F)V", // Forge MCP 134 | "setSpawnLocation(Lnet/minecraft/util/math/BlockPos;)V", // Forge MCP (Old) 135 | "setSpawnPoint(Lnet/minecraft/util/math/BlockPos;F)V", // Ornithe 136 | "setSpawnPoint(Lnet/minecraft/util/math/BlockPos;)V", // Ornithe (Old) 137 | 138 | // Obfuscated 139 | "method_8554(Lnet/minecraft/class_2338;F)V", // Fabric Intermediary 140 | "method_8554(Lnet/minecraft/class_2338;)V", // Fabric Intermediary (Old) 141 | "m_8733_(Lnet/minecraft/core/BlockPos;F)V", // Forge SRG (1.20.x) 142 | "m_8733_(Lnet/minecraft/src/C_4675_;F)V", // Forge SRG (1.17.x) 143 | "func_241124_a__(Lnet/minecraft/util/math/BlockPos;F)V", // Forge SRG (1.16.x) 144 | "func_241124_a__(Lnet/minecraft/util/math/BlockPos;)V", // Forge SRG (1.16.x/Old) 145 | "m_3711633(Lnet/minecraft/unmapped/C_3674802;)V", // Ornithe 146 | "m_3711633(Lnet/minecraft/unmapped/C_3674802;F)V" // Ornithe 147 | }, constant = @Constant(intValue = 11), remap = false, require = 0, expect = 0) 148 | private int ksyxis_setDefaultSpawnPos_addRegionTicket(int constant) { 149 | // Add zero-level chunk loading ticket. Also log. (**DEBUG**) 150 | if (!KSYXIS_LOGGER.isDebugEnabled(Ksyxis.KSYXIS_MARKER)) return 0; 151 | KSYXIS_LOGGER.debug(Ksyxis.KSYXIS_MARKER, "Ksyxis: Adding zero-level ticket in ServerLevelMixin. (previousTicketLevel: {}, expectedPreviousTicketLevel: 11, level: {})", new Object[]{constant, this}); // <- Array for compat with Log4j2 2.0-beta.9 used in older MC versions. 152 | return 0; 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/mixins/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | /** 28 | * Ksyxis package with mixins to inject. 29 | * 30 | * @author VidTu 31 | * @apiNote Internal use only 32 | * @see ru.vidtu.ksyxis.KPlugin 33 | */ 34 | @ApiStatus.Internal 35 | @NullMarked 36 | package ru.vidtu.ksyxis.mixins; 37 | 38 | import org.jetbrains.annotations.ApiStatus; 39 | import org.jspecify.annotations.NullMarked; 40 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | /** 28 | * Main Ksyxis package. 29 | * 30 | * @author VidTu 31 | * @apiNote Internal use only 32 | * @see ru.vidtu.ksyxis.Ksyxis 33 | * @see ru.vidtu.ksyxis.KPlugin 34 | */ 35 | @ApiStatus.Internal 36 | @NullMarked 37 | package ru.vidtu.ksyxis; 38 | 39 | import org.jetbrains.annotations.ApiStatus; 40 | import org.jspecify.annotations.NullMarked; 41 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/platform/KCore.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.platform; 28 | 29 | import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; 30 | import org.jetbrains.annotations.ApiStatus; 31 | import org.jetbrains.annotations.Contract; 32 | import org.jspecify.annotations.NullMarked; 33 | import org.jspecify.annotations.Nullable; 34 | import ru.vidtu.ksyxis.Ksyxis; 35 | 36 | import java.util.Map; 37 | 38 | /** 39 | * Main Ksyxis class for Legacy Forge. (coremod hook) 40 | * 41 | * @author VidTu 42 | * @apiNote Internal use only 43 | * @see Ksyxis 44 | * @see KForge 45 | */ 46 | @ApiStatus.Internal 47 | @NullMarked 48 | public final class KCore implements IFMLLoadingPlugin { 49 | /** 50 | * Creates a new coremod. 51 | */ 52 | @Contract(pure = true) 53 | public KCore() { 54 | // Empty 55 | } 56 | 57 | /** 58 | * Does nothing. Always returns {@code null}. 59 | * 60 | * @return Always {@code null} 61 | */ 62 | @Contract(value = "-> null", pure = true) 63 | @Override 64 | @Nullable 65 | public String getAccessTransformerClass() { 66 | return null; 67 | } 68 | 69 | /** 70 | * Does nothing. Always returns {@code null}. 71 | * 72 | * @return Always {@code null} 73 | */ 74 | @Contract(value = "-> null", pure = true) 75 | @Override 76 | public String @Nullable [] getASMTransformerClass() { 77 | return null; 78 | } 79 | 80 | /** 81 | * Does nothing. Always returns {@code null}. 82 | * 83 | * @return Always {@code null} 84 | */ 85 | @Contract(value = "-> null", pure = true) 86 | @Override 87 | @Nullable 88 | public String getModContainerClass() { 89 | return null; 90 | } 91 | 92 | /** 93 | * Does nothing. Always returns {@code null}. 94 | * 95 | * @return Always {@code null} 96 | */ 97 | @Contract(value = "-> null", pure = true) 98 | @Override 99 | @Nullable 100 | public String getSetupClass() { 101 | return null; 102 | } 103 | 104 | /** 105 | * Calls {@link Ksyxis#init(String, boolean)} with {@code platform="LegacyForge"} and {@code manual=true}. 106 | * 107 | * @param data Injection data, ignored 108 | * @see Ksyxis#init(String, boolean) 109 | */ 110 | @Override 111 | public void injectData(Map data) { 112 | Ksyxis.init("LegacyForge/KCore", /*manual=*/true); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/platform/KFabric.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.platform; 28 | 29 | import net.fabricmc.api.ModInitializer; 30 | import org.jetbrains.annotations.ApiStatus; 31 | import org.jetbrains.annotations.Contract; 32 | import org.jspecify.annotations.NullMarked; 33 | import ru.vidtu.ksyxis.Ksyxis; 34 | 35 | /** 36 | * Main Ksyxis class for Fabric. 37 | * 38 | * @author VidTu 39 | * @apiNote Internal use only 40 | * @see Ksyxis 41 | * @see KQuilt 42 | */ 43 | @ApiStatus.Internal 44 | @NullMarked 45 | public final class KFabric implements ModInitializer { 46 | /** 47 | * Creates a new mod. 48 | */ 49 | @Contract(pure = true) 50 | public KFabric() { 51 | // Empty 52 | } 53 | 54 | /** 55 | * Calls {@link Ksyxis#init(String, boolean)} with {@code platform="Fabric"} and {@code manual=false}. 56 | * 57 | * @see Ksyxis#init(String, boolean) 58 | */ 59 | @Override 60 | public void onInitialize() { 61 | Ksyxis.init("Fabric/KFabric", /*manual=*/false); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/platform/KForge.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.platform; 28 | 29 | import net.minecraftforge.fml.common.Mod; 30 | import org.jetbrains.annotations.ApiStatus; 31 | import org.jspecify.annotations.NullMarked; 32 | import ru.vidtu.ksyxis.Ksyxis; 33 | 34 | /** 35 | * Main Ksyxis class for Forge. (modern & legacy) 36 | * 37 | * @author VidTu 38 | * @apiNote Internal use only 39 | * @see Ksyxis 40 | * @see KNeo 41 | * @see KCore 42 | */ 43 | @ApiStatus.Internal 44 | @Mod(value = "ksyxis"/*(modern)*/, modid = "ksyxis"/*(legacy)*/, acceptableRemoteVersions = "*"/*(legacy)*/) 45 | @NullMarked 46 | public final class KForge { 47 | /** 48 | * Calls {@link Ksyxis#init(String, boolean)} with {@code platform="Forge"} and {@code manual=false}. 49 | * 50 | * @see Ksyxis#init(String, boolean) 51 | */ 52 | public KForge() { 53 | Ksyxis.init("Forge/KForge", /*manual=*/false); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/platform/KNeoForge.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.platform; 28 | 29 | import net.neoforged.fml.common.Mod; 30 | import org.jetbrains.annotations.ApiStatus; 31 | import org.jspecify.annotations.NullMarked; 32 | import ru.vidtu.ksyxis.Ksyxis; 33 | 34 | /** 35 | * Main Ksyxis class for NeoForge. 36 | * 37 | * @author VidTu 38 | * @apiNote Internal use only 39 | * @see Ksyxis 40 | * @see KForge 41 | */ 42 | @ApiStatus.Internal 43 | @Mod("ksyxis") 44 | @NullMarked 45 | public final class KNeoForge { 46 | /** 47 | * Calls {@link Ksyxis#init(String, boolean)} with {@code platform="NeoForge"} and {@code manual=false}. 48 | * 49 | * @see Ksyxis#init(String, boolean) 50 | */ 51 | public KNeoForge() { 52 | Ksyxis.init("NeoForge/KNeoForge", /*manual=*/false); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/platform/KQuilt.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | package ru.vidtu.ksyxis.platform; 28 | 29 | import org.jetbrains.annotations.ApiStatus; 30 | import org.jetbrains.annotations.Contract; 31 | import org.jspecify.annotations.NullMarked; 32 | import org.quiltmc.loader.api.ModContainer; 33 | import org.quiltmc.qsl.base.api.entrypoint.ModInitializer; 34 | import ru.vidtu.ksyxis.Ksyxis; 35 | 36 | /** 37 | * Main Ksyxis class for Quilt. 38 | * 39 | * @author VidTu 40 | * @apiNote Internal use only 41 | * @see Ksyxis 42 | * @see KFabric 43 | */ 44 | @SuppressWarnings("unused") // <- Quilt mod. 45 | @ApiStatus.Internal 46 | @NullMarked 47 | public final class KQuilt implements ModInitializer { 48 | /** 49 | * Creates a new mod. 50 | */ 51 | @Contract(pure = true) 52 | public KQuilt() { 53 | // Empty 54 | } 55 | 56 | /** 57 | * Calls {@link Ksyxis#init(String, boolean)} with {@code platform="Quilt"} and {@code manual=false}. 58 | * 59 | * @param mod Mod container, ignored 60 | * @see Ksyxis#init(String, boolean) 61 | */ 62 | @Override 63 | public void onInitialize(ModContainer mod) { 64 | Ksyxis.init("Quilt/KQuilt", /*manual=*/false); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/ru/vidtu/ksyxis/platform/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * MIT License 3 | * 4 | * Copyright (c) 2021-2025 VidTu 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | * SPDX-License-Identifier: MIT 25 | */ 26 | 27 | /** 28 | * Ksyxis package with loader entrypoints. 29 | * 30 | * @author VidTu 31 | * @apiNote Internal use only 32 | * @see ru.vidtu.ksyxis.Ksyxis 33 | * @see ru.vidtu.ksyxis.Ksyxis#init(java.lang.String, boolean) 34 | */ 35 | @ApiStatus.Internal 36 | @NullMarked 37 | package ru.vidtu.ksyxis.platform; 38 | 39 | import org.jetbrains.annotations.ApiStatus; 40 | import org.jspecify.annotations.NullMarked; 41 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/mods.toml: -------------------------------------------------------------------------------- 1 | modLoader = "javafml" 2 | loaderVersion = "*" 3 | license = "MIT" 4 | issueTrackerURL = "https://github.com/VidTu/Ksyxis/issues" 5 | 6 | [[mods]] 7 | modId = "ksyxis" 8 | version = "${version}" 9 | displayName = "Ksyxis" 10 | updateJSONURL = "https://raw.githubusercontent.com/VidTu/Ksyxis/main/updater_ksyxis_forge.json" 11 | displayURL = "https://modrinth.com/mod/ksyxis" 12 | issueTrackerURL = "https://github.com/VidTu/Ksyxis/issues" 13 | catalogueImageIcon = "ksyxis_64.png" 14 | catalogueItemIcon = "minecraft:porkchop" 15 | catalogueBackground = "ksyxis_background.png" 16 | itemIcon = "minecraft:porkchop" 17 | logoFile = "ksyxis_240.png" 18 | authors = "VidTu" 19 | displayTest = "IGNORE_ALL_VERSION" 20 | description = '''Speed up your world loading by removing spawn chunks.''' 21 | 22 | [[mixins]] 23 | config = "ksyxis.mixins.json" 24 | 25 | [modproperties.ksyxis] 26 | catalogueImageIcon = "ksyxis_64.png" 27 | catalogueItemIcon = "minecraft:porkchop" 28 | catalogueBackground = "ksyxis_background.png" 29 | itemIcon = "minecraft:porkchop" 30 | logoFile = "ksyxis_240.png" 31 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader = "javafml" 2 | loaderVersion = "*" 3 | license = "MIT" 4 | issueTrackerURL = "https://github.com/VidTu/Ksyxis/issues" 5 | 6 | [[mods]] 7 | modId = "ksyxis" 8 | version = "${version}" 9 | displayName = "Ksyxis" 10 | updateJSONURL = "https://raw.githubusercontent.com/VidTu/Ksyxis/main/updater_ksyxis_neoforge.json" 11 | displayURL = "https://modrinth.com/mod/ksyxis" 12 | issueTrackerURL = "https://github.com/VidTu/Ksyxis/issues" 13 | catalogueImageIcon = "ksyxis_64.png" 14 | catalogueItemIcon = "minecraft:porkchop" 15 | catalogueBackground = "ksyxis_background.png" 16 | itemIcon = "minecraft:porkchop" 17 | logoFile = "ksyxis_240.png" 18 | authors = "VidTu" 19 | displayTest = "IGNORE_ALL_VERSION" 20 | description = '''Speed up your world loading by removing spawn chunks.''' 21 | 22 | [[mixins]] 23 | config = "ksyxis.mixins.json" 24 | 25 | [modproperties.ksyxis] 26 | catalogueImageIcon = "ksyxis_64.png" 27 | catalogueItemIcon = "minecraft:porkchop" 28 | catalogueBackground = "ksyxis_background.png" 29 | itemIcon = "minecraft:porkchop" 30 | logoFile = "ksyxis_240.png" 31 | -------------------------------------------------------------------------------- /src/main/resources/assets/ksyxis/lang/en_US.lang: -------------------------------------------------------------------------------- 1 | modmenu.descriptionTranslation.ksyxis=Speed up your world loading by removing spawn chunks. 2 | modmenu.summaryTranslation.ksyxis=Speed up your world loading. 3 | -------------------------------------------------------------------------------- /src/main/resources/assets/ksyxis/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "modmenu.descriptionTranslation.ksyxis": "Speed up your world loading by removing spawn chunks.", 3 | "modmenu.summaryTranslation.ksyxis": "Speed up your world loading." 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/assets/ksyxis/lang/ru_RU.lang: -------------------------------------------------------------------------------- 1 | modmenu.descriptionTranslation.ksyxis=Ускорьте загрузку своего мира, удалив чанки на спавне. 2 | modmenu.summaryTranslation.ksyxis=Ускорьте загрузку своего мира. 3 | -------------------------------------------------------------------------------- /src/main/resources/assets/ksyxis/lang/ru_ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "modmenu.descriptionTranslation.ksyxis": "Ускорьте загрузку своего мира, удалив чанки на спавне.", 3 | "modmenu.summaryTranslation.ksyxis": "Ускорьте загрузку своего мира." 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "ksyxis", 4 | "version": "${version}", 5 | "name": "Ksyxis", 6 | "description": "Speed up your world loading by removing spawn chunks.", 7 | "authors": [ 8 | "VidTu" 9 | ], 10 | "contact": { 11 | "homepage": "https://modrinth.com/mod/ksyxis", 12 | "sources": "https://github.com/VidTu/Ksyxis", 13 | "issues": "https://github.com/VidTu/Ksyxis/issues", 14 | "email": "pig@vidtu.ru", 15 | "discord": "https://discord.gg/Q6saSVSuYQ" 16 | }, 17 | "license": "MIT", 18 | "icon": "ksyxis.png", 19 | "environment": "*", 20 | "entrypoints": { 21 | "main": [ 22 | "ru.vidtu.ksyxis.platform.KFabric" 23 | ] 24 | }, 25 | "mixins": [ 26 | "ksyxis.mixins.json" 27 | ], 28 | "custom": { 29 | "modmenu": { 30 | "links": { 31 | "modmenu.curseforge": "https://curseforge.com/minecraft/mc-mods/ksyxis", 32 | "modmenu.modrinth": "https://modrinth.com/mod/ksyxis", 33 | "modmenu.github_releases": "https://github.com/VidTu/Ksyxis/releases", 34 | "modmenu.discord": "https://discord.gg/Q6saSVSuYQ" 35 | } 36 | }, 37 | "catalogue": { 38 | "icon": { 39 | "image": "ksyxis_64.png", 40 | "item": "minecraft:porkchop" 41 | }, 42 | "banner": "ksyxis_240.png", 43 | "background": "ksyxis_background.png" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/resources/ksyxis.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "minVersion": "0.8", 3 | "compatibilityLevel": "JAVA_8", 4 | "package": "ru.vidtu.ksyxis.mixins", 5 | "plugin": "ru.vidtu.ksyxis.KPlugin", 6 | "mixins": [ 7 | "LevelMixin", 8 | "MinecraftServerMixin", 9 | "ServerLevelMixin" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/ksyxis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/src/main/resources/ksyxis.png -------------------------------------------------------------------------------- /src/main/resources/ksyxis_240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/src/main/resources/ksyxis_240.png -------------------------------------------------------------------------------- /src/main/resources/ksyxis_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/src/main/resources/ksyxis_64.png -------------------------------------------------------------------------------- /src/main/resources/ksyxis_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VidTu/Ksyxis/ed11221c0b0282063d85bba20965b44c98e0c0e5/src/main/resources/ksyxis_background.png -------------------------------------------------------------------------------- /src/main/resources/mcmod.info: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "modid": "ksyxis", 4 | "name": "Ksyxis", 5 | "description": "Speed up your world loading by removing spawn chunks.", 6 | "version": "${version}", 7 | "logoFile": "ksyxis.png", 8 | "url": "https://modrinth.com/mod/ksyxis", 9 | "updateUrl": "https://raw.githubusercontent.com/VidTu/Ksyxis/main/updater_ksyxis_ancient_forge.json", 10 | "updateJSON": "https://raw.githubusercontent.com/VidTu/Ksyxis/main/updater_ksyxis_legacy_forge.json", 11 | "authorList": [ 12 | "VidTu" 13 | ] 14 | } 15 | ] 16 | -------------------------------------------------------------------------------- /src/main/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "description": "Ksyxis", 4 | "pack_format": 1, 5 | "supported_formats": { 6 | "min_inclusive": 0, 7 | "max_inclusive": 99999 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/resources/quilt.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_version": 1, 3 | "quilt_loader": { 4 | "group": "ru.vidtu.ksyxis", 5 | "id": "ksyxis", 6 | "version": "${version}", 7 | "metadata": { 8 | "name": "Ksyxis", 9 | "description": "Speed up your world loading by removing spawn chunks.", 10 | "license": "MIT", 11 | "contributors": { 12 | "VidTu": "Owner" 13 | }, 14 | "contact": { 15 | "homepage": "https://modrinth.com/mod/ksyxis", 16 | "sources": "https://github.com/VidTu/Ksyxis", 17 | "issues": "https://github.com/VidTu/Ksyxis/issues", 18 | "email": "pig@vidtu.ru", 19 | "discord": "https://discord.gg/Q6saSVSuYQ" 20 | }, 21 | "icon": "ksyxis.png" 22 | }, 23 | "intermediate_mappings": "net.fabricmc:intermediary", 24 | "entrypoints": { 25 | "init": "ru.vidtu.ksyxis.platform.KQuilt" 26 | } 27 | }, 28 | "mixin": "ksyxis.mixins.json", 29 | "modmenu": { 30 | "links": { 31 | "modmenu.curseforge": "https://curseforge.com/minecraft/mc-mods/ksyxis", 32 | "modmenu.modrinth": "https://modrinth.com/mod/ksyxis", 33 | "modmenu.github_releases": "https://github.com/VidTu/Ksyxis/releases", 34 | "modmenu.discord": "https://discord.gg/Q6saSVSuYQ" 35 | } 36 | }, 37 | "catalogue": { 38 | "icon": { 39 | "image": "ksyxis_64.png", 40 | "item": "minecraft:porkchop" 41 | }, 42 | "banner": "ksyxis_240.png", 43 | "background": "ksyxis_background.png" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /updater_ksyxis_ancient_forge.json: -------------------------------------------------------------------------------- 1 | { 2 | "homepage": "https://modrinth.com/mod/ksyxis", 3 | "promos": { 4 | "1.21.6-latest": "1.3.3", 5 | "1.21.6-recommended": "1.3.3", 6 | "1.21.5-latest": "1.3.3", 7 | "1.21.5-recommended": "1.3.3", 8 | "1.21.4-latest": "1.3.3", 9 | "1.21.4-recommended": "1.3.3", 10 | "1.21.3-latest": "1.3.3", 11 | "1.21.3-recommended": "1.3.3", 12 | "1.21.2-latest": "1.3.3", 13 | "1.21.2-recommended": "1.3.3", 14 | "1.21.1-latest": "1.3.3", 15 | "1.21.1-recommended": "1.3.3", 16 | "1.21-latest": "1.3.3", 17 | "1.21-recommended": "1.3.3", 18 | "1.20.6-latest": "1.3.3", 19 | "1.20.6-recommended": "1.3.3", 20 | "1.20.5-latest": "1.3.3", 21 | "1.20.5-recommended": "1.3.3", 22 | "1.20.4-latest": "1.3.3", 23 | "1.20.4-recommended": "1.3.3", 24 | "1.20.3-latest": "1.3.3", 25 | "1.20.3-recommended": "1.3.3", 26 | "1.20.2-latest": "1.3.3", 27 | "1.20.2-recommended": "1.3.3", 28 | "1.20.1-latest": "1.3.3", 29 | "1.20.1-recommended": "1.3.3", 30 | "1.20-latest": "1.3.3", 31 | "1.20-recommended": "1.3.3", 32 | "1.19.4-latest": "1.3.3", 33 | "1.19.4-recommended": "1.3.3", 34 | "1.19.3-latest": "1.3.3", 35 | "1.19.3-recommended": "1.3.3", 36 | "1.19.2-latest": "1.3.3", 37 | "1.19.2-recommended": "1.3.3", 38 | "1.19.1-latest": "1.3.3", 39 | "1.19.1-recommended": "1.3.3", 40 | "1.19-latest": "1.3.3", 41 | "1.19-recommended": "1.3.3", 42 | "1.18.2-latest": "1.3.3", 43 | "1.18.2-recommended": "1.3.3", 44 | "1.18.1-latest": "1.3.3", 45 | "1.18.1-recommended": "1.3.3", 46 | "1.18-latest": "1.3.3", 47 | "1.18-recommended": "1.3.3", 48 | "1.17.1-latest": "1.3.3", 49 | "1.17.1-recommended": "1.3.3", 50 | "1.17-latest": "1.3.3", 51 | "1.17-recommended": "1.3.3", 52 | "1.16.5-latest": "1.3.3", 53 | "1.16.5-recommended": "1.3.3", 54 | "1.16.4-latest": "1.3.3", 55 | "1.16.4-recommended": "1.3.3", 56 | "1.16.3-latest": "1.3.3", 57 | "1.16.3-recommended": "1.3.3", 58 | "1.16.2-latest": "1.3.3", 59 | "1.16.2-recommended": "1.3.3", 60 | "1.16.1-latest": "1.3.3", 61 | "1.16.1-recommended": "1.3.3", 62 | "1.16-latest": "1.3.3", 63 | "1.16-recommended": "1.3.3", 64 | "1.15.2-latest": "1.3.3", 65 | "1.15.2-recommended": "1.3.3", 66 | "1.15.1-latest": "1.3.3", 67 | "1.15.1-recommended": "1.3.3", 68 | "1.15-latest": "1.3.3", 69 | "1.15-recommended": "1.3.3", 70 | "1.14.4-latest": "1.3.3", 71 | "1.14.4-recommended": "1.3.3", 72 | "1.14.3-latest": "1.3.3", 73 | "1.14.3-recommended": "1.3.3", 74 | "1.14.2-latest": "1.3.3", 75 | "1.14.2-recommended": "1.3.3", 76 | "1.14.1-latest": "1.3.3", 77 | "1.14.1-recommended": "1.3.3", 78 | "1.14-latest": "1.3.3", 79 | "1.14-recommended": "1.3.3", 80 | "1.13.2-latest": "1.3.3", 81 | "1.13.2-recommended": "1.3.3", 82 | "1.13.1-latest": "1.3.3", 83 | "1.13.1-recommended": "1.3.3", 84 | "1.13-latest": "1.3.3", 85 | "1.13-recommended": "1.3.3", 86 | "1.12.2-latest": "1.3.3", 87 | "1.12.2-recommended": "1.3.3", 88 | "1.12.1-latest": "1.3.3", 89 | "1.12.1-recommended": "1.3.3", 90 | "1.12-latest": "1.3.3", 91 | "1.12-recommended": "1.3.3", 92 | "1.11.2-latest": "1.3.3", 93 | "1.11.2-recommended": "1.3.3", 94 | "1.11.1-latest": "1.3.3", 95 | "1.11.1-recommended": "1.3.3", 96 | "1.11-latest": "1.3.3", 97 | "1.11-recommended": "1.3.3", 98 | "1.10.2-latest": "1.3.3", 99 | "1.10.2-recommended": "1.3.3", 100 | "1.10.1-latest": "1.3.3", 101 | "1.10.1-recommended": "1.3.3", 102 | "1.10-latest": "1.3.3", 103 | "1.10-recommended": "1.3.3", 104 | "1.9.4-latest": "1.3.3", 105 | "1.9.4-recommended": "1.3.3", 106 | "1.9.3-latest": "1.3.3", 107 | "1.9.3-recommended": "1.3.3", 108 | "1.9.2-latest": "1.3.3", 109 | "1.9.2-recommended": "1.3.3", 110 | "1.9.1-latest": "1.3.3", 111 | "1.9.1-recommended": "1.3.3", 112 | "1.9-latest": "1.3.3", 113 | "1.9-recommended": "1.3.3", 114 | "1.8.9-latest": "1.3.3", 115 | "1.8.9-recommended": "1.3.3", 116 | "1.8.8-latest": "1.3.3", 117 | "1.8.8-recommended": "1.3.3", 118 | "1.8.7-latest": "1.3.3", 119 | "1.8.7-recommended": "1.3.3", 120 | "1.8.6-latest": "1.3.3", 121 | "1.8.6-recommended": "1.3.3", 122 | "1.8.5-latest": "1.3.3", 123 | "1.8.5-recommended": "1.3.3", 124 | "1.8.4-latest": "1.3.3", 125 | "1.8.4-recommended": "1.3.3", 126 | "1.8.3-latest": "1.3.3", 127 | "1.8.3-recommended": "1.3.3", 128 | "1.8.2-latest": "1.3.3", 129 | "1.8.2-recommended": "1.3.3", 130 | "1.8.1-latest": "1.3.3", 131 | "1.8.1-recommended": "1.3.3", 132 | "1.8-latest": "1.3.3", 133 | "1.8-recommended": "1.3.3" 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /updater_ksyxis_forge.json: -------------------------------------------------------------------------------- 1 | { 2 | "homepage": "https://modrinth.com/mod/ksyxis", 3 | "promos": { 4 | "1.21.6-latest": "1.3.3", 5 | "1.21.6-recommended": "1.3.3", 6 | "1.21.5-latest": "1.3.3", 7 | "1.21.5-recommended": "1.3.3", 8 | "1.21.4-latest": "1.3.3", 9 | "1.21.4-recommended": "1.3.3", 10 | "1.21.3-latest": "1.3.3", 11 | "1.21.3-recommended": "1.3.3", 12 | "1.21.2-latest": "1.3.3", 13 | "1.21.2-recommended": "1.3.3", 14 | "1.21.1-latest": "1.3.3", 15 | "1.21.1-recommended": "1.3.3", 16 | "1.21-latest": "1.3.3", 17 | "1.21-recommended": "1.3.3", 18 | "1.20.6-latest": "1.3.3", 19 | "1.20.6-recommended": "1.3.3", 20 | "1.20.5-latest": "1.3.3", 21 | "1.20.5-recommended": "1.3.3", 22 | "1.20.4-latest": "1.3.3", 23 | "1.20.4-recommended": "1.3.3", 24 | "1.20.3-latest": "1.3.3", 25 | "1.20.3-recommended": "1.3.3", 26 | "1.20.2-latest": "1.3.3", 27 | "1.20.2-recommended": "1.3.3", 28 | "1.20.1-latest": "1.3.3", 29 | "1.20.1-recommended": "1.3.3", 30 | "1.20-latest": "1.3.3", 31 | "1.20-recommended": "1.3.3", 32 | "1.19.4-latest": "1.3.3", 33 | "1.19.4-recommended": "1.3.3", 34 | "1.19.3-latest": "1.3.3", 35 | "1.19.3-recommended": "1.3.3", 36 | "1.19.2-latest": "1.3.3", 37 | "1.19.2-recommended": "1.3.3", 38 | "1.19.1-latest": "1.3.3", 39 | "1.19.1-recommended": "1.3.3", 40 | "1.19-latest": "1.3.3", 41 | "1.19-recommended": "1.3.3", 42 | "1.18.2-latest": "1.3.3", 43 | "1.18.2-recommended": "1.3.3", 44 | "1.18.1-latest": "1.3.3", 45 | "1.18.1-recommended": "1.3.3", 46 | "1.18-latest": "1.3.3", 47 | "1.18-recommended": "1.3.3", 48 | "1.17.1-latest": "1.3.3", 49 | "1.17.1-recommended": "1.3.3", 50 | "1.17-latest": "1.3.3", 51 | "1.17-recommended": "1.3.3", 52 | "1.16.5-latest": "1.3.3", 53 | "1.16.5-recommended": "1.3.3", 54 | "1.16.4-latest": "1.3.3", 55 | "1.16.4-recommended": "1.3.3", 56 | "1.16.3-latest": "1.3.3", 57 | "1.16.3-recommended": "1.3.3", 58 | "1.16.2-latest": "1.3.3", 59 | "1.16.2-recommended": "1.3.3", 60 | "1.16.1-latest": "1.3.3", 61 | "1.16.1-recommended": "1.3.3", 62 | "1.16-latest": "1.3.3", 63 | "1.16-recommended": "1.3.3", 64 | "1.15.2-latest": "1.3.3", 65 | "1.15.2-recommended": "1.3.3", 66 | "1.15.1-latest": "1.3.3", 67 | "1.15.1-recommended": "1.3.3", 68 | "1.15-latest": "1.3.3", 69 | "1.15-recommended": "1.3.3", 70 | "1.14.4-latest": "1.3.3", 71 | "1.14.4-recommended": "1.3.3", 72 | "1.14.3-latest": "1.3.3", 73 | "1.14.3-recommended": "1.3.3", 74 | "1.14.2-latest": "1.3.3", 75 | "1.14.2-recommended": "1.3.3", 76 | "1.14.1-latest": "1.3.3", 77 | "1.14.1-recommended": "1.3.3", 78 | "1.14-latest": "1.3.3", 79 | "1.14-recommended": "1.3.3", 80 | "1.13.2-latest": "1.3.3", 81 | "1.13.2-recommended": "1.3.3", 82 | "1.13.1-latest": "1.3.3", 83 | "1.13.1-recommended": "1.3.3", 84 | "1.13-latest": "1.3.3", 85 | "1.13-recommended": "1.3.3", 86 | "1.12.2-latest": "1.3.3", 87 | "1.12.2-recommended": "1.3.3", 88 | "1.12.1-latest": "1.3.3", 89 | "1.12.1-recommended": "1.3.3", 90 | "1.12-latest": "1.3.3", 91 | "1.12-recommended": "1.3.3", 92 | "1.11.2-latest": "1.3.3", 93 | "1.11.2-recommended": "1.3.3", 94 | "1.11.1-latest": "1.3.3", 95 | "1.11.1-recommended": "1.3.3", 96 | "1.11-latest": "1.3.3", 97 | "1.11-recommended": "1.3.3", 98 | "1.10.2-latest": "1.3.3", 99 | "1.10.2-recommended": "1.3.3", 100 | "1.10.1-latest": "1.3.3", 101 | "1.10.1-recommended": "1.3.3", 102 | "1.10-latest": "1.3.3", 103 | "1.10-recommended": "1.3.3", 104 | "1.9.4-latest": "1.3.3", 105 | "1.9.4-recommended": "1.3.3", 106 | "1.9.3-latest": "1.3.3", 107 | "1.9.3-recommended": "1.3.3", 108 | "1.9.2-latest": "1.3.3", 109 | "1.9.2-recommended": "1.3.3", 110 | "1.9.1-latest": "1.3.3", 111 | "1.9.1-recommended": "1.3.3", 112 | "1.9-latest": "1.3.3", 113 | "1.9-recommended": "1.3.3", 114 | "1.8.9-latest": "1.3.3", 115 | "1.8.9-recommended": "1.3.3", 116 | "1.8.8-latest": "1.3.3", 117 | "1.8.8-recommended": "1.3.3", 118 | "1.8.7-latest": "1.3.3", 119 | "1.8.7-recommended": "1.3.3", 120 | "1.8.6-latest": "1.3.3", 121 | "1.8.6-recommended": "1.3.3", 122 | "1.8.5-latest": "1.3.3", 123 | "1.8.5-recommended": "1.3.3", 124 | "1.8.4-latest": "1.3.3", 125 | "1.8.4-recommended": "1.3.3", 126 | "1.8.3-latest": "1.3.3", 127 | "1.8.3-recommended": "1.3.3", 128 | "1.8.2-latest": "1.3.3", 129 | "1.8.2-recommended": "1.3.3", 130 | "1.8.1-latest": "1.3.3", 131 | "1.8.1-recommended": "1.3.3", 132 | "1.8-latest": "1.3.3", 133 | "1.8-recommended": "1.3.3" 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /updater_ksyxis_legacy_forge.json: -------------------------------------------------------------------------------- 1 | { 2 | "homepage": "https://modrinth.com/mod/ksyxis", 3 | "promos": { 4 | "1.21.6-latest": "1.3.3", 5 | "1.21.6-recommended": "1.3.3", 6 | "1.21.5-latest": "1.3.3", 7 | "1.21.5-recommended": "1.3.3", 8 | "1.21.4-latest": "1.3.3", 9 | "1.21.4-recommended": "1.3.3", 10 | "1.21.3-latest": "1.3.3", 11 | "1.21.3-recommended": "1.3.3", 12 | "1.21.2-latest": "1.3.3", 13 | "1.21.2-recommended": "1.3.3", 14 | "1.21.1-latest": "1.3.3", 15 | "1.21.1-recommended": "1.3.3", 16 | "1.21-latest": "1.3.3", 17 | "1.21-recommended": "1.3.3", 18 | "1.20.6-latest": "1.3.3", 19 | "1.20.6-recommended": "1.3.3", 20 | "1.20.5-latest": "1.3.3", 21 | "1.20.5-recommended": "1.3.3", 22 | "1.20.4-latest": "1.3.3", 23 | "1.20.4-recommended": "1.3.3", 24 | "1.20.3-latest": "1.3.3", 25 | "1.20.3-recommended": "1.3.3", 26 | "1.20.2-latest": "1.3.3", 27 | "1.20.2-recommended": "1.3.3", 28 | "1.20.1-latest": "1.3.3", 29 | "1.20.1-recommended": "1.3.3", 30 | "1.20-latest": "1.3.3", 31 | "1.20-recommended": "1.3.3", 32 | "1.19.4-latest": "1.3.3", 33 | "1.19.4-recommended": "1.3.3", 34 | "1.19.3-latest": "1.3.3", 35 | "1.19.3-recommended": "1.3.3", 36 | "1.19.2-latest": "1.3.3", 37 | "1.19.2-recommended": "1.3.3", 38 | "1.19.1-latest": "1.3.3", 39 | "1.19.1-recommended": "1.3.3", 40 | "1.19-latest": "1.3.3", 41 | "1.19-recommended": "1.3.3", 42 | "1.18.2-latest": "1.3.3", 43 | "1.18.2-recommended": "1.3.3", 44 | "1.18.1-latest": "1.3.3", 45 | "1.18.1-recommended": "1.3.3", 46 | "1.18-latest": "1.3.3", 47 | "1.18-recommended": "1.3.3", 48 | "1.17.1-latest": "1.3.3", 49 | "1.17.1-recommended": "1.3.3", 50 | "1.17-latest": "1.3.3", 51 | "1.17-recommended": "1.3.3", 52 | "1.16.5-latest": "1.3.3", 53 | "1.16.5-recommended": "1.3.3", 54 | "1.16.4-latest": "1.3.3", 55 | "1.16.4-recommended": "1.3.3", 56 | "1.16.3-latest": "1.3.3", 57 | "1.16.3-recommended": "1.3.3", 58 | "1.16.2-latest": "1.3.3", 59 | "1.16.2-recommended": "1.3.3", 60 | "1.16.1-latest": "1.3.3", 61 | "1.16.1-recommended": "1.3.3", 62 | "1.16-latest": "1.3.3", 63 | "1.16-recommended": "1.3.3", 64 | "1.15.2-latest": "1.3.3", 65 | "1.15.2-recommended": "1.3.3", 66 | "1.15.1-latest": "1.3.3", 67 | "1.15.1-recommended": "1.3.3", 68 | "1.15-latest": "1.3.3", 69 | "1.15-recommended": "1.3.3", 70 | "1.14.4-latest": "1.3.3", 71 | "1.14.4-recommended": "1.3.3", 72 | "1.14.3-latest": "1.3.3", 73 | "1.14.3-recommended": "1.3.3", 74 | "1.14.2-latest": "1.3.3", 75 | "1.14.2-recommended": "1.3.3", 76 | "1.14.1-latest": "1.3.3", 77 | "1.14.1-recommended": "1.3.3", 78 | "1.14-latest": "1.3.3", 79 | "1.14-recommended": "1.3.3", 80 | "1.13.2-latest": "1.3.3", 81 | "1.13.2-recommended": "1.3.3", 82 | "1.13.1-latest": "1.3.3", 83 | "1.13.1-recommended": "1.3.3", 84 | "1.13-latest": "1.3.3", 85 | "1.13-recommended": "1.3.3", 86 | "1.12.2-latest": "1.3.3", 87 | "1.12.2-recommended": "1.3.3", 88 | "1.12.1-latest": "1.3.3", 89 | "1.12.1-recommended": "1.3.3", 90 | "1.12-latest": "1.3.3", 91 | "1.12-recommended": "1.3.3", 92 | "1.11.2-latest": "1.3.3", 93 | "1.11.2-recommended": "1.3.3", 94 | "1.11.1-latest": "1.3.3", 95 | "1.11.1-recommended": "1.3.3", 96 | "1.11-latest": "1.3.3", 97 | "1.11-recommended": "1.3.3", 98 | "1.10.2-latest": "1.3.3", 99 | "1.10.2-recommended": "1.3.3", 100 | "1.10.1-latest": "1.3.3", 101 | "1.10.1-recommended": "1.3.3", 102 | "1.10-latest": "1.3.3", 103 | "1.10-recommended": "1.3.3", 104 | "1.9.4-latest": "1.3.3", 105 | "1.9.4-recommended": "1.3.3", 106 | "1.9.3-latest": "1.3.3", 107 | "1.9.3-recommended": "1.3.3", 108 | "1.9.2-latest": "1.3.3", 109 | "1.9.2-recommended": "1.3.3", 110 | "1.9.1-latest": "1.3.3", 111 | "1.9.1-recommended": "1.3.3", 112 | "1.9-latest": "1.3.3", 113 | "1.9-recommended": "1.3.3", 114 | "1.8.9-latest": "1.3.3", 115 | "1.8.9-recommended": "1.3.3", 116 | "1.8.8-latest": "1.3.3", 117 | "1.8.8-recommended": "1.3.3", 118 | "1.8.7-latest": "1.3.3", 119 | "1.8.7-recommended": "1.3.3", 120 | "1.8.6-latest": "1.3.3", 121 | "1.8.6-recommended": "1.3.3", 122 | "1.8.5-latest": "1.3.3", 123 | "1.8.5-recommended": "1.3.3", 124 | "1.8.4-latest": "1.3.3", 125 | "1.8.4-recommended": "1.3.3", 126 | "1.8.3-latest": "1.3.3", 127 | "1.8.3-recommended": "1.3.3", 128 | "1.8.2-latest": "1.3.3", 129 | "1.8.2-recommended": "1.3.3", 130 | "1.8.1-latest": "1.3.3", 131 | "1.8.1-recommended": "1.3.3", 132 | "1.8-latest": "1.3.3", 133 | "1.8-recommended": "1.3.3" 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /updater_ksyxis_neoforge.json: -------------------------------------------------------------------------------- 1 | { 2 | "homepage": "https://modrinth.com/mod/ksyxis", 3 | "promos": { 4 | "1.21.6-latest": "1.3.3", 5 | "1.21.6-recommended": "1.3.3", 6 | "1.21.5-latest": "1.3.3", 7 | "1.21.5-recommended": "1.3.3", 8 | "1.21.4-latest": "1.3.3", 9 | "1.21.4-recommended": "1.3.3", 10 | "1.21.3-latest": "1.3.3", 11 | "1.21.3-recommended": "1.3.3", 12 | "1.21.2-latest": "1.3.3", 13 | "1.21.2-recommended": "1.3.3", 14 | "1.21.1-latest": "1.3.3", 15 | "1.21.1-recommended": "1.3.3", 16 | "1.21-latest": "1.3.3", 17 | "1.21-recommended": "1.3.3", 18 | "1.20.6-latest": "1.3.3", 19 | "1.20.6-recommended": "1.3.3", 20 | "1.20.5-latest": "1.3.3", 21 | "1.20.5-recommended": "1.3.3", 22 | "1.20.4-latest": "1.3.3", 23 | "1.20.4-recommended": "1.3.3", 24 | "1.20.3-latest": "1.3.3", 25 | "1.20.3-recommended": "1.3.3", 26 | "1.20.2-latest": "1.3.3", 27 | "1.20.2-recommended": "1.3.3", 28 | "1.20.1-latest": "1.3.3", 29 | "1.20.1-recommended": "1.3.3", 30 | "1.20-latest": "1.3.3", 31 | "1.20-recommended": "1.3.3", 32 | "1.19.4-latest": "1.3.3", 33 | "1.19.4-recommended": "1.3.3", 34 | "1.19.3-latest": "1.3.3", 35 | "1.19.3-recommended": "1.3.3", 36 | "1.19.2-latest": "1.3.3", 37 | "1.19.2-recommended": "1.3.3", 38 | "1.19.1-latest": "1.3.3", 39 | "1.19.1-recommended": "1.3.3", 40 | "1.19-latest": "1.3.3", 41 | "1.19-recommended": "1.3.3", 42 | "1.18.2-latest": "1.3.3", 43 | "1.18.2-recommended": "1.3.3", 44 | "1.18.1-latest": "1.3.3", 45 | "1.18.1-recommended": "1.3.3", 46 | "1.18-latest": "1.3.3", 47 | "1.18-recommended": "1.3.3", 48 | "1.17.1-latest": "1.3.3", 49 | "1.17.1-recommended": "1.3.3", 50 | "1.17-latest": "1.3.3", 51 | "1.17-recommended": "1.3.3", 52 | "1.16.5-latest": "1.3.3", 53 | "1.16.5-recommended": "1.3.3", 54 | "1.16.4-latest": "1.3.3", 55 | "1.16.4-recommended": "1.3.3", 56 | "1.16.3-latest": "1.3.3", 57 | "1.16.3-recommended": "1.3.3", 58 | "1.16.2-latest": "1.3.3", 59 | "1.16.2-recommended": "1.3.3", 60 | "1.16.1-latest": "1.3.3", 61 | "1.16.1-recommended": "1.3.3", 62 | "1.16-latest": "1.3.3", 63 | "1.16-recommended": "1.3.3", 64 | "1.15.2-latest": "1.3.3", 65 | "1.15.2-recommended": "1.3.3", 66 | "1.15.1-latest": "1.3.3", 67 | "1.15.1-recommended": "1.3.3", 68 | "1.15-latest": "1.3.3", 69 | "1.15-recommended": "1.3.3", 70 | "1.14.4-latest": "1.3.3", 71 | "1.14.4-recommended": "1.3.3", 72 | "1.14.3-latest": "1.3.3", 73 | "1.14.3-recommended": "1.3.3", 74 | "1.14.2-latest": "1.3.3", 75 | "1.14.2-recommended": "1.3.3", 76 | "1.14.1-latest": "1.3.3", 77 | "1.14.1-recommended": "1.3.3", 78 | "1.14-latest": "1.3.3", 79 | "1.14-recommended": "1.3.3", 80 | "1.13.2-latest": "1.3.3", 81 | "1.13.2-recommended": "1.3.3", 82 | "1.13.1-latest": "1.3.3", 83 | "1.13.1-recommended": "1.3.3", 84 | "1.13-latest": "1.3.3", 85 | "1.13-recommended": "1.3.3", 86 | "1.12.2-latest": "1.3.3", 87 | "1.12.2-recommended": "1.3.3", 88 | "1.12.1-latest": "1.3.3", 89 | "1.12.1-recommended": "1.3.3", 90 | "1.12-latest": "1.3.3", 91 | "1.12-recommended": "1.3.3", 92 | "1.11.2-latest": "1.3.3", 93 | "1.11.2-recommended": "1.3.3", 94 | "1.11.1-latest": "1.3.3", 95 | "1.11.1-recommended": "1.3.3", 96 | "1.11-latest": "1.3.3", 97 | "1.11-recommended": "1.3.3", 98 | "1.10.2-latest": "1.3.3", 99 | "1.10.2-recommended": "1.3.3", 100 | "1.10.1-latest": "1.3.3", 101 | "1.10.1-recommended": "1.3.3", 102 | "1.10-latest": "1.3.3", 103 | "1.10-recommended": "1.3.3", 104 | "1.9.4-latest": "1.3.3", 105 | "1.9.4-recommended": "1.3.3", 106 | "1.9.3-latest": "1.3.3", 107 | "1.9.3-recommended": "1.3.3", 108 | "1.9.2-latest": "1.3.3", 109 | "1.9.2-recommended": "1.3.3", 110 | "1.9.1-latest": "1.3.3", 111 | "1.9.1-recommended": "1.3.3", 112 | "1.9-latest": "1.3.3", 113 | "1.9-recommended": "1.3.3", 114 | "1.8.9-latest": "1.3.3", 115 | "1.8.9-recommended": "1.3.3", 116 | "1.8.8-latest": "1.3.3", 117 | "1.8.8-recommended": "1.3.3", 118 | "1.8.7-latest": "1.3.3", 119 | "1.8.7-recommended": "1.3.3", 120 | "1.8.6-latest": "1.3.3", 121 | "1.8.6-recommended": "1.3.3", 122 | "1.8.5-latest": "1.3.3", 123 | "1.8.5-recommended": "1.3.3", 124 | "1.8.4-latest": "1.3.3", 125 | "1.8.4-recommended": "1.3.3", 126 | "1.8.3-latest": "1.3.3", 127 | "1.8.3-recommended": "1.3.3", 128 | "1.8.2-latest": "1.3.3", 129 | "1.8.2-recommended": "1.3.3", 130 | "1.8.1-latest": "1.3.3", 131 | "1.8.1-recommended": "1.3.3", 132 | "1.8-latest": "1.3.3", 133 | "1.8-recommended": "1.3.3" 134 | } 135 | } 136 | --------------------------------------------------------------------------------