├── .gitattributes ├── .github ├── advanced-issue-labeler.yml └── workflows │ ├── label-issues.yaml │ ├── manage-labels.yaml │ ├── publish-release.yml │ └── publish-snapshot.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build.gradle ├── buildSrc ├── build.gradle └── src │ └── main │ └── groovy │ ├── multiloader-common.gradle │ └── multiloader-loader.gradle ├── common ├── build.gradle ├── dependencies.gradle └── src │ └── main │ ├── java │ └── net │ │ └── blay09 │ │ └── mods │ │ └── clienttweaks │ │ ├── ClientTweaks.java │ │ ├── ClientTweaksConfig.java │ │ ├── ClientTweaksConfigData.java │ │ ├── ModKeyMappings.java │ │ ├── mixin │ │ ├── AxeItemAccessor.java │ │ ├── BlockStateBaseMixin.java │ │ ├── ChainBlockMixin.java │ │ ├── CrossCollisionBlockMixin.java │ │ ├── ItemInHandRendererAccessor.java │ │ ├── LivingEntityAccessor.java │ │ ├── LivingEntityMixin.java │ │ ├── RecipeBookComponentMixin.java │ │ └── ShovelItemMixin.java │ │ └── tweak │ │ ├── AbstractClientTweak.java │ │ ├── AdditionalVolumeSlider.java │ │ ├── AutoClimbLadder.java │ │ ├── DisableLogStripping.java │ │ ├── DoNotUseLastTorch.java │ │ ├── HideOffhandItem.java │ │ ├── HideOwnEffectParticles.java │ │ ├── HideShieldUnlessHoldingWeapon.java │ │ ├── NoOffhandFireworksWithElytra.java │ │ ├── NoOffhandTorchAtAll.java │ │ ├── NoOffhandTorchWithBlock.java │ │ ├── NoOffhandTorchWithEmptyHand.java │ │ ├── NoOffhandTorchWithFood.java │ │ ├── OffhandTorchWithToolOnly.java │ │ ├── PreventAccidentalMining.java │ │ └── StepAssistIsAnnoying.java │ └── resources │ ├── assets │ └── clienttweaks │ │ └── lang │ │ ├── de_de.json │ │ ├── en_us.json │ │ ├── ja_jp.json │ │ ├── ko_kr.json │ │ ├── pt_br.json │ │ ├── ru_ru.json │ │ ├── tr_tr.json │ │ └── zh_cn.json │ ├── clienttweaks.mixins.json │ ├── clienttweaks.png │ └── pack.mcmeta ├── fabric ├── build.gradle ├── dependencies.gradle └── src │ └── main │ ├── java │ └── net │ │ └── blay09 │ │ └── mods │ │ └── clienttweaks │ │ └── fabric │ │ └── client │ │ └── FabricClientTweaksClient.java │ └── resources │ ├── clienttweaks.fabric.mixins.json │ └── fabric.mod.json ├── forge ├── build.gradle ├── dependencies.gradle └── src │ └── main │ ├── java │ └── net │ │ └── blay09 │ │ └── mods │ │ └── clienttweaks │ │ └── ForgeClientTweaks.java │ └── resources │ ├── META-INF │ └── mods.toml │ └── clienttweaks.forge.mixins.json ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── modpage.md ├── neoforge ├── build.gradle ├── dependencies.gradle └── src │ └── main │ ├── java │ └── net │ │ └── blay09 │ │ └── mods │ │ └── clienttweaks │ │ └── NeoForgeClientTweaks.java │ └── resources │ ├── META-INF │ └── neoforge.mods.toml │ └── clienttweaks.neoforge.mixins.json ├── repositories.gradle └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # Disable autocrlf on generated files, they always generate with LF 2 | # Add any extra files or paths here to make git stop saying they 3 | # are changed when only line endings change. 4 | src/generated/**/.cache/cache text eol=lf 5 | src/generated/**/*.json text eol=lf 6 | -------------------------------------------------------------------------------- /.github/advanced-issue-labeler.yml: -------------------------------------------------------------------------------- 1 | policy: 2 | - template: [report-a-bug.yml] 3 | section: 4 | - id: [minecraftVersion] 5 | block-list: [other] 6 | label: 7 | - name: Minecraft 1.21.5 8 | keys: ['1.21.5'] 9 | - name: Minecraft 1.21.4 10 | keys: ['1.21.4'] 11 | - name: Minecraft 1.21.1 12 | keys: ['1.21.1 (LTS)'] 13 | - name: Minecraft 1.20.1 14 | keys: ['1.20.1 (LTS)'] 15 | - name: EOL 16 | keys: ['Other (specify below)'] 17 | - id: [modLoader] 18 | label: 19 | - name: NeoForge 20 | keys: ['NeoForge'] 21 | - name: Fabric 22 | keys: ['Fabric'] 23 | - name: 'Forge' 24 | keys: ['Forge'] -------------------------------------------------------------------------------- /.github/workflows/label-issues.yaml: -------------------------------------------------------------------------------- 1 | name: Label Issues 2 | on: 3 | issues: 4 | types: [ opened ] 5 | jobs: 6 | label-component: 7 | runs-on: ubuntu-latest 8 | permissions: 9 | contents: read 10 | issues: write 11 | strategy: 12 | matrix: 13 | template: [ report-a-bug.yml ] 14 | steps: 15 | - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 16 | 17 | - name: Parse issue form 18 | uses: TwelveIterations/github-issue-parser@main 19 | id: issue-parser 20 | with: 21 | template-path: https://raw.githubusercontent.com/TwelveIterationMods/.github/refs/heads/main/.github/ISSUE_TEMPLATE/${{ matrix.template }} 22 | 23 | - name: Set labels based on component field 24 | uses: redhat-plumbers-in-action/advanced-issue-labeler@d498805e5c7c0658e336948b3363480bcfd68da6 25 | with: 26 | issue-form: ${{ steps.issue-parser.outputs.jsonString }} 27 | template: ${{ matrix.template }} 28 | token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/manage-labels.yaml: -------------------------------------------------------------------------------- 1 | name: manage-labels 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | dry: 6 | description: 'Dry run (no changes, log only)' 7 | required: false 8 | default: true 9 | type: boolean 10 | remove_missing: 11 | description: 'Remove labels not present in the source data' 12 | required: false 13 | default: false 14 | type: boolean 15 | jobs: 16 | manage-labels: 17 | permissions: 18 | contents: read 19 | issues: write 20 | runs-on: ubuntu-latest 21 | name: manage-labels 22 | steps: 23 | - uses: actions/checkout@v2 24 | - uses: TwelveIterations/manage-labels@main 25 | with: 26 | dry: ${{ inputs.dry }} 27 | remove_missing: ${{ inputs.remove_missing }} 28 | source: https://raw.githubusercontent.com/TwelveIterationMods/.github/refs/heads/main/labels.yaml 29 | env: 30 | GITHUB_TOKEN: ${{ github.token }} 31 | -------------------------------------------------------------------------------- /.github/workflows/publish-release.yml: -------------------------------------------------------------------------------- 1 | name: publish-release 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | forge: 6 | description: 'Forge' 7 | required: true 8 | type: boolean 9 | default: true 10 | fabric: 11 | description: 'Fabric' 12 | required: true 13 | type: boolean 14 | default: true 15 | neoforge: 16 | description: 'NeoForge' 17 | required: true 18 | type: boolean 19 | default: true 20 | 21 | jobs: 22 | create-release: 23 | runs-on: ubuntu-latest 24 | outputs: 25 | ref: v${{ steps.bump-version.outputs.version }} 26 | version: ${{ steps.bump-version.outputs.version }} 27 | build-matrix: ${{ steps.set-build-matrix.outputs.result }} 28 | publish-matrix: ${{ steps.set-publish-matrix.outputs.result }} 29 | steps: 30 | - name: Checkout repository 31 | uses: actions/checkout@v4 32 | - name: Extracting version from properties 33 | shell: bash 34 | run: echo "version=$(cat gradle.properties | grep -w "\bversion\s*=" | cut -d= -f2)" >> $GITHUB_OUTPUT 35 | id: extract-version 36 | - name: Bumping version 37 | uses: TwelveIterationMods/bump-version@v1 38 | with: 39 | version: ${{ steps.extract-version.outputs.version }} 40 | bump: patch 41 | id: bump-version 42 | - name: Updating version properties 43 | run: | 44 | sed -i "s/^\s*version\s*=.*/version = ${{ steps.bump-version.outputs.version }}/g" gradle.properties 45 | git config user.name "GitHub Actions" 46 | git config user.email "<>" 47 | git commit -am "Set version to ${{ steps.bump-version.outputs.version }}" 48 | git push origin ${BRANCH_NAME} 49 | git tag -a "v${{ steps.bump-version.outputs.version }}" -m "Release ${{ steps.bump-version.outputs.version }}" 50 | git push origin "v${{ steps.bump-version.outputs.version }}" 51 | shell: bash 52 | env: 53 | BRANCH_NAME: ${{ github.head_ref || github.ref_name }} 54 | - name: Preparing build matrix 55 | id: set-build-matrix 56 | uses: actions/github-script@v7 57 | with: 58 | script: | 59 | const fs = require('fs'); 60 | const settingsGradle = fs.readFileSync('settings.gradle', 'utf8'); 61 | const includePattern = /^(?!\s*\/\/)\s*include\s*\(\s*(['"]([^'"]+)['"](?:,\s*['"]([^'"]+)['"])*\s*)\)/gm; 62 | const includes = [...settingsGradle.matchAll(includePattern)].flatMap(match => match[0].match(/['"]([^'"]+)['"]/g).map(item => item.replace(/['"]/g, ''))); 63 | const includeFabric = includes.includes('fabric') && ${{inputs.fabric}}; 64 | const includeForge = includes.includes('forge') && ${{inputs.forge}}; 65 | const includeNeoForge = includes.includes('neoforge') && ${{inputs.neoforge}}; 66 | return { 67 | loader: [includeFabric ? 'fabric' : false, includeForge ? 'forge' : false, includeNeoForge ? 'neoforge' : false].filter(Boolean), 68 | } 69 | - name: Preparing publish matrix 70 | id: set-publish-matrix 71 | uses: actions/github-script@v7 72 | with: 73 | script: | 74 | const fs = require('fs'); 75 | const settingsGradle = fs.readFileSync('settings.gradle', 'utf8'); 76 | const includePattern = /^(?!\s*\/\/)\s*include\s*\(\s*(['"]([^'"]+)['"](?:,\s*['"]([^'"]+)['"])*\s*)\)/gm; 77 | const includes = [...settingsGradle.matchAll(includePattern)].flatMap(match => match[0].match(/['"]([^'"]+)['"]/g).map(item => item.replace(/['"]/g, ''))); 78 | const includeFabric = includes.includes('fabric') && ${{inputs.fabric}}; 79 | const includeForge = includes.includes('forge') && ${{inputs.forge}}; 80 | const includeNeoForge = includes.includes('neoforge') && ${{inputs.neoforge}}; 81 | const gradleProperties = fs.readFileSync('gradle.properties', 'utf8'); 82 | const curseForgeProjectId = gradleProperties.match(/^(?!#)curseforge_project_id\s*=\s*(.+)/m); 83 | const modrinthProjectId = gradleProperties.match(/^(?!#)modrinth_project_id\s*=\s*(.+)/m); 84 | const mavenReleases = gradleProperties.match(/^(?!#)maven_releases\s*=\s*(.+)/m); 85 | return { 86 | loader: ['common', includeFabric ? 'fabric' : false, includeForge ? 'forge' : false, includeNeoForge ? 'neoforge' : false].filter(Boolean), 87 | site: [curseForgeProjectId ? 'curseforge' : '', modrinthProjectId ? 'modrinth' : '', mavenReleases ? 'publish' : ''].filter(Boolean), 88 | exclude: [ 89 | {loader: 'common', site: 'curseforge'}, 90 | {loader: 'common', site: 'modrinth'} 91 | ] 92 | } 93 | build-common: 94 | runs-on: ubuntu-latest 95 | steps: 96 | - name: Checkout repository 97 | uses: actions/checkout@v4 98 | with: 99 | ref: ${{ needs.create-release.outputs.ref }} 100 | - name: Validate gradle wrapper 101 | uses: gradle/actions/wrapper-validation@v3 102 | - name: Setup JDK 103 | uses: actions/setup-java@v4 104 | with: 105 | java-version: 21 106 | distribution: temurin 107 | cache: 'gradle' 108 | - name: Make gradle wrapper executable 109 | run: chmod +x ./gradlew 110 | - name: Build common artifact 111 | run: ./gradlew :common:build '-Pversion=${{needs.create-release.outputs.version}}' 112 | - name: Upload common artifact 113 | uses: actions/upload-artifact@v4 114 | with: 115 | name: common-artifact 116 | path: common/build 117 | needs: create-release 118 | build-release: 119 | runs-on: ubuntu-latest 120 | strategy: 121 | matrix: ${{fromJson(needs.create-release.outputs.build-matrix)}} 122 | fail-fast: false 123 | steps: 124 | - name: Checkout repository 125 | uses: actions/checkout@v4 126 | with: 127 | ref: ${{ needs.create-release.outputs.ref }} 128 | - name: Validate gradle wrapper 129 | uses: gradle/actions/wrapper-validation@v3 130 | - name: Setup JDK 131 | uses: actions/setup-java@v4 132 | with: 133 | java-version: 21 134 | distribution: temurin 135 | cache: 'gradle' 136 | - name: Make gradle wrapper executable 137 | run: chmod +x ./gradlew 138 | - name: Download common artifact 139 | uses: actions/download-artifact@v4 140 | with: 141 | name: common-artifact 142 | path: common/build 143 | - name: Build ${{ matrix.loader }} artifact 144 | run: ./gradlew :${{ matrix.loader }}:build '-Pversion=${{needs.create-release.outputs.version}}' 145 | - name: Upload ${{ matrix.loader }} artifact 146 | uses: actions/upload-artifact@v4 147 | with: 148 | name: ${{ matrix.loader }}-artifact 149 | path: ${{ matrix.loader }}/build 150 | needs: 151 | - create-release 152 | - build-common 153 | publish-release: 154 | runs-on: ubuntu-latest 155 | strategy: 156 | matrix: ${{fromJson(needs.create-release.outputs.publish-matrix)}} 157 | fail-fast: false 158 | steps: 159 | - name: Checkout repository 160 | uses: actions/checkout@v4 161 | with: 162 | ref: ${{ needs.create-release.outputs.ref }} 163 | - name: Download ${{ matrix.loader }} artifact 164 | uses: actions/download-artifact@v4 165 | with: 166 | name: ${{ matrix.loader }}-artifact 167 | path: ${{ matrix.loader }}/build 168 | - name: Validate gradle wrapper 169 | uses: gradle/actions/wrapper-validation@v3 170 | - name: Setup JDK 171 | uses: actions/setup-java@v4 172 | with: 173 | java-version: 21 174 | distribution: temurin 175 | cache: 'gradle' 176 | - name: Make gradle wrapper executable 177 | run: chmod +x ./gradlew 178 | - name: Publish 179 | run: ./gradlew :${{ matrix.loader }}:${{ matrix.site }} '-Pversion=${{needs.create-release.outputs.version}}' '-PmavenUsername=${{ secrets.MAVEN_USER }}' '-PmavenPassword=${{ secrets.MAVEN_PASSWORD }}' 180 | env: 181 | CURSEFORGE_TOKEN: ${{secrets.CURSEFORGE_TOKEN}} 182 | MODRINTH_TOKEN: ${{secrets.MODRINTH_TOKEN}} 183 | needs: 184 | - create-release 185 | - build-common 186 | - build-release -------------------------------------------------------------------------------- /.github/workflows/publish-snapshot.yml: -------------------------------------------------------------------------------- 1 | name: publish-snapshot 2 | on: 3 | push: 4 | branches: 5 | - '**' 6 | 7 | jobs: 8 | prepare-matrix: 9 | runs-on: ubuntu-latest 10 | outputs: 11 | matrix: ${{ steps.set-matrix.outputs.result }} 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v4 15 | - name: Preparing matrix 16 | id: set-matrix 17 | uses: actions/github-script@v7 18 | with: 19 | script: | 20 | const fs = require('fs'); 21 | const settingsGradle = fs.readFileSync('settings.gradle', 'utf8'); 22 | const includePattern = /^(?!\s*\/\/)\s*include\s*\(\s*(['"]([^'"]+)['"](?:,\s*['"]([^'"]+)['"])*\s*)\)/gm; 23 | const includes = [...settingsGradle.matchAll(includePattern)] 24 | .flatMap(match => match[0].match(/['"]([^'"]+)['"]/g).map(item => item.replace(/['"]/g, ''))); 25 | const includeFabric = includes.includes('fabric'); 26 | const includeForge = includes.includes('forge'); 27 | const includeNeoForge = includes.includes('neoforge'); 28 | const gradleProperties = fs.readFileSync('gradle.properties', 'utf8'); 29 | const mavenSnapshots = gradleProperties.match(/^(?!#)maven_snapshots\s*=\s*(.+)/m); 30 | return { 31 | loader: ['common', includeFabric ? 'fabric' : false, includeForge ? 'forge' : false, includeNeoForge ? 'neoforge' : false].filter(Boolean), 32 | task: [mavenSnapshots ? 'publish' : 'build'] 33 | }; 34 | publish-snapshot: 35 | runs-on: ubuntu-latest 36 | strategy: 37 | matrix: ${{fromJson(needs.prepare-matrix.outputs.matrix)}} 38 | fail-fast: false 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v4 42 | - name: Validate gradle wrapper 43 | uses: gradle/actions/wrapper-validation@v3 44 | - name: Setup JDK 45 | uses: actions/setup-java@v4 46 | with: 47 | java-version: 21 48 | distribution: temurin 49 | - name: Make gradle wrapper executable 50 | run: chmod +x ./gradlew 51 | - name: Extracting version from properties 52 | shell: bash 53 | run: echo "version=$(cat gradle.properties | grep -w "\bversion\s*=" | cut -d= -f2)" >> $GITHUB_OUTPUT 54 | id: extract-version 55 | - name: Bumping version 56 | uses: TwelveIterationMods/bump-version@v1 57 | with: 58 | version: ${{ steps.extract-version.outputs.version }} 59 | bump: patch 60 | id: bump-version 61 | - name: Publish 62 | run: ./gradlew :${{ matrix.loader }}:${{ matrix.task }} '-Pversion=${{ steps.bump-version.outputs.version }}-SNAPSHOT' '-PmavenUsername=${{ secrets.MAVEN_USER }}' '-PmavenPassword=${{ secrets.MAVEN_PASSWORD }}' 63 | needs: prepare-matrix -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # eclipse 2 | bin 3 | *.launch 4 | .eclipse 5 | .settings 6 | .metadata 7 | .classpath 8 | .project 9 | 10 | # idea 11 | out 12 | *.ipr 13 | *.iws 14 | *.iml 15 | .idea 16 | 17 | # gradle 18 | build 19 | .gradle 20 | 21 | # other 22 | eclipse 23 | run 24 | runs 25 | runserver 26 | logs 27 | 28 | common/src/generated/resources/.cache -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | - Fixed crash when the mod is present on servers 2 | --- 3 | - Fixed crash due to invalid key mapping id 4 | --- 5 | - Fixed disable step assist preventing even vanilla step-up -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | All Rights Reserved 2 | 3 | Copyright (c) 2023 BlayTheNinth 4 | 5 | For modpack permissions and other exceptions, see https://mods.twelveiterations.com/permissions 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 8 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 9 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 10 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Client Tweaks 2 | 3 | Minecraft Mod. There, I fixed Minecraft for you. Various optional tweaks to improve Minecraft Quality of Life. 4 | 5 | - [Modpack Permissions](https://mods.twelveiterations.com/permissions) 6 | 7 | #### Downloads 8 | 9 | [![Versions](http://cf.way2muchnoise.eu/versions/251407_latest.svg)](https://www.curseforge.com/minecraft/mc-mods/client-tweaks) 10 | [![Downloads](http://cf.way2muchnoise.eu/full_251407_downloads.svg)](https://www.curseforge.com/minecraft/mc-mods/client-tweaks) 11 | 12 | ## Contributing 13 | 14 | If you're interested in contributing to the mod, you can check 15 | out [issues labelled as "help wanted"](https://github.com/TwelveIterationMods/ClientTweaks/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22). 16 | 17 | When it comes to new features, it's best to confer with me first to ensure we share the same vision. You can join us on [Discord](https://discord.gg/VAfZ2Nau6j) if you'd like to talk. 18 | 19 | Contributions must be done through pull requests. I will not be able to accept translations, code or other assets through any other channels. 20 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'fabric-loom' version '1.10-SNAPSHOT' apply(false) 3 | id 'net.neoforged.moddev' version '2.0.78' apply(false) 4 | id 'net.darkhax.curseforgegradle' version '1.1.26' apply(false) 5 | id "com.modrinth.minotaur" version "2.+" apply(false) 6 | } 7 | 8 | subprojects { 9 | configurations.all { 10 | resolutionStrategy { 11 | cacheChangingModulesFor 60, 'seconds' 12 | cacheDynamicVersionsFor 60, 'seconds' 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /buildSrc/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'groovy-gradle-plugin' 3 | } -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/multiloader-common.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'maven-publish' 4 | } 5 | 6 | base { 7 | archivesName = "${mod_id}-${project.name}-${minecraft_version}" 8 | version = project.version 9 | } 10 | 11 | java { 12 | toolchain.languageVersion = JavaLanguageVersion.of(java_version) 13 | withSourcesJar() 14 | withJavadocJar() 15 | } 16 | 17 | repositories { 18 | mavenCentral() 19 | // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository 20 | exclusiveContent { 21 | forRepository { 22 | maven { 23 | name = 'Sponge' 24 | url = 'https://repo.spongepowered.org/repository/maven-public' 25 | } 26 | } 27 | filter { includeGroupAndSubgroups("org.spongepowered") } 28 | } 29 | maven { 30 | url "https://maven.twelveiterations.com/repository/maven-public/" 31 | content { 32 | includeGroup "net.blay09.mods" 33 | } 34 | } 35 | exclusiveContent { 36 | forRepositories( 37 | maven { 38 | name = 'ParchmentMC' 39 | url = 'https://maven.parchmentmc.org/' 40 | }, 41 | maven { 42 | name = "NeoForge" 43 | url = 'https://maven.neoforged.net/releases' 44 | } 45 | ) 46 | filter { includeGroup('org.parchmentmc.data') } 47 | } 48 | } 49 | 50 | dependencies { 51 | implementation 'org.jetbrains:annotations:24.1.0' 52 | } 53 | 54 | // Declare capabilities on the outgoing configurations. 55 | // Read more about capabilities here: https://docs.gradle.org/current/userguide/component_capabilities.html#sec:declaring-additional-capabilities-for-a-local-component 56 | ['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> 57 | configurations."$variant".outgoing { 58 | capability("$group:${mod_id.replace('_', '-')}-${project.name}:$version") 59 | capability("$group:${mod_id.replace('_', '-')}:$version") 60 | } 61 | publishing.publications.configureEach { 62 | suppressPomMetadataWarningsFor(variant) 63 | } 64 | } 65 | 66 | sourcesJar { 67 | from(rootProject.file("LICENSE")) { 68 | rename { "${it}_${mod_name}" } 69 | } 70 | } 71 | 72 | jar { 73 | from(rootProject.file("LICENSE")) { 74 | rename { "${it}_${mod_name}" } 75 | } 76 | 77 | manifest { 78 | attributes([ 79 | 'Specification-Title' : mod_name, 80 | 'Specification-Vendor' : mod_author, 81 | 'Specification-Version' : project.jar.archiveVersion, 82 | 'Implementation-Title' : project.name, 83 | 'Implementation-Version': project.jar.archiveVersion, 84 | 'Implementation-Vendor' : mod_author, 85 | 'Built-On-Minecraft' : minecraft_version, 86 | 'MixinConfigs' : "${mod_id}.mixins.json,${mod_id}.${project.name}.mixins.json", 87 | ]) 88 | } 89 | } 90 | 91 | processResources { 92 | def expandProps = [ 93 | "version": version, 94 | "group": project.group, //Else we target the task's group. 95 | "minecraft_version": minecraft_version, 96 | "minimum_minecraft_version": minecraft_version_range.replaceAll("[\\[\\])]", "").split(",")[0], 97 | "forge_version": forge_version, 98 | "forge_loader_version_range": forge_loader_version_range, 99 | "forge_version_range": forge_version_range, 100 | "minecraft_version_range": minecraft_version_range, 101 | "fabric_version": fabric_version, 102 | "fabric_loader_version": fabric_loader_version, 103 | "mod_name": mod_name, 104 | "mod_main": mod_name.replaceAll(" ", ""), 105 | "mod_author": mod_author, 106 | "mod_id": mod_id, 107 | "license": license, 108 | "description": project.description, 109 | "neoforge_version": neoforge_version, 110 | "neoforge_version_range": neoforge_version_range, 111 | "neoforge_loader_version_range": neoforge_loader_version_range, 112 | "credits": credits, 113 | "java_version": java_version, 114 | "homepage": homepage, 115 | "discord": discord, 116 | "issues": issues, 117 | "sources": sources, 118 | "pack_format_number": pack_format_number, 119 | "balm_version_range": balm_version_range, 120 | "minimum_balm_version": balm_version_range.replaceAll("[\\[\\])]", "").split(",")[0], 121 | ] 122 | 123 | filesMatching(['pack.mcmeta', 'fabric.mod.json', 'META-INF/mods.toml', 'META-INF/neoforge.mods.toml', '*.mixins.json']) { 124 | expand expandProps 125 | } 126 | inputs.properties(expandProps) 127 | } 128 | 129 | publishing { 130 | publications { 131 | register('mavenJava', MavenPublication) { 132 | version = project.version + (!project.version.endsWith("SNAPSHOT") ? "+" + minecraft_version : "") 133 | artifactId "${mod_id.replace('_', '-')}-${project.name}" 134 | from components.java 135 | } 136 | } 137 | repositories { 138 | def repoUrl = version.toString().endsWith("SNAPSHOT") ? findProperty("maven_snapshots") : findProperty("maven_releases") 139 | if (repoUrl != null) { 140 | maven { 141 | url = uri(repoUrl) 142 | name = "maven" 143 | credentials(PasswordCredentials) 144 | } 145 | } 146 | } 147 | } -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/multiloader-loader.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'multiloader-common' 3 | } 4 | 5 | configurations { 6 | commonJava { 7 | canBeResolved = true 8 | } 9 | commonResources { 10 | canBeResolved = true 11 | } 12 | commonGeneratedResources { 13 | canBeResolved = true 14 | } 15 | } 16 | 17 | dependencies { 18 | compileOnly(project(':common')) { 19 | capabilities { 20 | requireCapability "$group:${mod_id.replace('_', '-')}" 21 | } 22 | } 23 | commonJava project(path: ':common', configuration: 'commonJava') 24 | commonResources project(path: ':common', configuration: 'commonResources') 25 | commonGeneratedResources project(path: ':common', configuration: 'commonGeneratedResources') 26 | } 27 | 28 | tasks.named('compileJava', JavaCompile) { 29 | dependsOn(configurations.commonJava) 30 | source(configurations.commonJava) 31 | } 32 | 33 | processResources { 34 | dependsOn(configurations.commonResources) 35 | dependsOn(configurations.commonGeneratedResources) 36 | from(configurations.commonResources) 37 | from(configurations.commonGeneratedResources) 38 | } 39 | 40 | tasks.named('javadoc', Javadoc).configure { 41 | dependsOn(configurations.commonJava) 42 | source(configurations.commonJava) 43 | } 44 | 45 | tasks.named("sourcesJar", Jar) { 46 | dependsOn(configurations.commonJava) 47 | from(configurations.commonJava) 48 | dependsOn(configurations.commonResources) 49 | from(configurations.commonResources) 50 | dependsOn(configurations.commonGeneratedResources) 51 | from(configurations.commonGeneratedResources) 52 | } -------------------------------------------------------------------------------- /common/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'multiloader-common' 3 | id 'net.neoforged.moddev' 4 | } 5 | 6 | base { 7 | archivesName = "${mod_id}-common-${minecraft_version}" 8 | } 9 | 10 | neoForge { 11 | neoFormVersion = neo_form_version 12 | // Automatically enable AccessTransformers if the file exists 13 | def at = file('src/main/resources/META-INF/accesstransformer.cfg') 14 | if (at.exists()) { 15 | accessTransformers.from(at.absolutePath) 16 | } 17 | parchment { 18 | minecraftVersion = parchment_minecraft 19 | mappingsVersion = parchment_version 20 | } 21 | } 22 | 23 | dependencies { 24 | compileOnly "org.spongepowered:mixin:$mixin_version" 25 | } 26 | 27 | apply from: rootProject.file('repositories.gradle') 28 | apply from: 'dependencies.gradle' 29 | 30 | configurations { 31 | commonJava { 32 | canBeResolved = false 33 | canBeConsumed = true 34 | } 35 | commonResources { 36 | canBeResolved = false 37 | canBeConsumed = true 38 | } 39 | commonGeneratedResources { 40 | canBeResolved = false 41 | canBeConsumed = true 42 | } 43 | } 44 | 45 | sourceSets { 46 | generated { 47 | resources { 48 | srcDir 'src/generated/resources' 49 | } 50 | } 51 | } 52 | 53 | artifacts { 54 | commonJava sourceSets.main.java.sourceDirectories.singleFile 55 | commonResources sourceSets.main.resources.sourceDirectories.singleFile 56 | commonGeneratedResources sourceSets.generated.resources.sourceDirectories.singleFile 57 | } 58 | 59 | sourceSets { 60 | main { 61 | java { 62 | srcDir 'src/shell/java' 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /common/dependencies.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation("net.blay09.mods:kuma-api-common:${kuma_version}") 3 | implementation("net.blay09.mods:balm-common:${balm_version}") { 4 | changing = balm_version.endsWith("SNAPSHOT") 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/ClientTweaks.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.clienttweaks.tweak.*; 5 | import net.minecraft.resources.ResourceLocation; 6 | import net.minecraft.sounds.SoundSource; 7 | 8 | import java.util.HashMap; 9 | import java.util.Map; 10 | 11 | public class ClientTweaks { 12 | 13 | public static final String MOD_ID = "clienttweaks"; 14 | 15 | private static final Map tweaks = new HashMap<>(); 16 | 17 | public static void initializeCommon() { 18 | ClientTweaksConfig.initialize(); 19 | } 20 | 21 | public static void initializeClient() { 22 | registerTweak(new AdditionalVolumeSlider("master_volume_slider", SoundSource.MASTER, 0) { 23 | @Override 24 | public boolean isEnabled() { 25 | final var config = ClientTweaksConfig.getActive(); 26 | return config != null && config.tweaks.masterVolumeSlider; 27 | } 28 | 29 | @Override 30 | public void setEnabled(boolean enabled) { 31 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.masterVolumeSlider = enabled); 32 | } 33 | }); 34 | 35 | registerTweak(new AdditionalVolumeSlider("music_volume_slider", SoundSource.MUSIC, 1) { 36 | @Override 37 | public boolean isEnabled() { 38 | final var config = ClientTweaksConfig.getActive(); 39 | return config != null && config.tweaks.musicVolumeSlider; 40 | } 41 | 42 | @Override 43 | public void setEnabled(boolean enabled) { 44 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.musicVolumeSlider = enabled); 45 | } 46 | }); 47 | 48 | registerTweak(new NoOffhandTorchAtAll()); 49 | registerTweak(new NoOffhandTorchWithBlock()); 50 | registerTweak(new NoOffhandTorchWithEmptyHand()); 51 | registerTweak(new OffhandTorchWithToolOnly()); 52 | registerTweak(new HideOwnEffectParticles()); 53 | registerTweak(new HideOffhandItem()); 54 | registerTweak(new StepAssistIsAnnoying()); 55 | registerTweak(new AutoClimbLadder()); 56 | registerTweak(new HideShieldUnlessHoldingWeapon()); 57 | registerTweak(new DoNotUseLastTorch()); 58 | registerTweak(new DisableLogStripping()); 59 | registerTweak(new NoOffhandTorchWithFood()); 60 | registerTweak(new NoOffhandFireworksWithElytra()); 61 | registerTweak(new PreventAccidentalMining()); 62 | 63 | ModKeyMappings.initialize(tweaks.values()); 64 | } 65 | 66 | private static void registerTweak(AbstractClientTweak tweak) { 67 | tweaks.put(tweak.getName(), tweak); 68 | } 69 | 70 | public static ResourceLocation id(String path) { 71 | return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/ClientTweaksConfig.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.config.schema.BalmConfigSchema; 5 | import net.minecraft.core.registries.BuiltInRegistries; 6 | import net.minecraft.world.item.ItemStack; 7 | 8 | import java.util.List; 9 | 10 | public class ClientTweaksConfig { 11 | 12 | public static BalmConfigSchema schema; 13 | 14 | public static ClientTweaksConfigData getActive() { 15 | return Balm.getConfig().getActiveConfig(ClientTweaksConfigData.class); 16 | } 17 | 18 | public static void initialize() { 19 | schema = Balm.getConfig().registerConfig(ClientTweaksConfigData.class); 20 | } 21 | 22 | public static boolean isTorchItem(ItemStack itemStack) { 23 | return isItemConfiguredFor(itemStack, ClientTweaksConfig.getActive().customization.torchItems); 24 | } 25 | 26 | public static boolean isTorchTool(ItemStack itemStack) { 27 | return isItemConfiguredFor(itemStack, ClientTweaksConfig.getActive().customization.torchTools); 28 | } 29 | 30 | public static boolean isShieldWeapon(ItemStack itemStack) { 31 | return isItemConfiguredFor(itemStack, ClientTweaksConfig.getActive().customization.shieldWeapons); 32 | } 33 | 34 | public static boolean isShieldItem(ItemStack itemStack) { 35 | return isItemConfiguredFor(itemStack, ClientTweaksConfig.getActive().customization.shieldItems); 36 | } 37 | 38 | public static boolean isFireworkItem(ItemStack itemStack) { 39 | return isItemConfiguredFor(itemStack, ClientTweaksConfig.getActive().customization.fireworkItems); 40 | } 41 | 42 | public static boolean isItemConfiguredFor(ItemStack itemStack, List items) { 43 | if (itemStack.isEmpty()) { 44 | return false; 45 | } 46 | 47 | final var registryName = BuiltInRegistries.ITEM.getKey(itemStack.getItem()); 48 | final var itemPasses = items.contains(registryName.toString()); 49 | final var tagPasses = itemStack.getTags().anyMatch(it -> items.contains("#" + it.location())); 50 | return itemPasses || tagPasses; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/ClientTweaksConfigData.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks; 2 | 3 | import com.google.common.collect.Lists; 4 | import net.blay09.mods.balm.api.config.reflection.Comment; 5 | import net.blay09.mods.balm.api.config.reflection.Config; 6 | import net.blay09.mods.balm.api.config.reflection.NestedType; 7 | import net.minecraft.resources.ResourceLocation; 8 | 9 | import java.util.List; 10 | import java.util.Set; 11 | 12 | @Config(ClientTweaks.MOD_ID) 13 | public class ClientTweaksConfigData { 14 | 15 | public Tweaks tweaks = new Tweaks(); 16 | 17 | public Customization customization = new Customization(); 18 | 19 | public static class Tweaks { 20 | @Comment("This option will let you climb ladders automatically by just looking upwards, rather than requiring a key to be held down.") 21 | public boolean autoClimbLadder = false; 22 | 23 | @Comment("This prevents the last torch in the offhand from being placed.") 24 | public boolean doNotUseLastTorch = false; 25 | 26 | @Comment("This option will hide your offhand item. It can be toggled via an optional key binding.") 27 | public boolean hideOffhandItem = false; 28 | 29 | @Comment("This option will hide your own potion particle effects for your client (other players will still see them).") 30 | public boolean hideOwnParticleEffects = false; 31 | 32 | @Comment("This option will hide your shield unless you are holding a weapon.") 33 | public boolean hideShieldUnlessHoldingWeapon = true; 34 | 35 | @Comment("This prevents torches from being placed from your offhand at all.") 36 | public boolean noOffhandTorchAtAll = false; 37 | 38 | @Comment("This prevents torches from being placed from your offhand if you have a block in your main hand.") 39 | public boolean noOffhandTorchWithBlock = true; 40 | 41 | @Comment("This prevents torches from being placed from your offhand if you have food in your main hand.") 42 | public boolean noOffhandTorchWithFood = true; 43 | 44 | @Comment("This prevents torches from being placed from your off hand if you have an empty main hand.") 45 | public boolean noOffhandTorchWithEmptyHand = false; 46 | 47 | @Comment("This restricts torches to be placed from the offhand only when you're holding a tool in your main hand.") 48 | public boolean offhandTorchWithToolOnly = false; 49 | 50 | @Comment("This prevents fireworks from being launched from your off hand if you are wearing an Elytra, unless you're flying.") 51 | public boolean noOffhandFireworksWithElytra = true; 52 | 53 | @Comment("This option will disable step assist added by other mods.") 54 | public boolean disableStepAssist = false; 55 | 56 | @Comment("This option will disable log stripping.") 57 | public boolean disableLogStripping = false; 58 | 59 | @Comment("This option will disable paving when holding a block in your offhand.") 60 | public boolean disablePavingWithBlockInOffhand = true; 61 | 62 | @Comment("This adds back the master volume slider to the options screen. Saves you a click!") 63 | public boolean masterVolumeSlider = true; 64 | 65 | @Comment("This adds back the music volume slider to the options screen. Saves you a click!") 66 | public boolean musicVolumeSlider = true; 67 | 68 | @Comment("This option will make iron fences and glass panes have a bigger hitbox while placing them, making it easier to aim.") 69 | public boolean paneBuildingSupport = true; 70 | 71 | @Comment("This option will make chains have a bigger hitbox while placing them, making it easier to aim.") 72 | public boolean chainBuildingSupport = true; 73 | 74 | @Comment("This option makes the recipe book not shift the inventory when opened. Works best with smaller GUI scales / bigger resolutions.") 75 | public boolean noRecipeBookShifting = false; 76 | 77 | @Comment("Prevents accidental mining of certain fragile blocks like budding amethysts.") 78 | public boolean preventAccidentalMining = false; 79 | 80 | @Comment("This option will increase the hitbox of random-offset blocks in creative mode, making it easier to break them quickly.") 81 | public boolean creativeBreakingSupport = true; 82 | } 83 | 84 | public static class Customization { 85 | @Comment("Items that count as torches for the offhand-torch tweak options.") 86 | @NestedType(String.class) 87 | public List torchItems = Lists.newArrayList( 88 | "minecraft:torch", 89 | "minecraft:soul_torch", 90 | "tconstruct:stone_torch" 91 | ); 92 | 93 | @Comment("Items that are allowed to place torches from the offhand if offhandTorchWithToolOnly is enabled.") 94 | @NestedType(String.class) 95 | public List torchTools = Lists.newArrayList( 96 | "minecraft:wooden_pickaxe", 97 | "minecraft:stone_pickaxe", 98 | "minecraft:iron_pickaxe", 99 | "minecraft:golden_pickaxe", 100 | "minecraft:diamond_pickaxe", 101 | "minecraft:netherite_pickaxe", 102 | "tconstruct:pickaxe", 103 | "tconstruct:hammer" 104 | ); 105 | 106 | @Comment("Items that count as weapons for the offhand-shield hiding tweak options.") 107 | @NestedType(String.class) 108 | public List shieldWeapons = Lists.newArrayList( 109 | "tetra:modular_sword" 110 | ); 111 | 112 | @Comment("Items that count as shields for the offhand-shield hiding tweak options.") 113 | @NestedType(String.class) 114 | public List shieldItems = Lists.newArrayList( 115 | "basicshields:wooden_shield", 116 | "basicshields:golden_shield", 117 | "basicshields:diamond_shield", 118 | "basicshields:netherite_shield" 119 | ); 120 | 121 | @Comment("Items that count as fireworks for the offhand-firework tweak options.") 122 | @NestedType(String.class) 123 | public List fireworkItems = Lists.newArrayList( 124 | "minecraft:firework_rocket" 125 | ); 126 | 127 | @Comment("Blocks that should be protected in the prevent accidental mining tweak.") 128 | @NestedType(ResourceLocation.class) 129 | public Set fragileBlocks = Set.of( 130 | ResourceLocation.withDefaultNamespace("budding_amethyst"), 131 | ResourceLocation.withDefaultNamespace("small_amethyst_bud"), 132 | ResourceLocation.withDefaultNamespace("medium_amethyst_bud"), 133 | ResourceLocation.withDefaultNamespace("large_amethyst_bud") 134 | ); 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/ModKeyMappings.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks; 2 | 3 | import net.blay09.mods.clienttweaks.tweak.AbstractClientTweak; 4 | import net.blay09.mods.kuma.api.Kuma; 5 | import net.minecraft.client.Minecraft; 6 | import net.minecraft.network.chat.Component; 7 | 8 | import java.util.Collection; 9 | 10 | import static net.blay09.mods.clienttweaks.ClientTweaks.id; 11 | 12 | public class ModKeyMappings { 13 | 14 | public static void initialize(Collection tweaks) { 15 | for (final var tweak : tweaks) { 16 | if (tweak.hasKeyBinding()) { 17 | Kuma.createKeyMapping(id(tweak.getName())) 18 | .handleWorldInput(event -> { 19 | toggleTweak(tweak); 20 | return true; 21 | }) 22 | .build(); 23 | } 24 | } 25 | } 26 | 27 | private static void toggleTweak(AbstractClientTweak tweak) { 28 | tweak.setEnabled(!tweak.isEnabled()); 29 | 30 | final var player = Minecraft.getInstance().player; 31 | if (player != null) { 32 | final var component = Component.translatable("clienttweaks." + tweak.getName(), 33 | Component.translatable(tweak.isEnabled() ? "chat.clienttweaks.on" : "chat.clienttweaks.off")); 34 | player.displayClientMessage(component, true); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/AxeItemAccessor.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.minecraft.world.item.AxeItem; 4 | import net.minecraft.world.level.block.state.BlockState; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Invoker; 7 | 8 | import java.util.Optional; 9 | 10 | @Mixin(AxeItem.class) 11 | public interface AxeItemAccessor { 12 | 13 | @Invoker 14 | Optional callGetStripped(BlockState state); 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/BlockStateBaseMixin.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 4 | import net.minecraft.client.Minecraft; 5 | import net.minecraft.core.BlockPos; 6 | import net.minecraft.world.level.BlockGetter; 7 | import net.minecraft.world.level.block.state.BlockBehaviour; 8 | import net.minecraft.world.level.block.state.BlockState; 9 | import net.minecraft.world.phys.AABB; 10 | import net.minecraft.world.phys.shapes.CollisionContext; 11 | import net.minecraft.world.phys.shapes.Shapes; 12 | import net.minecraft.world.phys.shapes.VoxelShape; 13 | import org.spongepowered.asm.mixin.Mixin; 14 | import org.spongepowered.asm.mixin.injection.At; 15 | import org.spongepowered.asm.mixin.injection.Inject; 16 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 17 | 18 | @Mixin(BlockBehaviour.BlockStateBase.class) 19 | public class BlockStateBaseMixin { 20 | @SuppressWarnings("UnreachableCode") 21 | @Inject(method = "getShape(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/shapes/CollisionContext;)Lnet/minecraft/world/phys/shapes/VoxelShape;", at = @At("RETURN"), cancellable = true) 22 | void getShape(BlockGetter level, BlockPos pos, CollisionContext context, CallbackInfoReturnable callbackInfo) { 23 | @SuppressWarnings("DataFlowIssue") final var state = (BlockState) (Object) this; 24 | final var minecraft = Minecraft.getInstance(); 25 | final var player = minecraft != null ? minecraft.player : null; 26 | final var isCreative = player != null && player.getAbilities().instabuild; 27 | if (isCreative && ClientTweaksConfig.getActive().tweaks.creativeBreakingSupport && state.hasOffsetFunction()) { 28 | final var originalShape = callbackInfo.getReturnValue(); 29 | final var modifiedShape = Shapes.create(originalShape.bounds() 30 | .expandTowards(-1, 0, -1) 31 | .expandTowards(1, 0, 1) 32 | .intersect(new AABB(0, 0, 0, 1, 1, 1)) 33 | ); 34 | callbackInfo.setReturnValue(modifiedShape); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/ChainBlockMixin.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 4 | import net.minecraft.client.Minecraft; 5 | import net.minecraft.core.BlockPos; 6 | import net.minecraft.world.entity.player.Player; 7 | import net.minecraft.world.level.BlockGetter; 8 | import net.minecraft.world.level.block.Block; 9 | import net.minecraft.world.level.block.ChainBlock; 10 | import net.minecraft.world.level.block.CrossCollisionBlock; 11 | import net.minecraft.world.level.block.state.BlockState; 12 | import net.minecraft.world.phys.AABB; 13 | import net.minecraft.world.phys.shapes.CollisionContext; 14 | import net.minecraft.world.phys.shapes.Shapes; 15 | import net.minecraft.world.phys.shapes.VoxelShape; 16 | import org.spongepowered.asm.mixin.Mixin; 17 | import org.spongepowered.asm.mixin.injection.At; 18 | import org.spongepowered.asm.mixin.injection.Inject; 19 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 20 | 21 | @Mixin(ChainBlock.class) 22 | public class ChainBlockMixin { 23 | 24 | @Inject(method = "getShape(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/shapes/CollisionContext;)Lnet/minecraft/world/phys/shapes/VoxelShape;", at = @At("RETURN"), cancellable = true) 25 | void getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context, CallbackInfoReturnable callbackInfo) { 26 | final var minecraft = Minecraft.getInstance(); 27 | @SuppressWarnings("ConstantValue") final var player = minecraft != null ? minecraft.player : null; 28 | final var isHoldingChainBlock = player != null && Block.byItem(player.getMainHandItem().getItem()) instanceof ChainBlock; 29 | if (isHoldingChainBlock && ClientTweaksConfig.getActive().tweaks.chainBuildingSupport) { 30 | final var originalShape = callbackInfo.getReturnValue(); 31 | final var modifiedShape = Shapes.create(originalShape.bounds() 32 | .expandTowards(0.25, 0.25, 0.25) 33 | .expandTowards(-0.25, -0.25, -0.25) 34 | .intersect(new AABB(0, 0, 0, 1, 1, 1)) 35 | ); 36 | callbackInfo.setReturnValue(modifiedShape); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/CrossCollisionBlockMixin.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 4 | import net.minecraft.client.Minecraft; 5 | import net.minecraft.core.BlockPos; 6 | import net.minecraft.world.entity.player.Player; 7 | import net.minecraft.world.item.BlockItem; 8 | import net.minecraft.world.level.BlockGetter; 9 | import net.minecraft.world.level.block.Block; 10 | import net.minecraft.world.level.block.Blocks; 11 | import net.minecraft.world.level.block.CrossCollisionBlock; 12 | import net.minecraft.world.level.block.state.BlockState; 13 | import net.minecraft.world.phys.AABB; 14 | import net.minecraft.world.phys.shapes.CollisionContext; 15 | import net.minecraft.world.phys.shapes.Shapes; 16 | import net.minecraft.world.phys.shapes.VoxelShape; 17 | import org.spongepowered.asm.mixin.Mixin; 18 | import org.spongepowered.asm.mixin.injection.At; 19 | import org.spongepowered.asm.mixin.injection.Inject; 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 21 | 22 | @Mixin(CrossCollisionBlock.class) 23 | public class CrossCollisionBlockMixin { 24 | 25 | @Inject(method = "getShape(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/shapes/CollisionContext;)Lnet/minecraft/world/phys/shapes/VoxelShape;", at = @At("RETURN"), cancellable = true) 26 | void getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context, CallbackInfoReturnable callbackInfo) { 27 | final var minecraft = Minecraft.getInstance(); 28 | @SuppressWarnings("ConstantValue") final var player = minecraft != null ? minecraft.player : null; 29 | final var isHoldingCrossCollisionBlock = player != null && Block.byItem(player.getMainHandItem().getItem()) instanceof CrossCollisionBlock; 30 | if (isHoldingCrossCollisionBlock && ClientTweaksConfig.getActive().tweaks.paneBuildingSupport) { 31 | // Exit out early if the block does not have the properties we use, to prevent crashes with mods that extend CrossCollisionBlock 32 | if (!state.hasProperty(CrossCollisionBlock.EAST) || !state.hasProperty(CrossCollisionBlock.WEST) || !state.hasProperty(CrossCollisionBlock.NORTH) || !state.hasProperty( 33 | CrossCollisionBlock.SOUTH)) { 34 | return; 35 | } 36 | 37 | final var isPillarSection = !state.getValue(CrossCollisionBlock.EAST) && !state.getValue(CrossCollisionBlock.WEST) && !state.getValue( 38 | CrossCollisionBlock.NORTH) && !state.getValue(CrossCollisionBlock.SOUTH); 39 | final var isThinSection = isOnlyOneTrue(state.getValue(CrossCollisionBlock.EAST), 40 | state.getValue(CrossCollisionBlock.WEST), 41 | state.getValue(CrossCollisionBlock.NORTH), 42 | state.getValue(CrossCollisionBlock.SOUTH)); 43 | if (isThinSection || isPillarSection) { 44 | final var originalShape = callbackInfo.getReturnValue(); 45 | final var modifiedShape = Shapes.create(originalShape.bounds() 46 | .expandTowards(0.25, 0, 0.25) 47 | .expandTowards(-0.25, 0, -0.25) 48 | .intersect(new AABB(0, 0, 0, 1, 1, 1)) 49 | ); 50 | callbackInfo.setReturnValue(modifiedShape); 51 | } 52 | } 53 | } 54 | 55 | private static boolean isOnlyOneTrue(boolean... args) { 56 | int trues = 0; 57 | for (boolean arg : args) { 58 | if (arg) { 59 | trues++; 60 | } 61 | } 62 | return trues == 1; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/ItemInHandRendererAccessor.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.minecraft.client.renderer.ItemInHandRenderer; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | @Mixin(ItemInHandRenderer.class) 8 | public interface ItemInHandRendererAccessor { 9 | 10 | @Accessor 11 | void setOOffHandHeight(float oOffHandHeight); 12 | 13 | @Accessor 14 | void setOffHandHeight(float offHandHeight); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/LivingEntityAccessor.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.minecraft.core.particles.ParticleOptions; 4 | import net.minecraft.network.syncher.EntityDataAccessor; 5 | import net.minecraft.world.entity.LivingEntity; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | 9 | import java.util.List; 10 | 11 | @Mixin(LivingEntity.class) 12 | public interface LivingEntityAccessor { 13 | 14 | @Accessor("DATA_EFFECT_AMBIENCE_ID") 15 | static EntityDataAccessor getDataEffectAmbienceId() { 16 | throw new AssertionError(); 17 | } 18 | 19 | @Accessor("DATA_EFFECT_PARTICLES") 20 | static EntityDataAccessor> getDataEffectParticles() { 21 | throw new AssertionError(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/LivingEntityMixin.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 5 | import net.minecraft.world.entity.ai.attributes.Attributes; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import net.minecraft.world.entity.LivingEntity; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | 12 | @Mixin(LivingEntity.class) 13 | public class LivingEntityMixin { 14 | 15 | @SuppressWarnings("DataFlowIssue") 16 | @Inject(method = "maxUpStep", at = @At("RETURN"), cancellable = true) 17 | public void maxUpStep(CallbackInfoReturnable cir) { 18 | final var config = Balm.getConfig().getActiveConfig(ClientTweaksConfigData.class); 19 | if (config != null && config.tweaks.disableStepAssist) { 20 | final var baseMaxStep = ((LivingEntity) (Object) this).getAttributeBaseValue(Attributes.STEP_HEIGHT); 21 | final var modifiedMaxStep = cir.getReturnValue(); 22 | cir.setReturnValue((float) Math.min(baseMaxStep, modifiedMaxStep)); 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/RecipeBookComponentMixin.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 4 | import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.Shadow; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | 12 | @Mixin(RecipeBookComponent.class) 13 | public class RecipeBookComponentMixin { 14 | 15 | @Shadow 16 | private int xOffset; 17 | 18 | @Shadow 19 | private boolean widthTooNarrow; 20 | 21 | @Inject(method = "initVisuals()V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/screens/recipebook/RecipeBookComponent;xOffset:I", shift = At.Shift.AFTER)) 22 | void initVisuals(CallbackInfo callbackInfo) { 23 | if (ClientTweaksConfig.getActive().tweaks.noRecipeBookShifting) { 24 | widthTooNarrow = true; 25 | xOffset = 162; 26 | } 27 | } 28 | 29 | @Inject(method = "isOffsetNextToMainGUI()Z", at = @At("HEAD"), cancellable = true) 30 | void isOffsetNextToMainGUI(CallbackInfoReturnable callbackInfo) { 31 | if (ClientTweaksConfig.getActive().tweaks.noRecipeBookShifting) { 32 | callbackInfo.setReturnValue(true); // we pretend like we're not shifted to prevent the recipe book from being closed 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/mixin/ShovelItemMixin.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.mixin; 2 | 3 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 4 | import net.minecraft.world.InteractionHand; 5 | import net.minecraft.world.InteractionResult; 6 | import net.minecraft.world.item.BlockItem; 7 | import net.minecraft.world.item.ShovelItem; 8 | import net.minecraft.world.item.context.UseOnContext; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 13 | 14 | @Mixin(ShovelItem.class) 15 | public class ShovelItemMixin { 16 | @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) 17 | public void useOn(UseOnContext context, CallbackInfoReturnable cir) { 18 | final var player = context.getPlayer(); 19 | if (player == null) { 20 | return; 21 | } 22 | 23 | final var offhandItem = player.getItemInHand(InteractionHand.OFF_HAND); 24 | if (offhandItem.getItem() instanceof BlockItem) { 25 | if (ClientTweaksConfig.getActive().tweaks.disablePavingWithBlockInOffhand) { 26 | cir.setReturnValue(InteractionResult.PASS); 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/AbstractClientTweak.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | public abstract class AbstractClientTweak { 4 | private final String name; 5 | 6 | public AbstractClientTweak(String name) { 7 | this.name = name; 8 | } 9 | 10 | public abstract boolean isEnabled(); 11 | 12 | public abstract void setEnabled(boolean enabled); 13 | 14 | public final String getName() { 15 | return name; 16 | } 17 | 18 | public boolean hasKeyBinding() { 19 | return false; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/AdditionalVolumeSlider.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.client.BalmClient; 5 | import net.blay09.mods.balm.api.event.client.screen.ScreenInitEvent; 6 | import net.blay09.mods.balm.mixin.ScreenAccessor; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.client.gui.components.AbstractOptionSliderButton; 9 | import net.minecraft.client.gui.components.AbstractWidget; 10 | import net.minecraft.client.gui.components.events.GuiEventListener; 11 | import net.minecraft.client.gui.screens.options.OptionsScreen; 12 | import net.minecraft.sounds.SoundSource; 13 | 14 | public abstract class AdditionalVolumeSlider extends AbstractClientTweak { 15 | 16 | private final SoundSource soundSource; 17 | private final int column; 18 | 19 | private AbstractWidget lastSlider; 20 | 21 | public AdditionalVolumeSlider(String name, SoundSource soundSource, int column) { 22 | super(name); 23 | this.soundSource = soundSource; 24 | this.column = column; 25 | 26 | Balm.getEvents().onEvent(ScreenInitEvent.Post.class, this::onInitGui); 27 | } 28 | 29 | public void onInitGui(ScreenInitEvent.Post event) { 30 | if (event.getScreen() instanceof OptionsScreen && isEnabled()) { 31 | int x = 0; 32 | int y = 0; 33 | final var offsetX = column == 0 ? 0 : 160; 34 | // Find the FOV slider on the original options screen... 35 | 36 | if (lastSlider != null) { 37 | final var accessor = (ScreenAccessor) event.getScreen(); 38 | accessor.balm_getChildren().removeIf(widget -> widget == lastSlider); 39 | accessor.balm_getRenderables().removeIf(widget -> widget == lastSlider); 40 | accessor.balm_getNarratables().removeIf(widget -> widget == lastSlider); 41 | } 42 | 43 | for (GuiEventListener widget : ((ScreenAccessor) event.getScreen()).balm_getChildren()) { 44 | if (widget instanceof AbstractOptionSliderButton slider) { 45 | x = slider.getX(); 46 | y = slider.getY(); 47 | break; 48 | } 49 | } 50 | 51 | final var options = Minecraft.getInstance().options; 52 | final var option = options.getSoundSourceOptionInstance(soundSource); 53 | lastSlider = option.createButton(options, x + offsetX, y + 27, 150); 54 | BalmClient.getScreens().addRenderableWidget(event.getScreen(), lastSlider); 55 | } 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/AutoClimbLadder.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.TickPhase; 5 | import net.blay09.mods.balm.api.event.TickType; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 7 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 8 | import net.minecraft.client.Minecraft; 9 | import net.minecraft.world.phys.Vec3; 10 | 11 | public class AutoClimbLadder extends AbstractClientTweak { 12 | 13 | public AutoClimbLadder() { 14 | super("auto_climb_ladder"); 15 | 16 | Balm.getEvents().onTickEvent(TickType.Client, TickPhase.Start, this::onPlayerTick); 17 | } 18 | 19 | public void onPlayerTick(Minecraft client) { 20 | final var player = client.player; 21 | if (player != null && isEnabled()) { 22 | if (player.onClimbable() && !player.isSuppressingSlidingDownLadder() && player.getXRot() <= -50f) { 23 | player.resetFallDistance(); 24 | Vec3 motion = player.getDeltaMovement(); 25 | player.setDeltaMovement(motion.x, player.getSpeed(), motion.z); 26 | } 27 | } 28 | } 29 | 30 | @Override 31 | public boolean isEnabled() { 32 | return ClientTweaksConfig.getActive().tweaks.autoClimbLadder; 33 | } 34 | 35 | @Override 36 | public void setEnabled(boolean enabled) { 37 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.autoClimbLadder = enabled); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/DisableLogStripping.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.blay09.mods.clienttweaks.mixin.AxeItemAccessor; 8 | import net.minecraft.client.Minecraft; 9 | import net.minecraft.world.item.ItemStack; 10 | import net.minecraft.world.phys.BlockHitResult; 11 | import net.minecraft.world.phys.HitResult; 12 | 13 | public class DisableLogStripping extends AbstractClientTweak { 14 | 15 | public DisableLogStripping() { 16 | super("disable_log_stripping"); 17 | 18 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 19 | } 20 | 21 | public void onRightClick(UseItemInputEvent event) { 22 | if (isEnabled()) { 23 | final var client = Minecraft.getInstance(); 24 | if (client.level == null || client.hitResult == null || client.hitResult.getType() != HitResult.Type.BLOCK) { 25 | return; 26 | } 27 | 28 | final var blockHitResult = (BlockHitResult) client.hitResult; 29 | final var targetState = client.level.getBlockState(blockHitResult.getBlockPos()); 30 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 31 | if (!heldItem.isEmpty() && heldItem.getItem() instanceof AxeItemAccessor axeItem && axeItem.callGetStripped(targetState).isPresent()) { 32 | event.setCanceled(true); 33 | } 34 | } 35 | } 36 | 37 | @Override 38 | public boolean isEnabled() { 39 | return ClientTweaksConfig.getActive().tweaks.disableLogStripping; 40 | } 41 | 42 | @Override 43 | public void setEnabled(boolean enabled) { 44 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.disableLogStripping = enabled); 45 | } 46 | 47 | @Override 48 | public boolean hasKeyBinding() { 49 | return true; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/DoNotUseLastTorch.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.ChatFormatting; 8 | import net.minecraft.client.Minecraft; 9 | import net.minecraft.network.chat.Component; 10 | import net.minecraft.world.InteractionHand; 11 | import net.minecraft.world.item.ItemStack; 12 | 13 | public class DoNotUseLastTorch extends AbstractClientTweak { 14 | 15 | public DoNotUseLastTorch() { 16 | super("do_not_use_last_torch"); 17 | 18 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 19 | } 20 | 21 | public void onRightClick(UseItemInputEvent event) { 22 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 23 | final var client = Minecraft.getInstance(); 24 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 25 | if (ClientTweaksConfig.isTorchItem(heldItem)) { 26 | if (heldItem.getCount() == 1) { 27 | final var chatComponent = Component.translatable("chat.clienttweaks.lastTorch"); 28 | chatComponent.withStyle(ChatFormatting.RED); 29 | client.player.displayClientMessage(chatComponent, true); 30 | event.setCanceled(true); 31 | } 32 | } 33 | } 34 | } 35 | 36 | @Override 37 | public boolean isEnabled() { 38 | return ClientTweaksConfig.getActive().tweaks.doNotUseLastTorch; 39 | } 40 | 41 | @Override 42 | public void setEnabled(boolean enabled) { 43 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.doNotUseLastTorch = enabled); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/HideOffhandItem.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.EventPriority; 5 | import net.blay09.mods.balm.api.event.client.RenderHandEvent; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 7 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 8 | import net.minecraft.world.InteractionHand; 9 | 10 | public class HideOffhandItem extends AbstractClientTweak { 11 | 12 | public HideOffhandItem() { 13 | super("hide_offhand_item"); 14 | 15 | Balm.getEvents().onEvent(RenderHandEvent.class, this::onRenderHand, EventPriority.Highest); 16 | } 17 | 18 | public void onRenderHand(RenderHandEvent event) { 19 | if (isEnabled()) { 20 | // TODO Tinkers inverts this event by rendering manually with its dual harvesting, come up with a solution 21 | if (event.getHand() == InteractionHand.OFF_HAND) { 22 | if (event.getSwingProgress() <= 0f) { 23 | event.setCanceled(true); 24 | } 25 | } 26 | } 27 | } 28 | 29 | @Override 30 | public boolean hasKeyBinding() { 31 | return true; 32 | } 33 | 34 | @Override 35 | public boolean isEnabled() { 36 | return ClientTweaksConfig.getActive().tweaks.hideOffhandItem; 37 | } 38 | 39 | @Override 40 | public void setEnabled(boolean enabled) { 41 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.hideOffhandItem = enabled); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/HideOwnEffectParticles.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.TickPhase; 5 | import net.blay09.mods.balm.api.event.TickType; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 7 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 8 | import net.blay09.mods.clienttweaks.mixin.LivingEntityAccessor; 9 | import net.minecraft.client.Minecraft; 10 | 11 | import java.util.Collections; 12 | 13 | public class HideOwnEffectParticles extends AbstractClientTweak { 14 | 15 | public HideOwnEffectParticles() { 16 | super("hide_own_particle_effects"); 17 | 18 | Balm.getEvents().onTickEvent(TickType.Client, TickPhase.End, this::onClientTick); 19 | } 20 | 21 | public void onClientTick(Minecraft client) { 22 | final var player = client.player; 23 | if (player != null && isEnabled()) { 24 | player.getEntityData().set(LivingEntityAccessor.getDataEffectAmbienceId(), true); 25 | player.getEntityData().set(LivingEntityAccessor.getDataEffectParticles(), Collections.emptyList()); 26 | } 27 | } 28 | 29 | @Override 30 | public boolean isEnabled() { 31 | return ClientTweaksConfig.getActive().tweaks.hideOwnParticleEffects; 32 | } 33 | 34 | @Override 35 | public void setEnabled(boolean enabled) { 36 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.hideOwnParticleEffects = enabled); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/HideShieldUnlessHoldingWeapon.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.EventPriority; 5 | import net.blay09.mods.balm.api.event.client.RenderHandEvent; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 7 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 8 | import net.blay09.mods.clienttweaks.mixin.ItemInHandRendererAccessor; 9 | import net.minecraft.client.Minecraft; 10 | import net.minecraft.client.renderer.ItemInHandRenderer; 11 | import net.minecraft.core.component.DataComponents; 12 | import net.minecraft.world.InteractionHand; 13 | import net.minecraft.world.entity.player.Player; 14 | import net.minecraft.world.item.AxeItem; 15 | 16 | public class HideShieldUnlessHoldingWeapon extends AbstractClientTweak { 17 | 18 | private boolean wasWeaponInHand; 19 | 20 | public HideShieldUnlessHoldingWeapon() { 21 | super("hide_shield_unless_holding_weapon"); 22 | 23 | Balm.getEvents().onEvent(RenderHandEvent.class, this::onRenderHand, EventPriority.Highest); 24 | } 25 | 26 | public void onRenderHand(RenderHandEvent event) { 27 | if (!isEnabled() || event.getHand() != InteractionHand.OFF_HAND) { 28 | return; 29 | } 30 | 31 | final var player = Minecraft.getInstance().player; 32 | if (player == null) { 33 | return; 34 | } 35 | 36 | final var isShield = event.getItemStack().get(DataComponents.BLOCKS_ATTACKS) != null || ClientTweaksConfig.isShieldItem(event.getItemStack()); 37 | if (!isShield) { 38 | return; 39 | } 40 | 41 | final var isBlocking = player.getUsedItemHand() == InteractionHand.OFF_HAND && player.isBlocking(); 42 | final var weaponInHand = hasWeaponInHand(player); 43 | if (!weaponInHand && !isBlocking) { 44 | event.setCanceled(true); 45 | } else if (weaponInHand && !wasWeaponInHand) { 46 | ItemInHandRenderer itemInHandRenderer = Minecraft.getInstance().getEntityRenderDispatcher().getItemInHandRenderer(); 47 | if (itemInHandRenderer instanceof ItemInHandRendererAccessor accessor) { 48 | accessor.setOOffHandHeight(0f); 49 | accessor.setOffHandHeight(0f); 50 | } 51 | event.setCanceled(true); // we skip the first frame so the offset can update since this event fires after tick() 52 | } 53 | wasWeaponInHand = weaponInHand; 54 | } 55 | 56 | private boolean hasWeaponInHand(Player player) { 57 | final var mainItem = player.getItemInHand(InteractionHand.MAIN_HAND); 58 | final var weaponComponent = player.get(DataComponents.WEAPON); 59 | if (weaponComponent != null || mainItem.getItem() instanceof AxeItem) { 60 | return true; 61 | } 62 | 63 | return ClientTweaksConfig.isShieldWeapon(mainItem); 64 | } 65 | 66 | @Override 67 | public boolean isEnabled() { 68 | return ClientTweaksConfig.getActive().tweaks.hideShieldUnlessHoldingWeapon; 69 | } 70 | 71 | @Override 72 | public void setEnabled(boolean enabled) { 73 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.hideShieldUnlessHoldingWeapon = enabled); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/NoOffhandFireworksWithElytra.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.world.InteractionHand; 9 | import net.minecraft.world.entity.EquipmentSlot; 10 | import net.minecraft.world.item.Items; 11 | import net.minecraft.world.phys.HitResult; 12 | 13 | public class NoOffhandFireworksWithElytra extends AbstractClientTweak { 14 | 15 | public NoOffhandFireworksWithElytra() { 16 | super("no_offhand_fireworks_with_elytra"); 17 | 18 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 19 | } 20 | 21 | public void onRightClick(UseItemInputEvent event) { 22 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 23 | final var client = Minecraft.getInstance(); 24 | final var player = client.player; 25 | if (client.level == null || player == null || client.hitResult == null || client.hitResult.getType() != HitResult.Type.BLOCK) { 26 | return; 27 | } 28 | 29 | final var heldItem = player.getItemInHand(event.getHand()); 30 | if (ClientTweaksConfig.isFireworkItem(heldItem)) { 31 | final var wornChestItem = player.getItemBySlot(EquipmentSlot.CHEST); 32 | if (wornChestItem.is(Items.ELYTRA) && !player.isFallFlying()) { 33 | event.setCanceled(true); 34 | } 35 | } 36 | } 37 | } 38 | 39 | @Override 40 | public boolean isEnabled() { 41 | return ClientTweaksConfig.getActive().tweaks.noOffhandFireworksWithElytra; 42 | } 43 | 44 | @Override 45 | public void setEnabled(boolean enabled) { 46 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.noOffhandFireworksWithElytra = enabled); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/NoOffhandTorchAtAll.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.world.InteractionHand; 9 | import net.minecraft.world.item.ItemStack; 10 | 11 | public class NoOffhandTorchAtAll extends AbstractClientTweak { 12 | 13 | public NoOffhandTorchAtAll() { 14 | super("no_offhand_torch_at_all"); 15 | 16 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 17 | } 18 | 19 | public void onRightClick(UseItemInputEvent event) { 20 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 21 | final var client = Minecraft.getInstance(); 22 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 23 | if (ClientTweaksConfig.isTorchItem(heldItem)) { 24 | event.setCanceled(true); 25 | } 26 | } 27 | } 28 | 29 | @Override 30 | public boolean isEnabled() { 31 | return ClientTweaksConfig.getActive().tweaks.noOffhandTorchAtAll; 32 | } 33 | 34 | @Override 35 | public void setEnabled(boolean enabled) { 36 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.noOffhandTorchAtAll = enabled); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/NoOffhandTorchWithBlock.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.world.InteractionHand; 9 | import net.minecraft.world.item.BlockItem; 10 | import net.minecraft.world.item.ItemStack; 11 | 12 | public class NoOffhandTorchWithBlock extends AbstractClientTweak { 13 | 14 | public NoOffhandTorchWithBlock() { 15 | super("no_offhand_torch_with_block"); 16 | 17 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 18 | } 19 | 20 | public void onRightClick(UseItemInputEvent event) { 21 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 22 | final var client = Minecraft.getInstance(); 23 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 24 | if (ClientTweaksConfig.isTorchItem(heldItem)) { 25 | final var mainItem = client.player.getMainHandItem(); 26 | if (!mainItem.isEmpty() && mainItem.getItem() instanceof BlockItem) { 27 | event.setCanceled(true); 28 | } 29 | } 30 | } 31 | } 32 | 33 | @Override 34 | public boolean isEnabled() { 35 | return ClientTweaksConfig.getActive().tweaks.noOffhandTorchWithBlock; 36 | } 37 | 38 | @Override 39 | public void setEnabled(boolean enabled) { 40 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.noOffhandTorchWithBlock = enabled); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/NoOffhandTorchWithEmptyHand.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.world.InteractionHand; 9 | import net.minecraft.world.item.ItemStack; 10 | 11 | public class NoOffhandTorchWithEmptyHand extends AbstractClientTweak { 12 | 13 | public NoOffhandTorchWithEmptyHand() { 14 | super("no_offhand_torch_with_empty_hand"); 15 | 16 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 17 | } 18 | 19 | public void onRightClick(UseItemInputEvent event) { 20 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 21 | final var client = Minecraft.getInstance(); 22 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 23 | if (ClientTweaksConfig.isTorchItem(heldItem)) { 24 | final var mainItem = client.player.getMainHandItem(); 25 | if (mainItem.isEmpty()) { 26 | event.setCanceled(true); 27 | } 28 | } 29 | } 30 | } 31 | 32 | @Override 33 | public boolean isEnabled() { 34 | return ClientTweaksConfig.getActive().tweaks.noOffhandTorchWithEmptyHand; 35 | } 36 | 37 | @Override 38 | public void setEnabled(boolean enabled) { 39 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.noOffhandTorchWithEmptyHand = enabled); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/NoOffhandTorchWithFood.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.core.component.DataComponents; 9 | import net.minecraft.world.InteractionHand; 10 | import net.minecraft.world.item.ItemStack; 11 | 12 | public class NoOffhandTorchWithFood extends AbstractClientTweak { 13 | 14 | public NoOffhandTorchWithFood() { 15 | super("no_offhand_torch_with_food"); 16 | 17 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 18 | } 19 | 20 | public void onRightClick(UseItemInputEvent event) { 21 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 22 | final var client = Minecraft.getInstance(); 23 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 24 | if (ClientTweaksConfig.isTorchItem(heldItem)) { 25 | final var mainItem = client.player.getMainHandItem(); 26 | if (!mainItem.isEmpty() && mainItem.has(DataComponents.FOOD)) { 27 | event.setCanceled(true); 28 | } 29 | } 30 | } 31 | } 32 | 33 | @Override 34 | public boolean isEnabled() { 35 | return ClientTweaksConfig.getActive().tweaks.noOffhandTorchWithFood; 36 | } 37 | 38 | @Override 39 | public void setEnabled(boolean enabled) { 40 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.noOffhandTorchWithFood = enabled); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/OffhandTorchWithToolOnly.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.client.UseItemInputEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.client.Minecraft; 8 | import net.minecraft.world.InteractionHand; 9 | import net.minecraft.world.item.ItemStack; 10 | 11 | public class OffhandTorchWithToolOnly extends AbstractClientTweak { 12 | 13 | public OffhandTorchWithToolOnly() { 14 | super("offhand_torch_with_tool_only"); 15 | 16 | Balm.getEvents().onEvent(UseItemInputEvent.class, this::onRightClick); 17 | } 18 | 19 | public void onRightClick(UseItemInputEvent event) { 20 | if (isEnabled() && event.getHand() == InteractionHand.OFF_HAND) { 21 | final var client = Minecraft.getInstance(); 22 | final var heldItem = client.player != null ? client.player.getItemInHand(event.getHand()) : ItemStack.EMPTY; 23 | if (ClientTweaksConfig.isTorchItem(heldItem)) { 24 | final var mainItem = client.player.getMainHandItem(); 25 | if (!ClientTweaksConfig.isTorchTool(mainItem)) { 26 | event.setCanceled(true); 27 | } 28 | } 29 | } 30 | } 31 | 32 | @Override 33 | public boolean isEnabled() { 34 | return ClientTweaksConfig.getActive().tweaks.offhandTorchWithToolOnly; 35 | } 36 | 37 | @Override 38 | public void setEnabled(boolean enabled) { 39 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.offhandTorchWithToolOnly = enabled); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/PreventAccidentalMining.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.event.DigSpeedEvent; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 6 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 7 | import net.minecraft.core.registries.BuiltInRegistries; 8 | 9 | public class PreventAccidentalMining extends AbstractClientTweak { 10 | public PreventAccidentalMining() { 11 | super("prevent_accidental_mining"); 12 | 13 | Balm.getEvents().onEvent(DigSpeedEvent.class, this::onDigSpeed); 14 | } 15 | 16 | public void onDigSpeed(DigSpeedEvent event) { 17 | if (isEnabled() && !event.getPlayer().isShiftKeyDown()) { 18 | final var blockId = BuiltInRegistries.BLOCK.getKey(event.getState().getBlock()); 19 | final var fragileBlockIds = ClientTweaksConfig.getActive().customization.fragileBlocks; 20 | if (fragileBlockIds.contains(blockId)) { 21 | event.setSpeedOverride(0f); 22 | event.setCanceled(true); 23 | } 24 | } 25 | } 26 | 27 | @Override 28 | public boolean isEnabled() { 29 | return ClientTweaksConfig.getActive().tweaks.preventAccidentalMining; 30 | } 31 | 32 | @Override 33 | public void setEnabled(boolean enabled) { 34 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.preventAccidentalMining = enabled); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/java/net/blay09/mods/clienttweaks/tweak/StepAssistIsAnnoying.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.tweak; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.clienttweaks.ClientTweaksConfig; 5 | import net.blay09.mods.clienttweaks.ClientTweaksConfigData; 6 | 7 | public class StepAssistIsAnnoying extends AbstractClientTweak { 8 | 9 | public StepAssistIsAnnoying() { 10 | super("disable_step_assist"); 11 | } 12 | 13 | @Override 14 | public boolean isEnabled() { 15 | return ClientTweaksConfig.getActive().tweaks.disableStepAssist; 16 | } 17 | 18 | @Override 19 | public void setEnabled(boolean enabled) { 20 | Balm.getConfig().updateLocalConfig(ClientTweaksConfigData.class, it -> it.tweaks.disableStepAssist = enabled); 21 | } 22 | 23 | @Override 24 | public boolean hasKeyBinding() { 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/de_de.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "Schrittassistent Ein/Aus", 3 | "key.clienttweaks.hide_offhand_item": "Nebenhand-Item verstecken", 4 | "key.categories.clienttweaks": "Client Tweaks", 5 | "chat.clienttweaks.on": "AN", 6 | "chat.clienttweaks.off": "AUS" 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "Toggle Disable Step Assist", 3 | "key.clienttweaks.disable_log_stripping": "Toggle Log Stripping", 4 | "key.clienttweaks.hide_offhand_item": "Toggle Hide Offhand Item", 5 | "key.categories.clienttweaks": "Client Tweaks", 6 | "chat.clienttweaks.on": "ON", 7 | "chat.clienttweaks.off": "OFF", 8 | "chat.clienttweaks.lastTorch": "Out of Torches", 9 | "clienttweaks.hideOffhandItem": "Hide Offhand Item: %s", 10 | "clienttweaks.disableStepAssist": "Disable Step Assist: %s", 11 | "clienttweaks.disableLogStripping": "Disable Log Stripping: %s", 12 | "clienttweaks.configuration.title": "Client Tweaks", 13 | "clienttweaks.configuration.tweaks": "Tweaks", 14 | "clienttweaks.configuration.tweaks.autoClimbLadder": "Auto Climb Ladder", 15 | "clienttweaks.configuration.tweaks.autoClimbLadder.tooltip": "This option will let you climb ladders automatically by just looking upwards, rather than requiring a key to be held down.", 16 | "clienttweaks.configuration.tweaks.doNotUseLastTorch": "Do Not Use Last Torch", 17 | "clienttweaks.configuration.tweaks.doNotUseLastTorch.tooltip": "This prevents the last torch in the offhand from being placed.", 18 | "clienttweaks.configuration.tweaks.hideOffhandItem": "Hide Offhand Item", 19 | "clienttweaks.configuration.tweaks.hideOffhandItem.tooltip": "This option will hide your offhand item. It can be toggled via an optional key binding.", 20 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects": "Hide Own Particle Effects", 21 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects.tooltip": "This option will hide your own potion particle effects for your client (other players will still see them).", 22 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon": "Hide Shield Unless Holding Weapon", 23 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon.tooltip": "This option will hide your shield unless you are holding a weapon.", 24 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll": "No Offhand Torch At All", 25 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll.tooltip": "This prevents torches from being placed from your offhand at all.", 26 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock": "No Offhand Torch With Block", 27 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock.tooltip": "This prevents torches from being placed from your offhand if you have a block in your main hand.", 28 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood": "No Offhand Torch With Food", 29 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood.tooltip": "This prevents torches from being placed from your offhand if you have food in your main hand.", 30 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand": "No Offhand Torch With Empty Hand", 31 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand.tooltip": "This prevents torches from being placed from your off hand if you have an empty main hand.", 32 | "clienttweaks.configuration.tweaks.noOffhandFireworksWithElytra": "No Offhand Fireworks With Elytra Unless Airborne", 33 | "clienttweaks.configuration.tweaks.noOffhandFireworksWithElytra.tooltip": "This prevents fireworks from being launched from your off hand if you are wearing an Elytra, unless you're flying.", 34 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly": "Offhand Torch With Tool Only", 35 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly.tooltip": "This restricts torches to be placed from the offhand only when you're holding a tool in your main hand.", 36 | "clienttweaks.configuration.tweaks.disableStepAssist": "Disable Step Assist", 37 | "clienttweaks.configuration.tweaks.disableStepAssist.tooltip": "This option will disable step assist added by other mods.", 38 | "clienttweaks.configuration.tweaks.disableLogStripping": "Disable Log Stripping", 39 | "clienttweaks.configuration.tweaks.disableLogStripping.tooltip": "This option will disable log stripping.", 40 | "clienttweaks.configuration.tweaks.disablePavingWithBlockInOffhand": "Disable Paving with Block in Offhand", 41 | "clienttweaks.configuration.tweaks.disablePavingWithBlockInOffhand.tooltip": "This option will disable paving when holding a block in your offhand.", 42 | "clienttweaks.configuration.tweaks.masterVolumeSlider": "Master Volume Slider", 43 | "clienttweaks.configuration.tweaks.masterVolumeSlider.tooltip": "This adds back the master volume slider to the options screen. Saves you a click!", 44 | "clienttweaks.configuration.tweaks.musicVolumeSlider": "Music Volume Slider", 45 | "clienttweaks.configuration.tweaks.musicVolumeSlider.tooltip": "This adds back the music volume slider to the options screen. Saves you a click!", 46 | "clienttweaks.configuration.tweaks.paneBuildingSupport": "Pane Building Support", 47 | "clienttweaks.configuration.tweaks.paneBuildingSupport.tooltip": "This option will make iron fences and glass panes have a bigger hitbox while placing them, making it easier to aim.", 48 | "clienttweaks.configuration.tweaks.chainBuildingSupport": "Chain Building Support", 49 | "clienttweaks.configuration.tweaks.chainBuildingSupport.tooltip": "This option will make chains have a bigger hitbox while placing them, making it easier to aim.", 50 | "clienttweaks.configuration.tweaks.noRecipeBookShifting": "No Recipe Book Shifting", 51 | "clienttweaks.configuration.tweaks.noRecipeBookShifting.tooltip": "This option makes the recipe book not shift the inventory when opened. Works best with smaller GUI scales / bigger resolutions.", 52 | "clienttweaks.configuration.tweaks.preventAccidentalMining": "Prevent Accidental Mining", 53 | "clienttweaks.configuration.tweaks.preventAccidentalMining.tooltip": "Prevents accidental mining of certain fragile blocks like budding amethysts.", 54 | "clienttweaks.configuration.tweaks.creativeBreakingSupport": "Creative Breaking Support", 55 | "clienttweaks.configuration.tweaks.creativeBreakingSupport.tooltip": "This option will increase the hitbox of random-offset blocks in creative mode, making it easier to break them quickly.", 56 | "clienttweaks.configuration.customization": "Customization", 57 | "clienttweaks.configuration.customization.torchItems": "Torch Items", 58 | "clienttweaks.configuration.customization.torchItems.tooltip": "Items that count as torches for the offhand-torch tweak options.", 59 | "clienttweaks.configuration.customization.torchTools": "Torch Tools", 60 | "clienttweaks.configuration.customization.torchTools.tooltip": "Items that are allowed to place torches from the offhand if offhandTorchWithToolOnly is enabled.", 61 | "clienttweaks.configuration.customization.shieldWeapons": "Shield Weapons", 62 | "clienttweaks.configuration.customization.shieldWeapons.tooltip": "Items that count as weapons for the offhand-shield hiding tweak options.", 63 | "clienttweaks.configuration.customization.shieldItems": "Shield Items", 64 | "clienttweaks.configuration.customization.shieldItems.tooltip": "Items that count as shields for the offhand-shield hiding tweak options.", 65 | "clienttweaks.configuration.customization.fireworkItems": "Firework Items", 66 | "clienttweaks.configuration.customization.fireworkItems.tooltip": "Items that count as fireworks for the offhand-firework tweak options.", 67 | "clienttweaks.configuration.customization.fragileBlocks": "Fragile Blocks", 68 | "clienttweaks.configuration.customization.fragileBlocks.tooltip": "Blocks that should be protected in the prevent accidental mining tweak." 69 | } 70 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/ja_jp.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "ステップアシスト無効化の切り替え", 3 | "key.clienttweaks.hide_offhand_item": "オフハンドアイテム非表示の切り替え", 4 | "key.categories.clienttweaks": "Client Tweaks", 5 | "chat.clienttweaks.on": "オン", 6 | "chat.clienttweaks.off": "オフ", 7 | "chat.clienttweaks.lastTorch": "松明が足りません" 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/ko_kr.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "자동 점프 비활성화", 3 | "key.clienttweaks.hide_offhand_item": "보조 손 아이템 숨기기", 4 | "key.categories.clienttweaks": "클라이언트 수정", 5 | "chat.clienttweaks.on": "켜기", 6 | "chat.clienttweaks.off": "끄기", 7 | "chat.clienttweaks.lastTorch": "횃불 없음", 8 | "clienttweaks.hideOffhandItem": "숨겨진 보조 손 아이템: %s", 9 | "clienttweaks.disableStepAssist": "비활성화된 자동 점프: %s", 10 | "clienttweaks.configuration.title": "클라이언트 트윅스", 11 | "clienttweaks.configuration.tweaks": "트윅스", 12 | "clienttweaks.configuration.tweaks.autoClimbLadder": "자동 상승 사다리", 13 | "clienttweaks.configuration.tweaks.doNotUseLastTorch": "마지막 횃불 사용 안 함", 14 | "clienttweaks.configuration.tweaks.hideOffhandItem": "보조 손 아이템 숨기기", 15 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects": "자체 입자 효과 숨기기", 16 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon": "무기를 소지하지 않는 한 방패 숨기기", 17 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll": "보조 손 횃불을 쓸 수 없음", 18 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock": "블록으로 보조 손 횃불을 쓸 수 없음", 19 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand": "빈 손으로 보조 손 횃불을 쓸 수 없음", 20 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly": "도구만 있는 보조 손 횃불", 21 | "clienttweaks.configuration.tweaks.disableStepAssist": "자동 점프 사용 안 함", 22 | "clienttweaks.configuration.tweaks.masterVolumeSlider": "마스터 볼륨 슬라이더", 23 | "clienttweaks.configuration.tweaks.musicVolumeSlider": "음악 볼륨 슬라이더", 24 | "clienttweaks.configuration.customization": "사용자 정의", 25 | "clienttweaks.configuration.customization.torchItems": "횃불 아이템", 26 | "clienttweaks.configuration.customization.torchTools": "횃불 도구", 27 | "clienttweaks.configuration.customization.shieldWeapons": "방패 무기" 28 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/pt_br.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "Alternar o auxílio da etapa de desativação", 3 | "key.clienttweaks.disable_log_stripping": "Alternar a remoção do log", 4 | "key.clienttweaks.hide_offhand_item": "Alternar o itens de oculto", 5 | "key.categories.clienttweaks": "Ajustes do cliente", 6 | "chat.clienttweaks.on": "SOBRE", 7 | "chat.clienttweaks.off": "DESLIGADA", 8 | "chat.clienttweaks.lastTorch": "Fora das tochas", 9 | "clienttweaks.hideOffhandItem": "Ocultar item de ortografia: %s", 10 | "clienttweaks.disableStepAssist": "Desativar o auxílio da etapa: %s", 11 | "clienttweaks.disableLogStripping": "Desative a remoção de log: %s", 12 | "clienttweaks.configuration.title": "Ajustes do cliente", 13 | "clienttweaks.configuration.tweaks": "tweaks", 14 | "clienttweaks.configuration.tweaks.autoClimbLadder": "Escalada automática escada", 15 | "clienttweaks.configuration.tweaks.doNotUseLastTorch": "Não use a última tocha", 16 | "clienttweaks.configuration.tweaks.hideOffhandItem": "Ocultar item de ortografia", 17 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects": "Ocultar efeitos de partículas próprias", 18 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon": "Ocultar o escudo, a menos que segure a arma", 19 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll": "Sem tocha", 20 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock": "Sem tocha de mão com bloco", 21 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood": "Sem tocha de comida com comida", 22 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand": "Sem tocha de mão com mão vazia", 23 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly": "Tocha de mão com ferramenta apenas", 24 | "clienttweaks.configuration.tweaks.disableStepAssist": "Desativar o auxílio da etapa", 25 | "clienttweaks.configuration.tweaks.disableLogStripping": "Desative a remoção de log", 26 | "clienttweaks.configuration.tweaks.masterVolumeSlider": "Slider de volume mestre", 27 | "clienttweaks.configuration.tweaks.musicVolumeSlider": "Slider de volume de música", 28 | "clienttweaks.configuration.tweaks.paneBuildingSupport": "Suporte de construção de painel", 29 | "clienttweaks.configuration.tweaks.noRecipeBookShifting": "Sem mudança de livro de receitas", 30 | "clienttweaks.configuration.customization": "Costumização", 31 | "clienttweaks.configuration.customization.torchItems": "Itens da tocha", 32 | "clienttweaks.configuration.customization.torchTools": "Ferramentas de tocha", 33 | "clienttweaks.configuration.customization.shieldWeapons": "Armas de escudo", 34 | "clienttweaks.configuration.customization.shieldItems": "Itens de blindagem" 35 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/ru_ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "Отключить пошаговую помощь", 3 | "key.clienttweaks.disable_log_stripping": "Включить зачистку журнала", 4 | "key.clienttweaks.hide_offhand_item": "Переключить скрытие предмета для второй руки", 5 | "key.categories.clienttweaks": "Клиентские хитрости", 6 | "chat.clienttweaks.on": "Вкл", 7 | "chat.clienttweaks.off": "Выкл", 8 | "chat.clienttweaks.lastTorch": "Нет факелов", 9 | "clienttweaks.hideOffhandItem": "Скрыть предмет для второй руки: %s", 10 | "clienttweaks.disableStepAssist": "Отключить пошаговую помощь: %s", 11 | "clienttweaks.disableLogStripping": "Отключить зачистку журнала: %s", 12 | "clienttweaks.configuration.title": "Клиентские хитрости", 13 | "clienttweaks.configuration.tweaks": "Хитрости", 14 | "clienttweaks.configuration.tweaks.autoClimbLadder": "Автоматический подъём по лестнице", 15 | "clienttweaks.configuration.tweaks.autoClimbLadder.tooltip": "Эта опция позволит вам автоматически подниматься по лестницам, просто глядя вверх, вместо того, чтобы удерживать нажатой клавишу.", 16 | "clienttweaks.configuration.tweaks.doNotUseLastTorch": "Не использовать последний факел", 17 | "clienttweaks.configuration.tweaks.doNotUseLastTorch.tooltip": "Это предотвращает размещение последнего факела во второй руке.", 18 | "clienttweaks.configuration.tweaks.hideOffhandItem": "Скрыть предмет во второй руке", 19 | "clienttweaks.configuration.tweaks.hideOffhandItem.tooltip": "Эта опция скроет ваш предмет во второй руке. Её можно переключить с помощью дополнительной привязки клавиш.", 20 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects": "Скрыть собственные эффекты частиц", 21 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects.tooltip": "Эта опция скроет ваши собственные эффекты частиц зелий для вас (другие игроки все равно их увидят).", 22 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon": "Скрыть щит, если у вас нет оружия", 23 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon.tooltip": "Эта опция скроет ваш щит, если вы не держите оружие.", 24 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll": "Запрет размещения факелов вообще", 25 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll.tooltip": "Предотвращает размещение факелов из вашей второй руки вообще.", 26 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock": "Запрет размещения факелов с блоком в руке", 27 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock.tooltip": "Это предотвращает размещение факелов из второй руки, если у вас в ведущей руке есть блок.", 28 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood": "Запрет размещения факелов с едой в руке", 29 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood.tooltip": "Это предотвращает размещение факелов из второй руки, если у вас в ведущей руке есть еда.", 30 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand": "Запрет размещения факелов с пустой ведущей рукой", 31 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand.tooltip": "Это предотвращает размещение факелов из второй руки, если у вас пустая ведущая рука.", 32 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly": "Размещение факела только с инструментом в ведущей руке.", 33 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly.tooltip": "Этот параметр разрешает размещение факелов из второй руки только тогда, когда вы держите инструмент в ведущей руке.", 34 | "clienttweaks.configuration.tweaks.disableStepAssist": "Отключить пошаговую помощь", 35 | "clienttweaks.configuration.tweaks.disableStepAssist.tooltip": "Эта опция отключит пошаговую помощь, добавленную другими модами.", 36 | "clienttweaks.configuration.tweaks.disableLogStripping": "Отключить зачистку журнала", 37 | "clienttweaks.configuration.tweaks.disableLogStripping.tooltip": "Эта опция отключит зачистку журнала.", 38 | "clienttweaks.configuration.tweaks.masterVolumeSlider": "Ползунок общей громкости", 39 | "clienttweaks.configuration.tweaks.masterVolumeSlider.tooltip": "Это вернет ползунок общей громкости на экран параметров. Сэкономит вам один клик!", 40 | "clienttweaks.configuration.tweaks.musicVolumeSlider": "Ползунок громкости музыки", 41 | "clienttweaks.configuration.tweaks.musicVolumeSlider.tooltip": "Это вернет ползунок громкости музыки на экран параметров. Сэкономит вам клик!", 42 | "clienttweaks.configuration.tweaks.paneBuildingSupport": "Помощь с размещением панелей", 43 | "clienttweaks.configuration.tweaks.paneBuildingSupport.tooltip": "Эта опция увеличит хитбокс железных заборов и стеклянных панелей, что облегчит их размещение.", 44 | "clienttweaks.configuration.tweaks.chainBuildingSupport": "Помощь с размещением цепей", 45 | "clienttweaks.configuration.tweaks.chainBuildingSupport.tooltip": "Эта опция увеличит хитбокс цепей, что облегчит их размещение.", 46 | "clienttweaks.configuration.tweaks.noRecipeBookShifting": "Книга рецептов не сдвигает инвентарь", 47 | "clienttweaks.configuration.tweaks.noRecipeBookShifting.tooltip": "Эта опция заставляет книгу рецептов не сдвигать инвентарь при открытии. Лучше всего работает с меньшим масштабом графического интерфейса / большим разрешением.", 48 | "clienttweaks.configuration.customization": "Настройка", 49 | "clienttweaks.configuration.customization.torchItems": "Предметы-факела", 50 | "clienttweaks.configuration.customization.torchItems.tooltip": "Предметы, которые считаются факелами для настроек работы факела.", 51 | "clienttweaks.configuration.customization.torchTools": "Факела с инструментами", 52 | "clienttweaks.configuration.customization.torchTools.tooltip": "Предметы, с которыми разрешено размещать факелы из второй руки, если включено размещение только с инструментом.", 53 | "clienttweaks.configuration.customization.shieldWeapons": "Щиты с оружиями", 54 | "clienttweaks.configuration.customization.shieldWeapons.tooltip": "Предметы, которые считаются оружием для настроек скрытия щита.", 55 | "clienttweaks.configuration.customization.shieldItems": "Предметы-щиты", 56 | "clienttweaks.configuration.customization.shieldItems.tooltip": "Предметы, которые считаются щитами для опций скрытия щита." 57 | } 58 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/tr_tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "Adım Yardımını Kapat'ı Aç/Kapat", 3 | "key.clienttweaks.disable_log_stripping": "Kütük Soymayı Aç/Kapat", 4 | "key.clienttweaks.hide_offhand_item": "İkinci Eldeki Eşyayı Gizlemeyi Aç/Kapat", 5 | "key.categories.clienttweaks": "Client Tweaks", 6 | "chat.clienttweaks.on": "AÇIK", 7 | "chat.clienttweaks.off": "KAPALI", 8 | "chat.clienttweaks.lastTorch": "Meşale Kalmadı", 9 | "clienttweaks.hideOffhandItem": "İkincil Eldeki Eşyayı Gizle: %s", 10 | "clienttweaks.disableStepAssist": "Adım Yardımını Kapat: %s", 11 | "clienttweaks.disableLogStripping": "Kütük Soymayı Kapat: %s", 12 | "clienttweaks.configuration.title": "Client Tweaks (İstemci İnce Ayarları)", 13 | "clienttweaks.configuration.tweaks": "İnce Ayarlar", 14 | "clienttweaks.configuration.tweaks.autoClimbLadder": "Merdivenleri Otomatik Tırman", 15 | "clienttweaks.configuration.tweaks.doNotUseLastTorch": "Son Meşaleyi Kullanma", 16 | "clienttweaks.configuration.tweaks.hideOffhandItem": "İkincil Eldeki Eşyayı Gizle", 17 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects": "Kendi Parçaçık Etkilerimi Gizle", 18 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon": "Silah Tutulmuyorsa Kalkanı Gizle", 19 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll": "İkinci Elde Meşaleyi Hiç Kullanma", 20 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock": "İkinci Elde Meşaleyi Blok Varken Kullanma", 21 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood": "İkinci Elde Meşaleyi Yemek Varken Kullanma", 22 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand": "İkinci Elde Meşaleyi El Boşken Kullanma", 23 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly": "İkinci Elde Meşaleyi Sadece Araç İle Kullan", 24 | "clienttweaks.configuration.tweaks.disableStepAssist": "Adım Yardımını Kapat", 25 | "clienttweaks.configuration.tweaks.disableLogStripping": "Kütük Soymayı Kapat", 26 | "clienttweaks.configuration.tweaks.masterVolumeSlider": "Ana Ses Kaydırıcısı", 27 | "clienttweaks.configuration.tweaks.musicVolumeSlider": "Müzik Ses Kaydırıcısı", 28 | "clienttweaks.configuration.tweaks.paneBuildingSupport": "Levha İnşa Yardımı", 29 | "clienttweaks.configuration.tweaks.noRecipeBookShifting": "Tarif Kitabı Pencereyi Kaydırmasın", 30 | "clienttweaks.configuration.customization": "Özelleştirme", 31 | "clienttweaks.configuration.customization.torchItems": "Meşale Eşyaları", 32 | "clienttweaks.configuration.customization.torchTools": "Meşale Aletleri", 33 | "clienttweaks.configuration.customization.shieldWeapons": "Kalkan Silahları", 34 | "clienttweaks.configuration.customization.shieldItems": "Kalkan Eşyaları" 35 | } 36 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/clienttweaks/lang/zh_cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "key.clienttweaks.disable_step_assist": "切换台阶助手", 3 | "key.clienttweaks.disable_log_stripping": "切换原木去皮", 4 | "key.clienttweaks.hide_offhand_item": "切换隐藏副手物品", 5 | "key.categories.clienttweaks": "客户端微调", 6 | "chat.clienttweaks.on": "开", 7 | "chat.clienttweaks.off": "关", 8 | "chat.clienttweaks.lastTorch": "火把已用尽", 9 | "clienttweaks.hideOffhandItem": "隐藏副手物品: %s", 10 | "clienttweaks.disableStepAssist": "禁用台阶助手: %s", 11 | "clienttweaks.disableLogStripping": "禁用原木去皮: %s", 12 | "clienttweaks.configuration.title": "客户端微调", 13 | "clienttweaks.configuration.tweaks": "微调内容", 14 | "clienttweaks.configuration.tweaks.autoClimbLadder": "自动爬梯", 15 | "clienttweaks.configuration.tweaks.autoClimbLadder.tooltip": "爬梯时看向上方即可自动行进, 无需费力按键.", 16 | "clienttweaks.configuration.tweaks.doNotUseLastTorch": "保留最后一根火把", 17 | "clienttweaks.configuration.tweaks.doNotUseLastTorch.tooltip": "强制副手保留最后一根火把.", 18 | "clienttweaks.configuration.tweaks.hideOffhandItem": "隐藏副手物品", 19 | "clienttweaks.configuration.tweaks.hideOffhandItem.tooltip": "隐藏副手物品. 可通过热键开关.", 20 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects": "隐藏自身粒子效果", 21 | "clienttweaks.configuration.tweaks.hideOwnParticleEffects.tooltip": "在客户端侧隐藏粒子效果 (其他玩家仍然会看见).", 22 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon": "隐藏副手持盾", 23 | "clienttweaks.configuration.tweaks.hideShieldUnlessHoldingWeapon.tooltip": "仅在持有武器的情况下显示副手装备的盾.", 24 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll": "强制禁用副手放置火把", 25 | "clienttweaks.configuration.tweaks.noOffhandTorchAtAll.tooltip": "强制禁用副手放置火把的功能.", 26 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock": "手持方块时禁止副手放置火把", 27 | "clienttweaks.configuration.tweaks.noOffhandTorchWithBlock.tooltip": "在副手持有火把的情况下, 主手持有方块时优先放置方块.", 28 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood": "手持食物时禁止副手放置火把", 29 | "clienttweaks.configuration.tweaks.noOffhandTorchWithFood.tooltip": "在副手持有火把的情况下, 主手持有食物时优先消耗食物.", 30 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand": "空手禁止副手放置火把", 31 | "clienttweaks.configuration.tweaks.noOffhandTorchWithEmptyHand.tooltip": "主手为空时禁止副手放置火把.", 32 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly": "持有工具时允许火把放置", 33 | "clienttweaks.configuration.tweaks.offhandTorchWithToolOnly.tooltip": "在主手持有工具时允许副手放置火把.", 34 | "clienttweaks.configuration.tweaks.disableStepAssist": "禁用台阶助手", 35 | "clienttweaks.configuration.tweaks.disableStepAssist.tooltip": "禁用其他模组的台阶助手等相似功能.", 36 | "clienttweaks.configuration.tweaks.disableLogStripping": "禁用去皮", 37 | "clienttweaks.configuration.tweaks.disableLogStripping.tooltip": "禁用原木去皮的功能.", 38 | "clienttweaks.configuration.tweaks.masterVolumeSlider": "主音量滑条", 39 | "clienttweaks.configuration.tweaks.masterVolumeSlider.tooltip": "在选项界面添加音量滑条, 省去一次点击!", 40 | "clienttweaks.configuration.tweaks.musicVolumeSlider": "背景音滑条", 41 | "clienttweaks.configuration.tweaks.musicVolumeSlider.tooltip": "在选项界面添加背景音滑条, 省去一次点击!", 42 | "clienttweaks.configuration.tweaks.paneBuildingSupport": "玻璃板增强", 43 | "clienttweaks.configuration.tweaks.paneBuildingSupport.tooltip": "略微增加玻璃板的碰撞箱, 使其易于选中.", 44 | "clienttweaks.configuration.tweaks.chainBuildingSupport": "锁链增强", 45 | "clienttweaks.configuration.tweaks.chainBuildingSupport.tooltip": "略微增加锁链的碰撞箱, 使其易于选中.", 46 | "clienttweaks.configuration.tweaks.noRecipeBookShifting": "禁用配方书偏移", 47 | "clienttweaks.configuration.tweaks.noRecipeBookShifting.tooltip": "让配方书打开额外界面时不让主界面偏移. 与小比例/高分辨率界面搭配使用效果更佳.", 48 | "clienttweaks.configuration.customization": "自定义", 49 | "clienttweaks.configuration.customization.torchItems": "光源物品", 50 | "clienttweaks.configuration.customization.torchItems.tooltip": "放置在副手时视作持有火把的物品.", 51 | "clienttweaks.configuration.customization.torchTools": "允许火把放置的工具", 52 | "clienttweaks.configuration.customization.torchTools.tooltip": "启用“持有工具时允许火把放置”功能时主手能够持有的工具.", 53 | "clienttweaks.configuration.customization.shieldWeapons": "与盾搭配的武器", 54 | "clienttweaks.configuration.customization.shieldWeapons.tooltip": "“隐藏副手持盾”功能中视作武器的物品.", 55 | "clienttweaks.configuration.customization.shieldItems": "盾类物品", 56 | "clienttweaks.configuration.customization.shieldItems.tooltip": "“隐藏副手持盾”功能中视作盾的物品." 57 | } 58 | -------------------------------------------------------------------------------- /common/src/main/resources/clienttweaks.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "net.blay09.mods.clienttweaks.mixin", 5 | "refmap": "${mod_id}.refmap.json", 6 | "compatibilityLevel": "JAVA_17", 7 | "mixins": [ 8 | ], 9 | "client": [ 10 | "CrossCollisionBlockMixin", 11 | "BlockStateBaseMixin", 12 | "ChainBlockMixin", 13 | "RecipeBookComponentMixin", 14 | "AxeItemAccessor", 15 | "ShovelItemMixin", 16 | "ItemInHandRendererAccessor", 17 | "LivingEntityMixin", 18 | "LivingEntityAccessor" 19 | ], 20 | "injectors": { 21 | "defaultRequire": 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/resources/clienttweaks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TwelveIterationMods/ClientTweaks/4095ce9989812893931e0cde82da8c6e3252bda7/common/src/main/resources/clienttweaks.png -------------------------------------------------------------------------------- /common/src/main/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "description": "${mod_name}", 4 | "pack_format": ${pack_format_number} 5 | } 6 | } -------------------------------------------------------------------------------- /fabric/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'multiloader-loader' 3 | id 'fabric-loom' 4 | id 'net.darkhax.curseforgegradle' 5 | id "com.modrinth.minotaur" 6 | } 7 | 8 | dependencies { 9 | minecraft "com.mojang:minecraft:${minecraft_version}" 10 | mappings loom.layered { 11 | officialMojangMappings() 12 | parchment("org.parchmentmc.data:parchment-${parchment_minecraft}:${parchment_version}@zip") 13 | } 14 | modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" 15 | modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" 16 | } 17 | 18 | apply from: rootProject.file('repositories.gradle') 19 | apply from: 'dependencies.gradle' 20 | 21 | loom { 22 | def aw = project(":common").file("src/main/resources/${mod_id}.accesswidener") 23 | if (aw.exists()) { 24 | accessWidenerPath.set(aw) 25 | } 26 | 27 | mixin { 28 | defaultRefmapName.set("${mod_id}.refmap.json") 29 | } 30 | 31 | runs { 32 | client { 33 | client() 34 | setConfigName("fabric Client") 35 | ideConfigGenerated(true) 36 | runDir("runs/client") 37 | } 38 | server { 39 | server() 40 | setConfigName("fabric Server") 41 | ideConfigGenerated(true) 42 | runDir("runs/server") 43 | } 44 | data { 45 | inherit client 46 | setConfigName("fabric Data") 47 | ideConfigGenerated(true) 48 | runDir("build/datagen") 49 | 50 | vmArg "-Dfabric-api.datagen" 51 | vmArg "-Dfabric-api.datagen.output-dir=${project(":common").file("src/generated/resources")}" 52 | vmArg "-Dfabric-api.datagen.modid=${mod_id}" 53 | } 54 | } 55 | } 56 | 57 | task curseforge(type: net.darkhax.curseforgegradle.TaskPublishCurseForge) { 58 | dependsOn('build') 59 | description = 'Publishes the Fabric build to CurseForge.' 60 | group = 'publishing' 61 | 62 | apiToken = project.findProperty("curseforge.api_key") ?: System.getenv("CURSEFORGE_TOKEN") ?: "none" 63 | 64 | def projectId = findProperty("curseforge_project_id") 65 | onlyIf { 66 | projectId != null 67 | } 68 | if (projectId) { 69 | def mainFile = upload(findProperty("curseforge_project_id"), file("${project.buildDir}/libs/${archivesBaseName}-${version}.jar")) 70 | mainFile.changelog = rootProject.file('CHANGELOG.md').text 71 | mainFile.addRequirement("fabric-api") 72 | mainFile.addRequirement("balm") 73 | project.minecraft_versions.split(',').toList().each { mainFile.addGameVersion(it) } 74 | mainFile.releaseType = "release" 75 | } 76 | } 77 | 78 | modrinth { 79 | token = project.findProperty("modrinth.token") ?: System.getenv("MODRINTH_TOKEN") ?: "none" 80 | projectId = findProperty("modrinth_project_id") 81 | versionType = "release" 82 | versionNumber = project.version + "+fabric-" + project.minecraft_version 83 | uploadFile = remapJar 84 | changelog = rootProject.file("CHANGELOG.md").text 85 | gameVersions = project.minecraft_versions.split(',').toList() 86 | syncBodyFrom = rootProject.file("modpage.md").text 87 | loaders = ['fabric'] 88 | dependencies { 89 | required.project "fabric-api" 90 | required.project "balm" 91 | } 92 | } -------------------------------------------------------------------------------- /fabric/dependencies.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | modImplementation("net.blay09.mods:kuma-api-fabric:${kuma_version}") 3 | modImplementation("net.blay09.mods:balm-fabric:${balm_version}") { 4 | changing = balm_version.contains("SNAPSHOT") 5 | } 6 | modCompileOnly "com.terraformersmc:modmenu:$modmenu_version" 7 | } -------------------------------------------------------------------------------- /fabric/src/main/java/net/blay09/mods/clienttweaks/fabric/client/FabricClientTweaksClient.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks.fabric.client; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.EmptyLoadContext; 5 | import net.blay09.mods.balm.api.client.BalmClient; 6 | import net.blay09.mods.clienttweaks.ClientTweaks; 7 | import net.fabricmc.api.ClientModInitializer; 8 | 9 | public class FabricClientTweaksClient implements ClientModInitializer { 10 | 11 | @Override 12 | public void onInitializeClient() { 13 | Balm.initialize(ClientTweaks.MOD_ID, EmptyLoadContext.INSTANCE, ClientTweaks::initializeCommon); 14 | BalmClient.initialize(ClientTweaks.MOD_ID, EmptyLoadContext.INSTANCE, ClientTweaks::initializeClient); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fabric/src/main/resources/clienttweaks.fabric.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "net.blay09.mods.clienttweaks.fabric.mixin", 5 | "refmap": "${mod_id}.refmap.json", 6 | "compatibilityLevel": "JAVA_17", 7 | "mixins": [ 8 | ], 9 | "client": [ 10 | ], 11 | "injectors": { 12 | "defaultRequire": 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /fabric/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "${mod_id}", 4 | "version": "${version}", 5 | 6 | "name": "${mod_name}", 7 | "description": "${description}", 8 | "authors": [ 9 | "BlayTheNinth" 10 | ], 11 | "contact": { 12 | "homepage": "${homepage}", 13 | "sources": "${sources}", 14 | "issues": "${issues}" 15 | }, 16 | 17 | "license": "${license}", 18 | "icon": "${mod_id}.png", 19 | 20 | "environment": "*", 21 | "entrypoints": { 22 | "main": [ 23 | ], 24 | "client": [ 25 | "net.blay09.mods.clienttweaks.fabric.client.FabricClientTweaksClient" 26 | ] 27 | }, 28 | "mixins": [ 29 | "clienttweaks.mixins.json", 30 | "clienttweaks.fabric.mixins.json" 31 | ], 32 | 33 | "depends": { 34 | "fabricloader": ">=${fabric_loader_version}", 35 | "fabric-api": "*", 36 | "balm-fabric": "*", 37 | "minecraft": ">=${minimum_minecraft_version}", 38 | "java": ">=${java_version}" 39 | }, 40 | "suggests": { 41 | }, 42 | "custom": { 43 | "modmenu": { 44 | "links": { 45 | "modmenu.discord": "https://discord.gg/VAfZ2Nau6j" 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /forge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'multiloader-loader' 3 | id 'net.minecraftforge.gradle' version '[6.0.25,6.2)' 4 | id 'org.spongepowered.mixin' version '0.7-SNAPSHOT' 5 | id 'net.darkhax.curseforgegradle' 6 | id "com.modrinth.minotaur" 7 | } 8 | 9 | mixin { 10 | config("${mod_id}.mixins.json") 11 | config("${mod_id}.forge.mixins.json") 12 | } 13 | 14 | jar { 15 | manifest { 16 | attributes["MixinConfigs"] = "${mod_id}.mixins.json,${mod_id}.forge.mixins.json" 17 | } 18 | } 19 | 20 | minecraft { 21 | mappings channel: 'official', version: minecraft_version 22 | 23 | reobf = false 24 | 25 | copyIdeResources = true 26 | 27 | // Automatically enable forge AccessTransformers if the file exists 28 | def at = file('src/main/resources/META-INF/accesstransformer.cfg') 29 | if (at.exists()) { 30 | accessTransformer = at 31 | } 32 | 33 | runs { 34 | client { 35 | workingDirectory file('runs/client') 36 | ideaModule "${rootProject.name}.${project.name}.main" 37 | taskName "Client" 38 | 39 | property 'forge.enabledGameTestNamespaces', mod_id 40 | 41 | mods { 42 | modClientRun { 43 | source sourceSets.main 44 | } 45 | } 46 | } 47 | 48 | server { 49 | workingDirectory file('runs/server') 50 | ideaModule "${rootProject.name}.${project.name}.main" 51 | taskName "Server" 52 | 53 | property 'forge.enabledGameTestNamespaces', mod_id 54 | 55 | mods { 56 | modServerRun { 57 | source sourceSets.main 58 | } 59 | } 60 | } 61 | 62 | data { 63 | workingDirectory file('runs/data') 64 | ideaModule "${rootProject.name}.${project.name}.main" 65 | args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') 66 | taskName "Data" 67 | 68 | mods { 69 | modDataRun { 70 | source sourceSets.main 71 | } 72 | } 73 | } 74 | } 75 | } 76 | 77 | sourceSets.main.resources.srcDir 'src/generated/resources' 78 | 79 | dependencies { 80 | minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" 81 | annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" 82 | // temporary hacky fix as suggested by Forge 83 | implementation('net.sf.jopt-simple:jopt-simple:5.0.4') { version { strictly '5.0.4' } } 84 | } 85 | 86 | apply from: rootProject.file('repositories.gradle') 87 | apply from: 'dependencies.gradle' 88 | 89 | publishing { 90 | publications { 91 | mavenJava(MavenPublication) { 92 | fg.component(it) 93 | } 94 | } 95 | } 96 | 97 | task curseforge(type: net.darkhax.curseforgegradle.TaskPublishCurseForge) { 98 | dependsOn('build') 99 | description = 'Publishes the Forge build to CurseForge.' 100 | group = 'publishing' 101 | 102 | apiToken = project.findProperty("curseforge.api_key") ?: System.getenv("CURSEFORGE_TOKEN") ?: "none" 103 | 104 | def projectId = findProperty("curseforge_project_id") 105 | onlyIf { 106 | projectId != null 107 | } 108 | if (projectId) { 109 | def mainFile = upload(findProperty("curseforge_project_id"), file("${project.buildDir}/libs/${archivesBaseName}-${version}.jar")) 110 | mainFile.changelog = rootProject.file('CHANGELOG.md').text 111 | mainFile.addRequirement("balm") 112 | project.minecraft_versions.split(',').toList().each { mainFile.addGameVersion(it) } 113 | mainFile.releaseType = "release" 114 | } 115 | } 116 | 117 | modrinth { 118 | token = project.findProperty("modrinth.token") ?: System.getenv("MODRINTH_TOKEN") ?: "none" 119 | projectId = findProperty("modrinth_project_id") 120 | versionType = "release" 121 | versionNumber = project.version + "+forge-" + project.minecraft_version 122 | uploadFile = jar 123 | changelog = rootProject.file("CHANGELOG.md").text 124 | gameVersions = project.minecraft_versions.split(',').toList() 125 | syncBodyFrom = rootProject.file("modpage.md").text 126 | loaders = ['forge'] 127 | dependencies { 128 | required.project "balm" 129 | } 130 | } 131 | 132 | sourceSets.each { 133 | def dir = layout.buildDirectory.dir("sourcesSets/$it.name") 134 | it.output.resourcesDir = dir 135 | it.java.destinationDirectory = dir 136 | } -------------------------------------------------------------------------------- /forge/dependencies.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation("net.blay09.mods:kuma-api-forge:${kuma_version}") 3 | implementation("net.blay09.mods:balm-forge:${balm_version}") { 4 | changing = balm_version.contains("SNAPSHOT") 5 | } 6 | } -------------------------------------------------------------------------------- /forge/src/main/java/net/blay09/mods/clienttweaks/ForgeClientTweaks.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.client.BalmClient; 5 | import net.blay09.mods.balm.forge.ForgeLoadContext; 6 | import net.minecraftforge.fml.IExtensionPoint; 7 | import net.minecraftforge.fml.common.Mod; 8 | import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; 9 | import net.minecraftforge.fml.loading.FMLEnvironment; 10 | 11 | @Mod(ClientTweaks.MOD_ID) 12 | public class ForgeClientTweaks { 13 | 14 | public ForgeClientTweaks(FMLJavaModLoadingContext context) { 15 | final var loadContext = new ForgeLoadContext(context.getModEventBus()); 16 | if (FMLEnvironment.dist.isClient()) { 17 | Balm.initialize(ClientTweaks.MOD_ID, loadContext, ClientTweaks::initializeCommon); 18 | BalmClient.initialize(ClientTweaks.MOD_ID, loadContext, ClientTweaks::initializeClient); 19 | } 20 | 21 | context.registerDisplayTest(IExtensionPoint.DisplayTest.IGNORE_ALL_VERSION); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /forge/src/main/resources/META-INF/mods.toml: -------------------------------------------------------------------------------- 1 | modLoader="javafml" 2 | loaderVersion="${forge_loader_version_range}" 3 | license="${license}" 4 | issueTrackerURL="${issues}" 5 | [[mods]] 6 | modId="${mod_id}" 7 | version="${version}" 8 | displayName="${mod_name}" 9 | displayURL="${homepage}" 10 | logoFile="${mod_id}.png" 11 | credits="BlayTheNinth" 12 | authors="BlayTheNinth" 13 | description='''${description}''' 14 | [[dependencies.${mod_id}]] 15 | modId="forge" 16 | mandatory=true 17 | versionRange="${forge_version_range}" 18 | ordering="NONE" 19 | side="BOTH" 20 | [[dependencies.${mod_id}]] 21 | modId="minecraft" 22 | mandatory=true 23 | versionRange="${minecraft_version_range}" 24 | ordering="NONE" 25 | side="BOTH" 26 | [[dependencies.${mod_id}]] 27 | modId="balm" 28 | mandatory=true 29 | versionRange="${balm_version_range}" 30 | ordering="NONE" 31 | side="BOTH" 32 | -------------------------------------------------------------------------------- /forge/src/main/resources/clienttweaks.forge.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "net.blay09.mods.clienttweaks.forge.mixin", 5 | "compatibilityLevel": "JAVA_17", 6 | "mixins": [ 7 | ], 8 | "client": [ 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Mod 2 | mod_id = clienttweaks 3 | mod_name = Client Tweaks 4 | mod_author = BlayTheNinth 5 | credits = BlayTheNinth 6 | description=There, I fixed Minecraft for you. Various optional tweaks to improve Minecraft Quality of Life. 7 | version = 21.5.6 8 | group = net.blay09.mods 9 | homepage=https://mods.twelveiterations.com/mc/client-tweaks 10 | sources=https://github.com/TwelveIterationMods/ClientTweaks 11 | issues=https://github.com/TwelveIterationMods/ClientTweaks/issues 12 | discord = https://discord.gg/VAfZ2Nau6j 13 | license=All Rights Reserved 14 | 15 | # Publishing 16 | curseforge_project_id = 251407 17 | modrinth_project_id = vPNqo58Q 18 | maven_releases = https://maven.twelveiterations.com/repository/maven-releases/ 19 | maven_snapshots = https://maven.twelveiterations.com/repository/maven-snapshots/ 20 | 21 | # Minecraft 22 | minecraft_version = 1.21.5 23 | minecraft_versions = 1.21.5 24 | minecraft_version_range = [1.21.5,) 25 | java_version = 21 26 | pack_format_number = 71 27 | 28 | # Common 29 | neo_form_version = 1.21.5-20250325.162830 30 | parchment_minecraft = 1.21.4 31 | parchment_version = 2025.02.16 32 | 33 | # Balm 34 | balm_version = 21.5.5-SNAPSHOT 35 | balm_version_range = [21.5.0,) 36 | kuma_version = [21.5,21.6) 37 | 38 | # Forge 39 | forge_version = 55.0.3 40 | forge_version_range = [55,) 41 | forge_loader_version_range = [55,) 42 | 43 | # NeoForge 44 | neoforge_snapshot_url=https://prmaven.neoforged.net/NeoForge/pr2039 45 | neoforge_version = 21.5.0-beta 46 | neoforge_version_range = [21,) 47 | neoforge_loader_version_range = [1,) 48 | 49 | # Fabric 50 | fabric_version = 0.119.5+1.21.5 51 | fabric_loader_version = 0.16.10 52 | 53 | # Dependencies 54 | mixin_version=0.8.5 55 | modmenu_version=9.0.0 56 | 57 | # Gradle 58 | org.gradle.jvmargs=-Xmx3G 59 | org.gradle.daemon=false -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TwelveIterationMods/ClientTweaks/4095ce9989812893931e0cde82da8c6e3252bda7/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or 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 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MSYS* | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /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 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /modpage.md: -------------------------------------------------------------------------------- 1 | ![](https://blay09.net/files/brand/clienttweaks.png) 2 | 3 | [![](https://mods.twelveiterations.com/img/sponsor.png)](https://mods.twelveiterations.com/sponsor) 4 | 5 | Good news everyone, I've found the secrets to fixing your Minecraft experience. I've bundled them in this mod. 6 | 7 | This mod adds a bunch of optional tweaks to improve the Quality of Life during gameplay. Tweaks can be individually enabled or disabled and configured. Many of the tweaks are disabled by default, so make sure to enable the features you want for the most bestest experience possible. 8 | 9 |

10 | 11 | Requires Balm 12 | 13 | 14 | 15 | Join our Discord 16 | 17 |

18 | 19 | ## Features 20 | 21 | ### No Offhand Torch With Block 22 | This option will refuse to place a torch if you're holding a block in your main hand. Because there's no way you intended to place a torch in that case. Something was just standing in the way of the spot you wanted to place that block in but the torch was fitting since it's smaller. Fixed it for ya. 23 | 24 | ### No Offhand Torch With Empty Hand 25 | You know that feeling when you're tired, try to open the chest but misclicked the block next to it? And of course you still had a torch in your offhand. And of course it placed it. And now you have to break it again. Ugh. This option only allows torches to be placed when your main hand is not empty. This can be enabled additionally to the above. 26 | 27 | ### No Offhand Torch With Food 28 | This option prevents you from placing a torch from your offhand when you have food in your hand. 29 | 30 | ### No Offhand Torch At All 31 | This option completely disables placing torches from your offhand. Useful if you only carry a torch in your offhand for things like dynamic lighting. 32 | 33 | ### Offhand Torch With Tools Only 34 | This is the option I consider best, but it changes vanilla behaviour too much to be the default. This will only allow placing torches from the offhand when you're holding a tool. No more accidental torch placement, ever again. 35 | 36 | ### Do Not Use Last Torch 37 | This option is useful when using dynamic lights such as OptiFine. The last torch in your offhand will not be placeable, so you always have a light to carry around with you secured. 38 | 39 | ### No Offhand Fireworks with Elytra while Grounded 40 | This option prevents you from shooting fireworks when you're wearing an Elytra and not currently flying. 41 | 42 | ### Hide Own Effect Particles 43 | This option will make your own potion effect particles a lot less obtrusive for your client. Other players will see them normally. No more annoying particles blocking your view. 44 | 45 | ### Hide Offhand Item 46 | Will prevent the item in your offhand from rendering, in case you hate seeing the torch you're carrying on the left. This can be toggled by a keybind too, in case you only hate seeing your offhand item sometimes. 47 | 48 | ### Hide Shield Unless Holding Weapon 49 | Will prevent shields from being rendered in your offhand unless you're holding a weapon. Specifically, it needs to be a sword or an axe with an attack damage value greater than 1.5 hearts. No, that wooden stick you're holding isn't a weapon. 50 | 51 | ### Auto Climb Ladder 52 | I often make really long ladders down to my mine, and it's a pain having to hold down a key the whole time while climbing back up. With this tweak on, you will continue to climb upwards as long as you look upwards while on a ladder. That means you can type in chat and do other things without instantly falling back down and losing all of your progress on the long journey. 53 | 54 | ### Disable Potion Shift 55 | Prevents the inventory from being shifted to the right when potion effects are active. You probably never noticed because NEI did it in 1.7.10 and now Quark does it in 1.10.2 and then there's also a mod called No Potion Shift that does it, but in case you have none of these, you now have this! 56 | 57 | ### Toggle Log Stripping 58 | This option adds a keybind that lets you toggle the ability to strip logs. Useful when you build using wood and have an axe-like tool in your hand a lot to prevent accidental strippings. 59 | 60 | ### Toggle Off Step Assist 61 | There's people who hate step assist, but sometimes those step-assist granting items add some other cool perks that we want. So this option lets you disable the step-assist part only. With optional keybind to toggle. 62 | 63 | ### Master Volume Slider in Options Screen 64 | Yes, the new volume settings screen is cool. But couldn't you have kept the Master Volume slider on the main settings screen as well? After years of research I have concluded that you can, so I added it back. Saved you a click. 65 | 66 | ### Music Volume Slider in Options Screen 67 | Made up user studies have shown that the average player will much more frequently want to turn off the music than change the master volume, so our team of highly experienced quantum programmers have also brought the music slider back to the main settings screen 68 | 69 | ### Pane Building Support 70 | This option increases the hitbox of iron fences and glass panes when you're holding a matching block, making it easier to place them against each other. 71 | 72 | ### Chain Building Support 73 | This option increases the hitbox of chains when you're holding a chain block, making it easier to place them against each other. 74 | 75 | ### Creative Breaking Support 76 | This option will increase the hitbox of random-offset blocks in creative mode, making it easier to break them quickly. 77 | 78 | ### Prevent Accidental Mining 79 | This option will prevent the accidental mining of certain fragile blocks like budding amethysts. 80 | 81 | ![](https://blay09.net/files/brand/clienttweaks_settings.png) -------------------------------------------------------------------------------- /neoforge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'multiloader-loader' 3 | id 'net.neoforged.moddev' 4 | id 'net.darkhax.curseforgegradle' 5 | id "com.modrinth.minotaur" 6 | } 7 | 8 | base { 9 | archivesName = "${mod_id}-neoforge-${minecraft_version}" 10 | } 11 | 12 | neoForge { 13 | version = neoforge_version 14 | // Automatically enable neoforge AccessTransformers if the file exists 15 | def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg') 16 | if (at.exists()) { 17 | accessTransformers.from(at.absolutePath) 18 | } 19 | 20 | parchment { 21 | minecraftVersion = parchment_minecraft 22 | mappingsVersion = parchment_version 23 | } 24 | 25 | runs { 26 | configureEach { 27 | systemProperty('neoforge.enabledGameTestNamespaces', mod_id) 28 | ideName = "NeoForge ${it.name.capitalize()} (${project.path})" 29 | } 30 | 31 | client { 32 | client() 33 | } 34 | 35 | server { 36 | server() 37 | } 38 | } 39 | 40 | mods { 41 | "${mod_id}" { 42 | sourceSet sourceSets.main 43 | } 44 | } 45 | } 46 | 47 | sourceSets.main.resources { srcDir 'src/generated/resources' } 48 | 49 | apply from: rootProject.file('repositories.gradle') 50 | apply from: 'dependencies.gradle' 51 | 52 | task curseforge(type: net.darkhax.curseforgegradle.TaskPublishCurseForge) { 53 | dependsOn('build') 54 | description = 'Publishes the NeoForge build to CurseForge.' 55 | group = 'publishing' 56 | 57 | apiToken = project.findProperty("curseforge.api_key") ?: System.getenv("CURSEFORGE_TOKEN") ?: "none" 58 | 59 | def projectId = findProperty("curseforge_project_id") 60 | onlyIf { 61 | projectId != null 62 | } 63 | if (projectId) { 64 | def mainFile = upload(findProperty("curseforge_project_id"), file("${project.buildDir}/libs/${archivesBaseName}-${version}.jar")) 65 | mainFile.changelog = rootProject.file('CHANGELOG.md').text 66 | mainFile.addRequirement("balm") 67 | project.minecraft_versions.split(',').toList().each { mainFile.addGameVersion(it) } 68 | mainFile.releaseType = "release" 69 | mainFile.addModLoader("NeoForge") 70 | } 71 | } 72 | 73 | modrinth { 74 | token = project.findProperty("modrinth.token") ?: System.getenv("MODRINTH_TOKEN") ?: "none" 75 | projectId = findProperty("modrinth_project_id") 76 | versionType = "release" 77 | versionNumber = project.version + "+neoforge-" + project.minecraft_version 78 | uploadFile = jar 79 | changelog = rootProject.file("CHANGELOG.md").text 80 | gameVersions = project.minecraft_versions.split(',').toList() 81 | syncBodyFrom = rootProject.file("modpage.md").text 82 | loaders = ['neoforge'] 83 | dependencies { 84 | required.project "balm" 85 | } 86 | } 87 | 88 | configurations { 89 | // This is a workaround for issues with certain dependencies. It may not be necessary in your case. 90 | testCompileOnly.extendsFrom compileOnly 91 | } 92 | 93 | def neoForgeSnapshotUrl = findProperty("neoforge_snapshot_url") 94 | if (neoForgeSnapshotUrl != null) { 95 | repositories { 96 | maven { 97 | name 'Maven for NeoForge Snapshots' 98 | url neoForgeSnapshotUrl 99 | content { 100 | includeModule('net.neoforged', 'neoforge') 101 | includeModule('net.neoforged', 'testframework') 102 | } 103 | } 104 | } 105 | } -------------------------------------------------------------------------------- /neoforge/dependencies.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation("net.blay09.mods:kuma-api-neoforge:${kuma_version}") 3 | implementation("net.blay09.mods:balm-neoforge:${balm_version}") { 4 | changing = balm_version.contains("SNAPSHOT") 5 | } 6 | } -------------------------------------------------------------------------------- /neoforge/src/main/java/net/blay09/mods/clienttweaks/NeoForgeClientTweaks.java: -------------------------------------------------------------------------------- 1 | package net.blay09.mods.clienttweaks; 2 | 3 | import net.blay09.mods.balm.api.Balm; 4 | import net.blay09.mods.balm.api.client.BalmClient; 5 | import net.blay09.mods.balm.neoforge.NeoForgeLoadContext; 6 | import net.neoforged.api.distmarker.Dist; 7 | import net.neoforged.bus.api.IEventBus; 8 | import net.neoforged.fml.common.Mod; 9 | 10 | @Mod(value = ClientTweaks.MOD_ID, dist = Dist.CLIENT) 11 | public class NeoForgeClientTweaks { 12 | 13 | public NeoForgeClientTweaks(IEventBus modEventBus) { 14 | final var context = new NeoForgeLoadContext(modEventBus); 15 | Balm.initialize(ClientTweaks.MOD_ID, context, ClientTweaks::initializeCommon); 16 | BalmClient.initialize(ClientTweaks.MOD_ID, context, ClientTweaks::initializeClient); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader="javafml" 2 | loaderVersion="${neoforge_loader_version_range}" 3 | license="${license}" 4 | issueTrackerURL="${issues}" 5 | [[mods]] 6 | modId="${mod_id}" 7 | version="${version}" 8 | displayName="${mod_name}" 9 | displayURL="${homepage}" 10 | displayTest="NONE" 11 | logoFile="${mod_id}.png" 12 | credits="BlayTheNinth" 13 | authors="BlayTheNinth" 14 | description='''${description}''' 15 | [[mixins]] 16 | config = "${mod_id}.mixins.json" 17 | [[mixins]] 18 | config = "${mod_id}.neoforge.mixins.json" 19 | [[dependencies.${mod_id}]] 20 | modId="neoforge" 21 | type="required" 22 | versionRange="${neoforge_version_range}" 23 | ordering="NONE" 24 | side="BOTH" 25 | [[dependencies.${mod_id}]] 26 | modId="minecraft" 27 | type="required" 28 | versionRange="${minecraft_version_range}" 29 | ordering="NONE" 30 | side="BOTH" 31 | [[dependencies.${mod_id}]] 32 | modId="balm" 33 | type="required" 34 | versionRange="${balm_version_range}" 35 | ordering="NONE" 36 | side="BOTH" 37 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/clienttweaks.neoforge.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "net.blay09.mods.clienttweaks.neoforge.mixin", 5 | "compatibilityLevel": "JAVA_17", 6 | "mixins": [ 7 | ], 8 | "client": [ 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /repositories.gradle: -------------------------------------------------------------------------------- 1 | repositories { 2 | maven { 3 | url = "https://www.cursemaven.com" 4 | content { 5 | includeGroup 'curse.maven' 6 | } 7 | } 8 | 9 | maven { 10 | url = "https://maven.shedaniel.me/" 11 | content { 12 | includeGroup "me.shedaniel" 13 | includeGroup "me.shedaniel.cloth" 14 | includeGroup "dev.architectury" 15 | } 16 | } 17 | 18 | maven { 19 | url = "https://maven.blamejared.com" 20 | content { 21 | includeGroup "mezz.jei" 22 | } 23 | } 24 | 25 | maven { 26 | url = "https://maven.bai.lol" 27 | content { 28 | includeGroup "lol.bai" 29 | includeGroup "mcp.mobius.waila" 30 | } 31 | } 32 | 33 | maven { 34 | url = "https://maven.terraformersmc.com/releases" 35 | content { 36 | includeGroup "com.terraformersmc" 37 | includeGroup "dev.emi" 38 | } 39 | } 40 | 41 | maven { 42 | url = "https://jm.gserv.me/repository/maven-public/" 43 | content { 44 | includeGroup "info.journeymap" 45 | includeGroup "mysticdrew" 46 | } 47 | } 48 | 49 | maven { 50 | url = 'https://jitpack.io' 51 | content { 52 | includeGroup "com.github.BlueMap-Minecraft" 53 | includeGroup "com.github.mattidragon" 54 | } 55 | } 56 | 57 | maven { 58 | url = "https://repo.mikeprimm.com/" 59 | content { 60 | includeGroup "us.dynmap" 61 | } 62 | } 63 | 64 | maven { 65 | url = 'https://maven.ladysnake.org/releases' 66 | content { 67 | includeGroup "dev.onyxstudios.cardinal-components-api" 68 | includeGroup "org.ladysnake.cardinal-components-api" 69 | } 70 | } 71 | 72 | maven { 73 | url "https://maven.siphalor.de/" 74 | content { 75 | includeGroup "de.siphalor" 76 | } 77 | } 78 | 79 | maven { 80 | url = "https://maven.theillusivec4.top/" 81 | content { 82 | includeGroup "top.theillusivec4.curios" 83 | } 84 | } 85 | 86 | maven { 87 | url = "https://dl.cloudsmith.io/public/novamachina-mods/release/maven/" 88 | content { 89 | includeGroup "novamachina.novacore" 90 | includeGroup "novamachina.exnihilosequentia" 91 | } 92 | } 93 | 94 | exclusiveContent { 95 | forRepository { 96 | maven { 97 | name = 'Minecraft' 98 | url = 'https://libraries.minecraft.net/' 99 | } 100 | } 101 | filter { includeGroupAndSubgroups("com.mojang") } 102 | } 103 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | mavenCentral() 5 | exclusiveContent { 6 | forRepository { 7 | maven { 8 | name = 'Fabric' 9 | url = uri("https://maven.fabricmc.net") 10 | } 11 | } 12 | filter { 13 | includeGroup("net.fabricmc") 14 | includeGroup("fabric-loom") 15 | } 16 | } 17 | exclusiveContent { 18 | forRepository { 19 | maven { 20 | name = 'Sponge' 21 | url = uri('https://repo.spongepowered.org/repository/maven-public') 22 | } 23 | } 24 | filter { 25 | includeGroupAndSubgroups("org.spongepowered") 26 | } 27 | } 28 | exclusiveContent { 29 | forRepository { 30 | maven { 31 | name = 'Forge' 32 | url = uri("https://maven.minecraftforge.net") 33 | } 34 | } 35 | filter { 36 | includeGroupAndSubgroups("net.minecraftforge") 37 | } 38 | } 39 | } 40 | } 41 | 42 | plugins { 43 | id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' 44 | } 45 | 46 | include('common', 'fabric', 'forge', 'neoforge') 47 | --------------------------------------------------------------------------------