├── .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 |
4 |
5 |
6 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/copyright/GitHub_VidTu_Ksyxis.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/modules/Ksyxis.main.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
23 |
24 |
25 | MIXIN
26 |
27 | 1
28 |
29 |
30 |
31 |
32 |
33 |
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 |
--------------------------------------------------------------------------------