├── .github └── workflows │ └── build.yml ├── .gitignore ├── LICENSE.txt ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── src └── main │ ├── java │ └── re │ │ └── domi │ │ └── fastchest │ │ ├── FastChestTags.java │ │ ├── config │ │ ├── Config.java │ │ ├── ConfigScreen.java │ │ └── ModMenuImpl.java │ │ └── mixin │ │ ├── BlockEntityRenderDispatcherMixin.java │ │ ├── ChestBlockMixin.java │ │ └── EnderChestBlockMixin.java │ └── resources │ ├── assets │ ├── fastchest │ │ └── icon.png │ └── minecraft │ │ ├── atlases │ │ └── blocks.json │ │ ├── blockstates │ │ ├── chest.json │ │ ├── ender_chest.json │ │ └── trapped_chest.json │ │ └── models │ │ ├── block │ │ ├── chest.json │ │ ├── chest_left.json │ │ ├── chest_right.json │ │ ├── ender_chest.json │ │ ├── template_chest.json │ │ ├── template_chest_left.json │ │ ├── template_chest_right.json │ │ ├── trapped_chest.json │ │ ├── trapped_chest_left.json │ │ └── trapped_chest_right.json │ │ └── item │ │ ├── chest.json │ │ ├── ender_chest.json │ │ └── trapped_chest.json │ ├── data │ └── fastchest │ │ └── tags │ │ ├── block │ │ └── compatible_chests.json │ │ ├── block_entity_type │ │ └── compatible_chests.json │ │ └── blocks │ │ └── compatible_chests.json │ ├── fabric.mod.json │ └── fastchest.mixins.json └── style.xml /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # Automatically build the project and run any configured tests for every push 2 | # and submitted pull request. This can help catch issues that only occur on 3 | # certain platforms or Java versions, and provides a first line of defence 4 | # against bad commits. 5 | 6 | name: build 7 | on: [pull_request, push] 8 | 9 | jobs: 10 | build: 11 | strategy: 12 | matrix: 13 | # Use these Java versions 14 | java: [ 15 | 17, # Current Java LTS & minimum supported by Minecraft 16 | ] 17 | # and run on both Linux and Windows 18 | os: [ubuntu-22.04, windows-2022] 19 | runs-on: ${{ matrix.os }} 20 | steps: 21 | - name: checkout repository 22 | uses: actions/checkout@v3 23 | - name: validate gradle wrapper 24 | uses: gradle/wrapper-validation-action@v1 25 | - name: setup jdk ${{ matrix.java }} 26 | uses: actions/setup-java@v3 27 | with: 28 | java-version: ${{ matrix.java }} 29 | distribution: 'microsoft' 30 | - name: make gradle wrapper executable 31 | if: ${{ runner.os != 'Windows' }} 32 | run: chmod +x ./gradlew 33 | - name: build 34 | run: ./gradlew build 35 | - name: capture build artifacts 36 | if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS 37 | uses: actions/upload-artifact@v3 38 | with: 39 | name: Artifacts 40 | path: build/libs/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # gradle 2 | 3 | .gradle/ 4 | build/ 5 | out/ 6 | classes/ 7 | 8 | # eclipse 9 | 10 | *.launch 11 | 12 | # idea 13 | 14 | .idea/ 15 | *.iml 16 | *.ipr 17 | *.iws 18 | 19 | # vscode 20 | 21 | .settings/ 22 | .vscode/ 23 | bin/ 24 | .classpath 25 | .project 26 | 27 | # macos 28 | 29 | *.DS_Store 30 | 31 | # fabric 32 | 33 | run/ 34 | 35 | # java 36 | 37 | hs_err_*.log 38 | replay_*.log 39 | *.hprof 40 | *.jfr 41 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021-2023 Domi 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FastChest 2 | 3 | If your storage room contains a lot of chests, you have probably noticed how bad Minecraft is at rendering them. The more chests are placed, the lower your FPS go. 4 | 5 | FastChest helps by removing their dynamic models (aka BlockEntityRenderer) and making them render as static chunk geometry, like most normal blocks. (This means they will lose their lid opening animation! Check out [Enhanced Block Entities](https://modrinth.com/mod/ebe) if you care about that.) 6 | 7 | Depending on how many chests you have around, you'll see varying effectiveness. In large storage rooms this mod can easily double your FPS, but keep in mind that chests aren't the only thing responsible for bad performance. 8 | 9 | FastChest works with Sodium and Optifine and should be compatible with all other mods and resource packs that leave chests alone. For example, the *Vanilla Tweaks Proper Break Particles* resource pack doesn't. It overwrites the chest blockstate definitions and is not compatible out of the box. You can however delete `chest.json`, `ender_chest.json` and `trapped_chest.json` from the `/assets/minecraft/blockstates` directory of your resource pack to make it work with the mod. 10 | 11 | A classic (full-block) chest resource pack can be downloaded from [here](https://up.domi.re/pa1f7rxa). 12 | 13 | There's a Forge port by yGlobalista available on [CurseForge](https://www.curseforge.com/minecraft/mc-mods/fastchest-reforged) / [GitHub](https://github.com/globalista-dev/FastChest-Reforged). 14 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'fabric-loom' version '1.4-SNAPSHOT' 3 | id 'maven-publish' 4 | } 5 | 6 | version = project.mod_version 7 | group = project.maven_group 8 | 9 | base { 10 | archivesName = project.archives_base_name 11 | } 12 | 13 | repositories { 14 | // Add repositories to retrieve artifacts from in here. 15 | // You should only use this when depending on other mods because 16 | // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 17 | // See https://docs.gradle.org/current/userguide/declaring_repositories.html 18 | // for more information about repositories. 19 | maven { 20 | url = 'https://maven.terraformersmc.com/releases/' 21 | } 22 | } 23 | 24 | dependencies { 25 | // To change the versions see the gradle.properties file 26 | minecraft "com.mojang:minecraft:${project.minecraft_version}" 27 | mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" 28 | modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" 29 | 30 | // Fabric API. This is technically optional, but you probably want it anyway. 31 | modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" 32 | 33 | // Uncomment the following line to enable the deprecated Fabric API modules. 34 | // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. 35 | 36 | // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" 37 | 38 | modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}" 39 | } 40 | 41 | processResources { 42 | inputs.property "version", project.version 43 | 44 | filesMatching("fabric.mod.json") { 45 | expand "version": project.version 46 | } 47 | } 48 | 49 | tasks.withType(JavaCompile).configureEach { 50 | it.options.release = 17 51 | } 52 | 53 | java { 54 | // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task 55 | // if it is present. 56 | // If you remove this line, sources will not be generated. 57 | withSourcesJar() 58 | 59 | sourceCompatibility = JavaVersion.VERSION_17 60 | targetCompatibility = JavaVersion.VERSION_17 61 | } 62 | 63 | jar { 64 | from "LICENSE.txt" 65 | } 66 | 67 | // configure the maven publication 68 | publishing { 69 | publications { 70 | mavenJava(MavenPublication) { 71 | from components.java 72 | } 73 | } 74 | 75 | // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. 76 | repositories { 77 | // Add repositories to publish to here. 78 | // Notice: This block does NOT have the same function as the block in the top level. 79 | // The repositories here will be used for publishing your artifact, not for 80 | // retrieving dependencies. 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to gradle. 2 | org.gradle.jvmargs=-Xmx1G 3 | org.gradle.parallel=true 4 | 5 | # Fabric Properties 6 | # check these on https://fabricmc.net/develop 7 | minecraft_version=1.20.2 8 | yarn_mappings=1.20.2+build.4 9 | loader_version=0.14.24 10 | 11 | # Mod Properties 12 | mod_version=1.7+1.20.2 13 | maven_group=re.domi 14 | archives_base_name=fast-chest 15 | 16 | # Dependencies 17 | fabric_version=0.90.7+1.20.2 18 | mod_menu_version=8.0.0 19 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FakeDomi/FastChest/9a09c22d24d00f08217b5d59cbebfb2af6ec1cf2/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.3-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 87 | 88 | # Use the maximum available, or set MAX_FD != -1 to use that value. 89 | MAX_FD=maximum 90 | 91 | warn () { 92 | echo "$*" 93 | } >&2 94 | 95 | die () { 96 | echo 97 | echo "$*" 98 | echo 99 | exit 1 100 | } >&2 101 | 102 | # OS specific support (must be 'true' or 'false'). 103 | cygwin=false 104 | msys=false 105 | darwin=false 106 | nonstop=false 107 | case "$( uname )" in #( 108 | CYGWIN* ) cygwin=true ;; #( 109 | Darwin* ) darwin=true ;; #( 110 | MSYS* | MINGW* ) msys=true ;; #( 111 | NONSTOP* ) nonstop=true ;; 112 | esac 113 | 114 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 115 | 116 | 117 | # Determine the Java command to use to start the JVM. 118 | if [ -n "$JAVA_HOME" ] ; then 119 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 120 | # IBM's JDK on AIX uses strange locations for the executables 121 | JAVACMD=$JAVA_HOME/jre/sh/java 122 | else 123 | JAVACMD=$JAVA_HOME/bin/java 124 | fi 125 | if [ ! -x "$JAVACMD" ] ; then 126 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 127 | 128 | Please set the JAVA_HOME variable in your environment to match the 129 | location of your Java installation." 130 | fi 131 | else 132 | JAVACMD=java 133 | if ! command -v java >/dev/null 2>&1 134 | then 135 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 136 | 137 | Please set the JAVA_HOME variable in your environment to match the 138 | location of your Java installation." 139 | fi 140 | fi 141 | 142 | # Increase the maximum file descriptors if we can. 143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 144 | case $MAX_FD in #( 145 | max*) 146 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 147 | # shellcheck disable=SC3045 148 | MAX_FD=$( ulimit -H -n ) || 149 | warn "Could not query maximum file descriptor limit" 150 | esac 151 | case $MAX_FD in #( 152 | '' | soft) :;; #( 153 | *) 154 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 155 | # shellcheck disable=SC3045 156 | ulimit -n "$MAX_FD" || 157 | warn "Could not set maximum file descriptor limit to $MAX_FD" 158 | esac 159 | fi 160 | 161 | # Collect all arguments for the java command, stacking in reverse order: 162 | # * args from the command line 163 | # * the main class name 164 | # * -classpath 165 | # * -D...appname settings 166 | # * --module-path (only if needed) 167 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 168 | 169 | # For Cygwin or MSYS, switch paths to Windows format before running java 170 | if "$cygwin" || "$msys" ; then 171 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 172 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 173 | 174 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 175 | 176 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 177 | for arg do 178 | if 179 | case $arg in #( 180 | -*) false ;; # don't mess with options #( 181 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 182 | [ -e "$t" ] ;; #( 183 | *) false ;; 184 | esac 185 | then 186 | arg=$( cygpath --path --ignore --mixed "$arg" ) 187 | fi 188 | # Roll the args list around exactly as many times as the number of 189 | # args, so each arg winds up back in the position where it started, but 190 | # possibly modified. 191 | # 192 | # NB: a `for` loop captures its iteration list before it begins, so 193 | # changing the positional parameters here affects neither the number of 194 | # iterations, nor the values presented in `arg`. 195 | shift # remove old arg 196 | set -- "$@" "$arg" # push replacement arg 197 | done 198 | fi 199 | 200 | 201 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 202 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 203 | 204 | # Collect all arguments for the java command; 205 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 206 | # shell script including quotes and variable substitutions, so put them in 207 | # double quotes to make sure that they get re-expanded; and 208 | # * put everything else in single quotes, so that it's not re-expanded. 209 | 210 | set -- \ 211 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 212 | -classpath "$CLASSPATH" \ 213 | org.gradle.wrapper.GradleWrapperMain \ 214 | "$@" 215 | 216 | # Stop when "xargs" is not available. 217 | if ! command -v xargs >/dev/null 2>&1 218 | then 219 | die "xargs is not available" 220 | fi 221 | 222 | # Use "xargs" to parse quoted args. 223 | # 224 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 225 | # 226 | # In Bash we could simply go: 227 | # 228 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 229 | # set -- "${ARGS[@]}" "$@" 230 | # 231 | # but POSIX shell has neither arrays nor command substitution, so instead we 232 | # post-process each arg (as a line of input to sed) to backslash-escape any 233 | # character that might be a shell metacharacter, then use eval to reverse 234 | # that process (while maintaining the separation between arguments), and wrap 235 | # the whole thing up as a single "set" statement. 236 | # 237 | # This will of course break if any of these variables contains a newline or 238 | # an unmatched quote. 239 | # 240 | 241 | eval "set -- $( 242 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 243 | xargs -n1 | 244 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 245 | tr '\n' ' ' 246 | )" '"$@"' 247 | 248 | exec "$JAVACMD" "$@" 249 | -------------------------------------------------------------------------------- /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 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 48 | echo. 49 | echo Please set the JAVA_HOME variable in your environment to match the 50 | echo location of your Java installation. 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 62 | echo. 63 | echo Please set the JAVA_HOME variable in your environment to match the 64 | echo location of your Java installation. 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { 4 | name = 'Fabric' 5 | url = 'https://maven.fabricmc.net/' 6 | } 7 | mavenCentral() 8 | gradlePluginPortal() 9 | } 10 | } -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/FastChestTags.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.entity.BlockEntityType; 5 | import net.minecraft.registry.RegistryKeys; 6 | import net.minecraft.registry.tag.TagKey; 7 | import net.minecraft.util.Identifier; 8 | 9 | public class FastChestTags 10 | { 11 | public static final Identifier IDENTIFIER = Identifier.of("fastchest", "compatible_chests"); 12 | public static final TagKey> COMPATIBLE_CHEST_BLOCK_ENTITIES = TagKey.of(RegistryKeys.BLOCK_ENTITY_TYPE, IDENTIFIER); 13 | public static final TagKey COMPATIBLE_CHEST_BLOCKS = TagKey.of(RegistryKeys.BLOCK, IDENTIFIER); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/config/Config.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest.config; 2 | 3 | import net.fabricmc.loader.api.FabricLoader; 4 | 5 | import java.io.*; 6 | import java.util.Properties; 7 | 8 | public class Config 9 | { 10 | private static final File CONFIG_FILE = new File(FabricLoader.getInstance().getConfigDir().toFile(), "fast-chest.properties"); 11 | private static final String CONFIG_COMMENT = "FastChest config file"; 12 | private static final String SIMPLIFIED_CHEST = "simplifiedChest"; 13 | 14 | public static boolean simplifiedChest = true; 15 | 16 | private static void read() 17 | { 18 | try 19 | { 20 | if (CONFIG_FILE.createNewFile()) 21 | { 22 | write(); 23 | return; 24 | } 25 | 26 | FileInputStream configInputStream = new FileInputStream(CONFIG_FILE); 27 | 28 | Properties properties = new Properties(); 29 | properties.load(configInputStream); 30 | 31 | simplifiedChest = Boolean.toString(true).equals(properties.getProperty(SIMPLIFIED_CHEST)); 32 | } 33 | catch (IOException e) 34 | { 35 | e.printStackTrace(); 36 | } 37 | } 38 | 39 | static void write() 40 | { 41 | try 42 | { 43 | FileOutputStream outputStream = new FileOutputStream(CONFIG_FILE); 44 | 45 | Properties properties = new Properties(); 46 | properties.setProperty(SIMPLIFIED_CHEST, Boolean.toString(simplifiedChest)); 47 | properties.store(outputStream, CONFIG_COMMENT); 48 | } 49 | catch (IOException e) 50 | { 51 | e.printStackTrace(); 52 | } 53 | } 54 | 55 | static 56 | { 57 | read(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/config/ConfigScreen.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest.config; 2 | 3 | import net.fabricmc.fabric.impl.event.lifecycle.LoadedChunksCache; 4 | import net.minecraft.client.gui.DrawContext; 5 | import net.minecraft.client.gui.screen.Screen; 6 | import net.minecraft.client.gui.widget.ButtonWidget; 7 | import net.minecraft.screen.ScreenTexts; 8 | import net.minecraft.text.Text; 9 | import net.minecraft.world.chunk.WorldChunk; 10 | 11 | public class ConfigScreen extends Screen 12 | { 13 | private static final Text SCREEN_TITLE = Text.literal("FastChest config"); 14 | private static final Text SIMPLIFIED_ON = Text.literal("Simplified chest: ON"); 15 | private static final Text SIMPLIFIED_OFF = Text.literal("Simplified chest: OFF"); 16 | 17 | private final Screen parent; 18 | 19 | ConfigScreen(Screen parent) 20 | { 21 | super(SCREEN_TITLE); 22 | this.parent = parent; 23 | } 24 | 25 | @Override 26 | public void init() 27 | { 28 | this.addDrawableChild(new ButtonWidget.Builder( 29 | Config.simplifiedChest ? SIMPLIFIED_ON : SIMPLIFIED_OFF, 30 | button -> 31 | { 32 | Config.simplifiedChest = !Config.simplifiedChest; 33 | button.setMessage(Config.simplifiedChest ? SIMPLIFIED_ON : SIMPLIFIED_OFF); 34 | Config.write(); 35 | 36 | if (this.client != null) 37 | { 38 | this.client.worldRenderer.reload(); 39 | 40 | if (this.client.world != null) 41 | { 42 | //noinspection UnstableApiUsage 43 | ((LoadedChunksCache)this.client.world).fabric_getLoadedChunks().forEach(WorldChunk::updateAllBlockEntities); 44 | } 45 | } 46 | }) 47 | .dimensions(this.width / 2 - 100, 50, 200, 20) 48 | .build()); 49 | 50 | this.addDrawableChild(new ButtonWidget.Builder( 51 | ScreenTexts.DONE, 52 | button -> 53 | { 54 | if (this.client != null) 55 | { 56 | this.client.setScreen(this.parent); 57 | } 58 | }) 59 | .dimensions(this.width / 2 - 100, this.height - 50, 200, 20) 60 | .build()); 61 | } 62 | 63 | @Override 64 | public void close() 65 | { 66 | if (this.client != null) 67 | { 68 | this.client.setScreen(this.parent); 69 | } 70 | } 71 | 72 | @Override 73 | public void render(DrawContext context, int mouseX, int mouseY, float delta) 74 | { 75 | this.renderBackground(context, mouseX, mouseY, delta); 76 | context.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 5, 0xFFFFFF); 77 | super.render(context, mouseX, mouseY, delta); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/config/ModMenuImpl.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest.config; 2 | 3 | import com.terraformersmc.modmenu.api.ConfigScreenFactory; 4 | import com.terraformersmc.modmenu.api.ModMenuApi; 5 | 6 | public class ModMenuImpl implements ModMenuApi 7 | { 8 | @Override 9 | public ConfigScreenFactory getModConfigScreenFactory() 10 | { 11 | return ConfigScreen::new; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/mixin/BlockEntityRenderDispatcherMixin.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest.mixin; 2 | 3 | import net.minecraft.block.entity.BlockEntity; 4 | import net.minecraft.block.entity.ChestBlockEntity; 5 | import net.minecraft.block.entity.EnderChestBlockEntity; 6 | import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; 7 | import net.minecraft.client.render.block.entity.BlockEntityRenderer; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 12 | import re.domi.fastchest.FastChestTags; 13 | import re.domi.fastchest.config.Config; 14 | 15 | @Mixin(BlockEntityRenderDispatcher.class) 16 | public class BlockEntityRenderDispatcherMixin 17 | { 18 | @Inject(method = "get", at = @At("HEAD"), cancellable = true) 19 | private void removeBlockEntityRenderer(E blockEntity, CallbackInfoReturnable> cir) 20 | { 21 | if (Config.simplifiedChest) 22 | { 23 | if ((blockEntity instanceof ChestBlockEntity || blockEntity instanceof EnderChestBlockEntity) && blockEntity.getType().getRegistryEntry().isIn(FastChestTags.COMPATIBLE_CHEST_BLOCK_ENTITIES)) 24 | { 25 | cir.setReturnValue(null); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/mixin/ChestBlockMixin.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest.mixin; 2 | 3 | import net.minecraft.block.BlockRenderType; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.ChestBlock; 6 | import net.minecraft.block.entity.BlockEntity; 7 | import net.minecraft.block.entity.BlockEntityTicker; 8 | import net.minecraft.block.entity.BlockEntityType; 9 | import net.minecraft.registry.tag.BlockTags; 10 | import net.minecraft.world.World; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 15 | import re.domi.fastchest.FastChestTags; 16 | import re.domi.fastchest.config.Config; 17 | 18 | @Mixin(ChestBlock.class) 19 | public class ChestBlockMixin 20 | { 21 | @Inject(method = "getRenderType", at = @At("HEAD"), cancellable = true) 22 | private void replaceRenderType(BlockState state, CallbackInfoReturnable cir) 23 | { 24 | if (Config.simplifiedChest && state.isIn(FastChestTags.COMPATIBLE_CHEST_BLOCKS)) 25 | { 26 | cir.setReturnValue(BlockRenderType.MODEL); 27 | } 28 | } 29 | 30 | @Inject(method = "getTicker", at = @At("HEAD"), cancellable = true) 31 | private void removeTicker(World world, BlockState state, BlockEntityType type, CallbackInfoReturnable> cir) 32 | { 33 | if (Config.simplifiedChest && state.isIn(FastChestTags.COMPATIBLE_CHEST_BLOCKS)) 34 | { 35 | cir.setReturnValue(null); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/re/domi/fastchest/mixin/EnderChestBlockMixin.java: -------------------------------------------------------------------------------- 1 | package re.domi.fastchest.mixin; 2 | 3 | import net.minecraft.block.BlockRenderType; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.EnderChestBlock; 6 | import net.minecraft.block.entity.BlockEntity; 7 | import net.minecraft.block.entity.BlockEntityTicker; 8 | import net.minecraft.block.entity.BlockEntityType; 9 | import net.minecraft.world.World; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Inject; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 14 | import re.domi.fastchest.config.Config; 15 | 16 | @Mixin(EnderChestBlock.class) 17 | public class EnderChestBlockMixin 18 | { 19 | @Inject(method = "getRenderType", at = @At("HEAD"), cancellable = true) 20 | private void replaceRenderType(BlockState state, CallbackInfoReturnable cir) 21 | { 22 | if (Config.simplifiedChest) 23 | { 24 | cir.setReturnValue(BlockRenderType.MODEL); 25 | } 26 | } 27 | 28 | @Inject(method = "getTicker", at = @At("HEAD"), cancellable = true) 29 | private void removeTicker(World world, BlockState state, BlockEntityType type, CallbackInfoReturnable> cir) 30 | { 31 | if (Config.simplifiedChest) 32 | { 33 | cir.setReturnValue(null); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/resources/assets/fastchest/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FakeDomi/FastChest/9a09c22d24d00f08217b5d59cbebfb2af6ec1cf2/src/main/resources/assets/fastchest/icon.png -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/atlases/blocks.json: -------------------------------------------------------------------------------- 1 | { 2 | "sources": [ 3 | { 4 | "type": "directory", 5 | "source": "entity/chest", 6 | "prefix": "entity/chest/" 7 | } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/blockstates/chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=north,type=single": { 4 | "model": "minecraft:block/chest" 5 | }, 6 | "facing=east,type=single": { 7 | "model": "minecraft:block/chest", 8 | "y": 90 9 | }, 10 | "facing=south,type=single": { 11 | "model": "minecraft:block/chest", 12 | "y": 180 13 | }, 14 | "facing=west,type=single": { 15 | "model": "minecraft:block/chest", 16 | "y": 270 17 | }, 18 | "facing=north,type=left": { 19 | "model": "minecraft:block/chest_left" 20 | }, 21 | "facing=east,type=left": { 22 | "model": "minecraft:block/chest_left", 23 | "y": 90 24 | }, 25 | "facing=south,type=left": { 26 | "model": "minecraft:block/chest_left", 27 | "y": 180 28 | }, 29 | "facing=west,type=left": { 30 | "model": "minecraft:block/chest_left", 31 | "y": 270 32 | }, 33 | "facing=north,type=right": { 34 | "model": "minecraft:block/chest_right" 35 | }, 36 | "facing=east,type=right": { 37 | "model": "minecraft:block/chest_right", 38 | "y": 90 39 | }, 40 | "facing=south,type=right": { 41 | "model": "minecraft:block/chest_right", 42 | "y": 180 43 | }, 44 | "facing=west,type=right": { 45 | "model": "minecraft:block/chest_right", 46 | "y": 270 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/blockstates/ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=north": { 4 | "model": "minecraft:block/ender_chest" 5 | }, 6 | "facing=east": { 7 | "model": "minecraft:block/ender_chest", 8 | "y": 90 9 | }, 10 | "facing=south": { 11 | "model": "minecraft:block/ender_chest", 12 | "y": 180 13 | }, 14 | "facing=west": { 15 | "model": "minecraft:block/ender_chest", 16 | "y": 270 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/blockstates/trapped_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=north,type=single": { 4 | "model": "minecraft:block/trapped_chest" 5 | }, 6 | "facing=east,type=single": { 7 | "model": "minecraft:block/trapped_chest", 8 | "y": 90 9 | }, 10 | "facing=south,type=single": { 11 | "model": "minecraft:block/trapped_chest", 12 | "y": 180 13 | }, 14 | "facing=west,type=single": { 15 | "model": "minecraft:block/trapped_chest", 16 | "y": 270 17 | }, 18 | "facing=north,type=left": { 19 | "model": "minecraft:block/trapped_chest_left" 20 | }, 21 | "facing=east,type=left": { 22 | "model": "minecraft:block/trapped_chest_left", 23 | "y": 90 24 | }, 25 | "facing=south,type=left": { 26 | "model": "minecraft:block/trapped_chest_left", 27 | "y": 180 28 | }, 29 | "facing=west,type=left": { 30 | "model": "minecraft:block/trapped_chest_left", 31 | "y": 270 32 | }, 33 | "facing=north,type=right": { 34 | "model": "minecraft:block/trapped_chest_right" 35 | }, 36 | "facing=east,type=right": { 37 | "model": "minecraft:block/trapped_chest_right", 38 | "y": 90 39 | }, 40 | "facing=south,type=right": { 41 | "model": "minecraft:block/trapped_chest_right", 42 | "y": 180 43 | }, 44 | "facing=west,type=right": { 45 | "model": "minecraft:block/trapped_chest_right", 46 | "y": 270 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest", 3 | "textures": { 4 | "particle": "minecraft:block/oak_planks", 5 | "chest": "minecraft:entity/chest/normal" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/chest_left.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest_left", 3 | "textures": { 4 | "particle": "minecraft:block/oak_planks", 5 | "chest": "minecraft:entity/chest/normal_left" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/chest_right.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest_right", 3 | "textures": { 4 | "particle": "minecraft:block/oak_planks", 5 | "chest": "minecraft:entity/chest/normal_right" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest", 3 | "textures": { 4 | "particle": "minecraft:block/obsidian", 5 | "chest": "minecraft:entity/chest/ender" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/template_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/block", 3 | "textures": { 4 | "particle": "#particles" 5 | }, 6 | "elements": [ 7 | { 8 | "from": [ 1, 0, 1 ], 9 | "to": [ 15, 10, 15 ], 10 | "faces": { 11 | "down": { "texture": "#chest", "uv": [ 3.5, 4.75, 7, 8.25 ], "rotation": 180 }, 12 | "north": { "texture": "#chest", "uv": [ 10.5, 8.25, 14, 10.75 ], "rotation": 180 }, 13 | "east": { "texture": "#chest", "uv": [ 0, 8.25, 3.5, 10.75 ], "rotation": 180 }, 14 | "south": { "texture": "#chest", "uv": [ 3.5, 8.25, 7, 10.75 ], "rotation": 180 }, 15 | "west": { "texture": "#chest", "uv": [ 7, 8.25, 10.5, 10.75 ], "rotation": 180 } 16 | } 17 | }, 18 | { 19 | "from": [ 1, 10, 1 ], 20 | "to": [ 15, 14, 15 ], 21 | "faces": { 22 | "up": { "texture": "#chest", "uv": [ 10.5, 0, 7, 3.5 ] }, 23 | "north": { "texture": "#chest", "uv": [ 10.5, 3.75, 14, 4.75 ], "rotation": 180 }, 24 | "east": { "texture": "#chest", "uv": [ 0, 3.75, 3.5, 4.75 ], "rotation": 180 }, 25 | "south": { "texture": "#chest", "uv": [ 3.5, 3.75, 7, 4.75 ], "rotation": 180 }, 26 | "west": { "texture": "#chest", "uv": [ 7, 3.75, 10.5, 4.75 ], "rotation": 180 } 27 | } 28 | }, 29 | { 30 | "from": [ 7, 7, 0 ], 31 | "to": [ 9, 11, 1], 32 | "faces": { 33 | "down": { "texture": "#chest", "uv": [ 0.25, 0, 0.75, 0.25 ], "rotation": 180 }, 34 | "up": { "texture": "#chest", "uv": [ 0.75, 0, 1.25, 0.25 ], "rotation": 180 }, 35 | "north": { "texture": "#chest", "uv": [ 1, 0.25, 1.5, 1.25 ], "rotation": 180 }, 36 | "west": { "texture": "#chest", "uv": [ 0.75, 0.25, 1, 1.25 ], "rotation": 180 }, 37 | "east": { "texture": "#chest", "uv": [ 0, 0.25, 0.25, 1.25 ], "rotation": 180 } 38 | } 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/template_chest_left.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/block", 3 | "textures": { 4 | "particle": "#particles" 5 | }, 6 | "elements": [ 7 | { 8 | "from": [ 1, 0, 1 ], 9 | "to": [ 16, 10, 15 ], 10 | "faces": { 11 | "down": { "texture": "#chest", "uv": [ 3.5, 4.75, 7.25, 8.25 ], "rotation": 180 }, 12 | "north": { "texture": "#chest", "uv": [ 10.75, 8.25, 14.5, 10.75 ], "rotation": 180 }, 13 | "south": { "texture": "#chest", "uv": [ 3.5, 8.25, 7.25, 10.75 ], "rotation": 180 }, 14 | "west": { "texture": "#chest", "uv": [ 7.25, 8.25, 10.75, 10.75 ], "rotation": 180 } 15 | } 16 | }, 17 | { 18 | "from": [ 1, 10, 1 ], 19 | "to": [ 16, 14, 15 ], 20 | "faces": { 21 | "up": { "texture": "#chest", "uv": [ 11, 0, 7.25, 3.5 ] }, 22 | "north": { "texture": "#chest", "uv": [ 10.75, 3.75, 14.5, 4.75 ], "rotation": 180 }, 23 | "south": { "texture": "#chest", "uv": [ 3.5, 3.75, 7.25, 4.75 ], "rotation": 180 }, 24 | "west": { "texture": "#chest", "uv": [ 7.25, 3.75, 10.75, 4.75 ], "rotation": 180 } 25 | } 26 | }, 27 | { 28 | "from": [ 15, 7, 0 ], 29 | "to": [ 16, 11, 1], 30 | "faces": { 31 | "down": { "texture": "#chest", "uv": [ 0.25, 0, 0.5, 0.25 ], "rotation": 180 }, 32 | "up": { "texture": "#chest", "uv": [ 0.5, 0, 0.75, 0.25 ], "rotation": 180 }, 33 | "north": { "texture": "#chest", "uv": [ 0.75, 0.25, 1, 1.25 ], "rotation": 180 }, 34 | "west": { "texture": "#chest", "uv": [ 0.5, 0.25, 0.75, 1.25 ], "rotation": 180 } 35 | } 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/template_chest_right.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/block", 3 | "textures": { 4 | "particle": "#particles" 5 | }, 6 | "elements": [ 7 | { 8 | "from": [ 0, 0, 1 ], 9 | "to": [ 15, 10, 15 ], 10 | "faces": { 11 | "down": { "texture": "#chest", "uv": [ 3.5, 4.75, 7.25, 8.25 ], "rotation": 180 }, 12 | "north": { "texture": "#chest", "uv": [ 10.75, 8.25, 14.5, 10.75 ], "rotation": 180 }, 13 | "east": { "texture": "#chest", "uv": [ 0, 8.25, 3.5, 10.75 ], "rotation": 180 }, 14 | "south": { "texture": "#chest", "uv": [ 3.5, 8.25, 7.25, 10.75 ], "rotation": 180 } 15 | } 16 | }, 17 | { 18 | "from": [ 0, 10, 1 ], 19 | "to": [ 15, 14, 15 ], 20 | "faces": { 21 | "up": { "texture": "#chest", "uv": [ 11, 0, 7.25, 3.5 ] }, 22 | "north": { "texture": "#chest", "uv": [ 10.75, 3.75, 14.5, 4.75 ], "rotation": 180 }, 23 | "east": { "texture": "#chest", "uv": [ 0, 3.75, 3.5, 4.75 ], "rotation": 180 }, 24 | "south": { "texture": "#chest", "uv": [ 3.5, 3.75, 7.25, 4.75 ], "rotation": 180 } 25 | } 26 | }, 27 | { 28 | "from": [ 0, 7, 0 ], 29 | "to": [ 1, 11, 1], 30 | "faces": { 31 | "down": { "texture": "#chest", "uv": [ 0.25, 0, 0.5, 0.25 ], "rotation": 180 }, 32 | "up": { "texture": "#chest", "uv": [ 0.5, 0, 0.75, 0.25 ], "rotation": 180 }, 33 | "north": { "texture": "#chest", "uv": [ 0.75, 0.25, 1, 1.25 ], "rotation": 180 }, 34 | "east": { "texture": "#chest", "uv": [ 0.0, 0.25, 0.25, 1.25 ], "rotation": 180 } 35 | } 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/trapped_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest", 3 | "textures": { 4 | "particle": "minecraft:block/oak_planks", 5 | "chest": "minecraft:entity/chest/trapped" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/trapped_chest_left.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest_left", 3 | "textures": { 4 | "particle": "minecraft:block/oak_planks", 5 | "chest": "minecraft:entity/chest/trapped_left" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/block/trapped_chest_right.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/template_chest_right", 3 | "textures": { 4 | "particle": "minecraft:block/oak_planks", 5 | "chest": "minecraft:entity/chest/trapped_right" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/item/chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:block/chest" 3 | } 4 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/item/ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:block/ender_chest" 3 | } 4 | -------------------------------------------------------------------------------- /src/main/resources/assets/minecraft/models/item/trapped_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:block/trapped_chest" 3 | } 4 | -------------------------------------------------------------------------------- /src/main/resources/data/fastchest/tags/block/compatible_chests.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:chest", 5 | "minecraft:ender_chest", 6 | "minecraft:trapped_chest", 7 | { "id": "ironchest:christmas_chest", "required": false }, 8 | { "id": "ironchest:copper_chest", "required": false }, 9 | { "id": "ironchest:diamond_chest", "required": false }, 10 | { "id": "ironchest:emerald_chest", "required": false }, 11 | { "id": "ironchest:gold_chest", "required": false }, 12 | { "id": "ironchest:iron_chest", "required": false }, 13 | { "id": "ironchest:netherite_chest", "required": false }, 14 | { "id": "ironchest:obsidian_chest", "required": false } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /src/main/resources/data/fastchest/tags/block_entity_type/compatible_chests.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:chest", 5 | "minecraft:ender_chest", 6 | "minecraft:trapped_chest", 7 | { "id": "ironchest:christmas_chest", "required": false }, 8 | { "id": "ironchest:copper_chest", "required": false }, 9 | { "id": "ironchest:diamond_chest", "required": false }, 10 | { "id": "ironchest:emerald_chest", "required": false }, 11 | { "id": "ironchest:gold_chest", "required": false }, 12 | { "id": "ironchest:iron_chest", "required": false }, 13 | { "id": "ironchest:netherite_chest", "required": false }, 14 | { "id": "ironchest:obsidian_chest", "required": false } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /src/main/resources/data/fastchest/tags/blocks/compatible_chests.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:chest", 5 | "minecraft:ender_chest", 6 | "minecraft:trapped_chest", 7 | { "id": "ironchest:christmas_chest", "required": false }, 8 | { "id": "ironchest:copper_chest", "required": false }, 9 | { "id": "ironchest:diamond_chest", "required": false }, 10 | { "id": "ironchest:emerald_chest", "required": false }, 11 | { "id": "ironchest:gold_chest", "required": false }, 12 | { "id": "ironchest:iron_chest", "required": false }, 13 | { "id": "ironchest:netherite_chest", "required": false }, 14 | { "id": "ironchest:obsidian_chest", "required": false } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "fastchest", 4 | "version": "${version}", 5 | 6 | "name": "FastChest", 7 | "description": "Makes chests use static block models for improved performance.", 8 | "authors": [ 9 | "Domi" 10 | ], 11 | "contact": { 12 | "homepage": "https://domi.re/mc-mods/fastchest", 13 | "sources": "https://github.com/FakeDomi/FastChest", 14 | "issues": "https://github.com/FakeDomi/FastChest/issues" 15 | }, 16 | 17 | "license": "MIT", 18 | "icon": "assets/fastchest/icon.png", 19 | 20 | "environment": "client", 21 | "entrypoints": { 22 | "modmenu": [ 23 | "re.domi.fastchest.config.ModMenuImpl" 24 | ] 25 | }, 26 | "mixins": [ 27 | "fastchest.mixins.json" 28 | ], 29 | 30 | "depends": { 31 | "fabricloader": ">=0.9.0", 32 | "fabric": "*", 33 | "minecraft": ">=1.20.2" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/resources/fastchest.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "re.domi.fastchest.mixin", 4 | "compatibilityLevel": "JAVA_17", 5 | "client": [ 6 | "BlockEntityRenderDispatcherMixin", 7 | "ChestBlockMixin", 8 | "EnderChestBlockMixin" 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | --------------------------------------------------------------------------------